Plugin Directory

Changeset 1996019


Ignore:
Timestamp:
12/16/2018 10:53:13 PM (7 years ago)
Author:
gtanyware
Message:

Version 2.1.7; all UI components can now be created programmatically

Location:
easycoder/trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • easycoder/trunk/easycoder-min.js

    r1990067 r1996019  
    99$jscomp.polyfill("Array.prototype.includes",function(d){return d?d:function(d,f){var e=this;e instanceof String&&(e=String(e));var b=e.length;f=f||0;for(0>f&&(f=Math.max(f+b,0));f<b;f++){var a=e[f];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,f){return-1!==$jscomp.checkStringArgs(this,d,"includes").indexOf(d,f||0)}},"es6","es3");
    1010$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 f=Math.floor(Math.abs(d));return 0>d?-f:f}},"es6","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");$jscomp.polyfill("Number.isInteger",function(d){return d?d:function(d){return Number.isFinite(d)?d===Math.floor(d):!1}},"es6","es3");
    11 (function(){function d(g,f,e){function b(c,h){if(!f[c]){if(!g[c]){var m="function"==typeof require&&require;if(!h&&m)return m(c,!0);if(a)return a(c,!0);h=Error("Cannot find module '"+c+"'");throw h.code="MODULE_NOT_FOUND",h;}h=f[c]={exports:{}};g[c][0].call(h.exports,function(a){return b(g[c][1][a]||a)},h,h.exports,d,g,f,e)}return f[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,g,f){var e=d("./easycoder/Main");console.log("Starting up EasyCoder...");
    12 window.onload=function(){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,g,f){g.exports=function(d,b,a){b=d.value.evaluate(d,b);a=d.value.evaluate(d,a);b.numeric!==a.numeric&&d.runtimeError(d[d.pc].lino,"Data type mismatch");d=b.content;a=a.content;return d>a?1:d<a?-1:0}},{}],3:[function(d,g,f){var e=Object.assign||function(a){for(var c=1;c<arguments.length;c++){var b=
    13 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)},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},getToken:function(){return b.index>=
    14 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?!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},
    15 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(){return a.getTarget()in b.symbols},nextIsSymbol:function(){a.next();return a.isSymbol()},getSymbol:function(){return b.symbols[a.getToken()]},getSymbolPc:function(){return a.getSymbol().pc},getSymbolRecord:function(){return b.program[a.getSymbolPc()]},getSymbols:function(){return b.symbols},getProgram:function(){return b.program},getPc:function(){return b.program.length},
    16 getValue:function(){return a.value.compile(a)},getNextValue:function(){a.next();return a.getValue()},getCondition:function(){return a.condition.compile(a)},constant:function(c,b){return a.value.constant(c,void 0===b?!1:b)},addCommand:function(a){b.program.push(e({pc:b.program.length},a))},addSymbol:function(a,m){b.symbols[a]={pc:m}},mark:function(){b.savedMark=b.index},rewind:function(){b.index=b.savedMark},compileVariable:function(c,m,h,d){h=void 0===h?!1:h;d=void 0===d?null:d;a.next();var k=a.getLino(),
    17 n=a.getTokens()[a.getIndex()];if(b.symbols[n.token])throw Error("Duplicate variable name '"+n.token+"'");var p=a.getPc();a.next();a.addSymbol(n.token,p);c={domain:c,keyword:m,lino:k,isSymbol:!0,isValueHolder:h,name:n.token,elements:1,index:0,value:[{}],extra:d};a.addCommand(c);return c},compileToken:function(){var c=a.getToken();if(c){a.getIndex();a.mark();for(var b=$jscomp.makeIterator(Object.keys(a.domain)),h=b.next();!h.done;h=b.next()){if((h=a.domain[h.value])&&(h=h.getHandler(c))&&h.compile(a))return;
    18 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 m=b.program.length;c.endsWith(":")?(b.symbols[c.substring(0,c.length-1)]={pc:m},b.index++):a.compileToken()}},compileFromHere:function(c){for(;b.index<b.tokens.length;){var m=b.tokens[b.index].token;if("else"===m)return b.program;a.compileOne();if(-1<c.indexOf(m))break}},compile:function(c){b.tokens=c;b.index=0;b.program=[];b.symbols={};b.warnings=
    19 [];a.compileFromHere([]);a.addCommand({domain:"core",keyword:"stop",lino:a.getLino(),next:0});return b.program}};g.exports=a},{}],4:[function(d,g,f){var e=Object.assign||function(b){for(var a=1;a<arguments.length;a++){var c=arguments[a],m;for(m in c)Object.prototype.hasOwnProperty.call(c,m)&&(b[m]=c[m])}return b};g.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},
    20 c);b.rewind()}},test:function(b,a){return b.domain[a.domain].condition.test(b,a)}}},{}],5:[function(d,g,f){var e=this,b={Add:{compile:function(a){var c=a.getLino();a.next();var b=a.getValue();if(a.tokenIs("to"))if(a.next(),a.getToken(),a.isSymbol()){var h=a.getSymbol();if(a.getCommandAt(h.pc).isValueHolder){if("giving"===a.peek()){h=a.getValue();a.next();var d=a.getToken();a.next();a.addCommand({domain:"core",keyword:"add",lino:c,value1:b,value2:h,target:d})}else h=a.getToken(),a.next(),a.addCommand({domain:"core",
    21 keyword:"add",lino:c,value1:b,target:h});return!0}a.warning("core "+e.name+": Expected value holder")}else{h=a.getValue();if(a.tokenIs("giving"))return a.next(),d=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"add",lino:c,value1:b,value2:h,target:d}),!0;a.warning("core "+e.name+': Expected "giving"')}return!1},run:function(a){var c=a[a.pc],b=c.value1,h=c.value2,d=a.getSymbolRecord(c.target);if(d.isValueHolder){var e=d.value[d.index];h?(a=a.getValue(h)+a.getValue(b),d.value[d.index]={type:"constant",
    22 numeric:!0,content:a}):(e.numeric||a.nonNumericValueError(c.lino),a=e.content+a.getValue(b),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 b=a.getToken();a.next();if(a.tokenIs("to")&&(a.next(),a.isSymbol())){var d=a.getToken();a.next();a.addCommand({domain:"core",keyword:"alias",lino:c,alias:b,symbol:d});return!0}}return!1},run:function(a){var c=
    23 a[a.pc],b=a.symbols[c.alias].pc,d=a[b],k=a.getSymbolRecord(c.symbol);a[b]={pc:d.pc,domain:k.domain,keyword:k.keyword,lino:d.lino,name:d.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}},Clear:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"clear",lino:c,symbol:b});return!0}return!1},run:function(a){var c=a[a.pc],b=a.getSymbolRecord(c.symbol);
    24 b.isValueHolder?(a.domain[b.domain].value.put(b,{type:"boolean",content:!1}),c.numeric=!1):a.VariableDoesNotHoldAValueError(c.lino,b.name);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 b=a.getNextValue();a.addCommand({domain:"core",keyword:"debug",lino:c,item:b});return!0}a.addCommand({domain:"core",keyword:"debug",lino:c,item:-1});return!0}return a.tokenIs("symbols")?(a.next(),a.addCommand({domain:"core",
    25 keyword:"debug",lino:c,item:"symbols"}),!0):a.tokenIs("symbol")?(b=a.nextToken(),a.next(),a.addCommand({domain:"core",keyword:"debug",lino:c,item:"symbol",name:b}),!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],b=c.item;switch(b){case "symbols":console.log("Symbols: "+JSON.stringify(a.symbols,null,2));break;case "symbol":a=a.getSymbolRecord(c.name);b=a.exporter;delete a.exporter;console.log("Symbol: "+JSON.stringify(a,
    26 null,2));a.exporter=b;break;case "step":a.debugStep=!0;break;default:0<=b.content?console.log("Debug item "+b.content+": "+JSON.stringify(a[b.content],null,2)):console.log("Debug program: "+JSON.stringify(a,null,2))}return c.pc+1}},Decode:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"decode",lino:c,symbol:b});return!0}return!1},run:function(a){var c=a[a.pc],b=a.getSymbolRecord(c.symbol);if(b.isValueHolder){var d=a.getValue(b.value[b.index]);
    27 b.value[b.index]={type:"constant",numeric:!1,content:a.decode(d)};c.numeric=!1}else a.VariableDoesNotHoldAValueError(c.lino,b.name);return c.pc+1}},Divide:{compile:function(a){var c=a.getLino();a.next();a.getToken();if(a.isSymbol()){var b=a.getSymbol();var d=a.getCommandAt(b.pc).name}b=a.getValue();a.tokenIs("by")&&a.next();var k=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:"divide",lino:c,
    28 value1:b,value2:k,target:d}),!0;a.warning("core "+e.name+": Expected value holder")}else return void 0===d&&a.warning("core "+e.name+": No target variable given"),a.addCommand({domain:"core",keyword:"divide",lino:c,value2:k,target:d}),!0;return!1},run:function(a){var c=a[a.pc],b=c.value1,d=c.value2,k=a.getSymbolRecord(c.target);if(k.isValueHolder){var e=k.value[k.index];b?(a=a.getValue(b)/a.getValue(d),k.value[k.index]={type:"constant",numeric:!0,content:Math.trunc(a)}):(e.numeric||a.nonNumericValueError(c,
    29 lino),a=e.content/a.getValue(d),k.value[k.index]={type:"constant",numeric:!0,content:Math.trunc(a)})}else a.VariableDoesNotHoldAValueError(c.lino,k.name);return c.pc+1}},Encode:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"encode",lino:c,symbol:b});return!0}return!1},run:function(a){var c=a[a.pc],b=a.getSymbolRecord(c.symbol);if(b.isValueHolder){var d=a.getValue(b.value[b.index]);b.value[b.index]={type:"constant",
    30 numeric:!1,content:a.encode(d)};c.numeric=!1}else a.VariableDoesNotHoldAValueError(c.lino,b.name);return c.pc+1}},End:{compile:function(a){a.next();return!0},run:function(){return 0}},Fork:{compile:function(a){var c=a.getLino();a.next();a.tokenIs("to")&&a.next();var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"fork",lino:c,label:b});return!0},run:function(a){var c=a[a.pc];try{a.run(a.symbols[c.label].pc)}catch(m){console.log(m.message),alert(m.message)}return c.pc+1}},Go:{compile:function(a){var c=
    31 a.getLino();a.next();a.tokenIs("to")&&a.next();var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"go",lino:c,label:b});return!0},run:function(a){var c=a[a.pc];if(c.label){var b=a.symbols[c.label];if(b)return b.pc;a.runtimeError(c.lino,"Unknown symbol '"+c.label+"'")}return c.goto}},Gosub:{compile:function(a){var c=a.getLino();a.next();a.tokenIs("to")&&a.next();var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"gosub",lino:c,label:b});return!0},run:function(a){var c=a[a.pc];
    32 a.stack.push(a.pc+1);return a.symbols[c.label].pc}},If:{compile:function(a){var c=a.getLino();a.next();var b=a.condition.compile(a),d=a.getPc();a.addCommand({domain:"core",keyword:"if",lino:c,condition:b});a.compileOne();if(!a.getToken())return a.getCommandAt(d).else=a.getPc(),!0;a.tokenIs("else")?(c=a.getPc(),a.addCommand({domain:"core",keyword:"goto",goto:0}),a.getCommandAt(d).else=a.getPc(),a.next(),a.compileOne(!0),a.getCommandAt(c).goto=a.getPc()):a.getCommandAt(d).else=a.getPc();return!0},run:function(a){var c=
    33 a[a.pc];return a.condition.test(a,c.condition)?c.pc+1:c.else}},Import:{compile:function(a){a.getLino();var c=a.imports,b=a.getProgram();c=$jscomp.makeIterator(c);for(var d=c.next();!d.done;d=c.next()){d=d.value;a.next();var k=a.getToken(),e=d.keyword;if(k===e){if(k=a.compileVariable(d.domain,e,!0),k=b[a.getSymbols()[k.name].pc],k.exporter=d.exporter,k.exportedName=d.name,k.imported=!0,!a.tokenIs("and"))break}else throw Error("Mismatched import variable type for '"+d.name+"'");}return!0},run:function(a){return a[a.pc].pc+
    34 1}},Index:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var b=a.getToken();a.next();if(a.tokenIs("to")){a.next();var d=a.getValue();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+
    35 1}},Load:{compile:function(a){var c=a.getLino();a.next();if(a.tokenIs("plugin")){a.next();var b=a.getValue();a.addCommand({domain:"core",keyword:"load",lino:c,name:b});return!0}},run:function(a){var c=a[a.pc],b=a.getValue(c.name);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+
    36 1}},Multiply:{compile:function(a){var c=a.getLino();a.next();a.getToken();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 void 0===d&&a.warning("core multiply: No target variable given"),
     11(function(){function d(g,f,e){function b(c,h){if(!f[c]){if(!g[c]){var m="function"==typeof require&&require;if(!h&&m)return m(c,!0);if(a)return a(c,!0);h=Error("Cannot find module '"+c+"'");throw h.code="MODULE_NOT_FOUND",h;}h=f[c]={exports:{}};g[c][0].call(h.exports,function(a){return b(g[c][1][a]||a)},h,h.exports,d,g,f,e)}return f[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,g,f){var e=d("./easycoder/Main");e.timestamp=
     12Date.now();console.log("Starting up EasyCoder...");window.onload=function(){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,g,f){g.exports=function(d,b,a){b=d.value.evaluate(d,b);a=d.value.evaluate(d,a);b.numeric!==a.numeric&&d.runtimeError(d[d.pc].lino,"Data type mismatch");d=b.content;a=a.content;return d>a?1:d<a?-1:0}},{}],3:[function(d,g,f){var e=Object.assign||
     13function(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)},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+
     141].token},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?!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=
     15void 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(){return a.getTarget()in b.symbols},nextIsSymbol:function(){a.next();return a.isSymbol()},getSymbol:function(){return b.symbols[a.getToken()]},getSymbolPc:function(){return a.getSymbol().pc},getSymbolRecord:function(){return b.program[a.getSymbolPc()]},getSymbols:function(){return b.symbols},getProgram:function(){return b.program},
     16getPc:function(){return b.program.length},getValue:function(){return a.value.compile(a)},getNextValue:function(){a.next();return a.getValue()},getCondition:function(){return a.condition.compile(a)},constant:function(c,b){return a.value.constant(c,void 0===b?!1:b)},addCommand:function(a){b.program.push(e({pc:b.program.length},a))},addSymbol:function(a,m){b.symbols[a]={pc:m}},mark:function(){b.savedMark=b.index},rewind:function(){b.index=b.savedMark},compileVariable:function(c,m,h,d){h=void 0===h?!1:
     17h;d=void 0===d?null:d;a.next();var l=a.getLino(),n=a.getTokens()[a.getIndex()];if(b.symbols[n.token])throw Error("Duplicate variable name '"+n.token+"'");var p=a.getPc();a.next();a.addSymbol(n.token,p);c={domain:c,keyword:m,lino:l,isSymbol:!0,isValueHolder:h,name:n.token,elements:1,index:0,value:[{}],element:[],extra:d};"dom"===d&&(c.element=[]);a.addCommand(c);return c},compileToken:function(){var c=a.getToken();if(c){a.getIndex();a.mark();for(var b=$jscomp.makeIterator(Object.keys(a.domain)),h=
     18b.next();!h.done;h=b.next()){if((h=a.domain[h.value])&&(h=h.getHandler(c))&&h.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 m=b.program.length;c.endsWith(":")?(b.symbols[c.substring(0,c.length-1)]={pc:m},b.index++):a.compileToken()}},compileFromHere:function(c){for(;b.index<b.tokens.length;){var m=b.tokens[b.index].token;if("else"===m)return b.program;a.compileOne();if(-1<
     19c.indexOf(m))break}},compile:function(c){b.tokens=c;b.index=0;b.program=[];b.symbols={};b.warnings=[];a.compileFromHere([]);a.addCommand({domain:"core",keyword:"stop",lino:a.getLino(),next:0});return b.program}};g.exports=a},{}],4:[function(d,g,f){var e=Object.assign||function(b){for(var a=1;a<arguments.length;a++){var c=arguments[a],m;for(m in c)Object.prototype.hasOwnProperty.call(c,m)&&(b[m]=c[m])}return b};g.exports={compile:function(b){b.mark();for(var a=$jscomp.makeIterator(Object.keys(b.domain)),
     20c=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)}}},{}],5:[function(d,g,f){var e=this,b={Add:{compile:function(a){var c=a.getLino();a.next();var b=a.getValue();if(a.tokenIs("to"))if(a.next(),a.getToken(),a.isSymbol()){var h=a.getSymbol();if(a.getCommandAt(h.pc).isValueHolder){if("giving"===a.peek()){h=a.getValue();a.next();var d=a.getToken();a.next();a.addCommand({domain:"core",
     21keyword:"add",lino:c,value1:b,value2:h,target:d})}else h=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"add",lino:c,value1:b,target:h});return!0}a.warning("core "+e.name+": Expected value holder")}else{h=a.getValue();if(a.tokenIs("giving"))return a.next(),d=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"add",lino:c,value1:b,value2:h,target:d}),!0;a.warning("core "+e.name+': Expected "giving"')}return!1},run:function(a){var c=a[a.pc],b=c.value1,h=c.value2,d=a.getSymbolRecord(c.target);
     22if(d.isValueHolder){var e=d.value[d.index];h?(a=a.getValue(h)+a.getValue(b),d.value[d.index]={type:"constant",numeric:!0,content:a}):(e.numeric||a.nonNumericValueError(c.lino),a=e.content+a.getValue(b),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 b=a.getToken();a.next();if(a.tokenIs("to")&&(a.next(),a.isSymbol())){var d=a.getToken();a.next();a.addCommand({domain:"core",
     23keyword:"alias",lino:c,alias:b,symbol:d});return!0}}return!1},run:function(a){var c=a[a.pc],b=a.symbols[c.alias].pc,d=a[b],l=a.getSymbolRecord(c.symbol);a[b]={pc:d.pc,domain:l.domain,keyword:l.keyword,lino:d.lino,name:d.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}},Clear:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"clear",
     24lino:c,symbol:b});return!0}return!1},run:function(a){var c=a[a.pc],b=a.getSymbolRecord(c.symbol);b.isValueHolder?(a.domain[b.domain].value.put(b,{type:"boolean",content:!1}),c.numeric=!1):a.VariableDoesNotHoldAValueError(c.lino,b.name);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 b=a.getNextValue();a.addCommand({domain:"core",keyword:"debug",lino:c,item:b});return!0}a.addCommand({domain:"core",keyword:"debug",
     25lino:c,item:-1});return!0}return a.tokenIs("symbols")?(a.next(),a.addCommand({domain:"core",keyword:"debug",lino:c,item:"symbols"}),!0):a.tokenIs("symbol")?(b=a.nextToken(),a.next(),a.addCommand({domain:"core",keyword:"debug",lino:c,item:"symbol",name:b}),!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],b=c.item;switch(b){case "symbols":console.log("Symbols: "+JSON.stringify(a.symbols,null,2));break;case "symbol":a=
     26a.getSymbolRecord(c.name);b=a.exporter;delete a.exporter;console.log("Symbol: "+JSON.stringify(a,null,2));a.exporter=b;break;case "step":a.debugStep=!0;break;default:0<=b.content?console.log("Debug item "+b.content+": "+JSON.stringify(a[b.content],null,2)):console.log("Debug program: "+JSON.stringify(a,null,2))}return c.pc+1}},Decode:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"decode",lino:c,symbol:b});return!0}return!1},
     27run:function(a){var c=a[a.pc],b=a.getSymbolRecord(c.symbol);if(b.isValueHolder){var d=a.getValue(b.value[b.index]);b.value[b.index]={type:"constant",numeric:!1,content:a.decode(d)};c.numeric=!1}else a.VariableDoesNotHoldAValueError(c.lino,b.name);return c.pc+1}},Divide:{compile:function(a){var c=a.getLino();a.next();a.getToken();if(a.isSymbol()){var b=a.getSymbol();var d=a.getCommandAt(b.pc).name}b=a.getValue();a.tokenIs("by")&&a.next();var l=a.getValue();if(a.tokenIs("giving")){a.next();if(a.isSymbol())return d=
     28a.getSymbol(),d=a.getCommandAt(d.pc).name,a.next(),a.addCommand({domain:"core",keyword:"divide",lino:c,value1:b,value2:l,target:d}),!0;a.warning("core "+e.name+": Expected value holder")}else return void 0===d&&a.warning("core "+e.name+": No target variable given"),a.addCommand({domain:"core",keyword:"divide",lino:c,value2:l,target:d}),!0;return!1},run:function(a){var c=a[a.pc],b=c.value1,d=c.value2,l=a.getSymbolRecord(c.target);if(l.isValueHolder){var e=l.value[l.index];b?(a=a.getValue(b)/a.getValue(d),
     29l.value[l.index]={type:"constant",numeric:!0,content:Math.trunc(a)}):(e.numeric||a.nonNumericValueError(c,lino),a=e.content/a.getValue(d),l.value[l.index]={type:"constant",numeric:!0,content:Math.trunc(a)})}else a.VariableDoesNotHoldAValueError(c.lino,l.name);return c.pc+1}},Encode:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"encode",lino:c,symbol:b});return!0}return!1},run:function(a){var c=a[a.pc],b=a.getSymbolRecord(c.symbol);
     30if(b.isValueHolder){var d=a.getValue(b.value[b.index]);b.value[b.index]={type:"constant",numeric:!1,content:a.encode(d)};c.numeric=!1}else a.VariableDoesNotHoldAValueError(c.lino,b.name);return c.pc+1}},End:{compile:function(a){a.next();return!0},run:function(){return 0}},Fork:{compile:function(a){var c=a.getLino();a.next();a.tokenIs("to")&&a.next();var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"fork",lino:c,label:b});return!0},run:function(a){var c=a[a.pc];try{a.run(a.symbols[c.label].pc)}catch(m){console.log(m.message),
     31alert(m.message)}return c.pc+1}},Go:{compile:function(a){var c=a.getLino();a.next();a.tokenIs("to")&&a.next();var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"go",lino:c,label:b});return!0},run:function(a){var c=a[a.pc];if(c.label){var b=a.symbols[c.label];if(b)return b.pc;a.runtimeError(c.lino,"Unknown symbol '"+c.label+"'")}return c.goto}},Gosub:{compile:function(a){var c=a.getLino();a.next();a.tokenIs("to")&&a.next();var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"gosub",
     32lino:c,label:b});return!0},run:function(a){var c=a[a.pc];a.stack.push(a.pc+1);return a.symbols[c.label].pc}},If:{compile:function(a){var c=a.getLino();a.next();var b=a.condition.compile(a),d=a.getPc();a.addCommand({domain:"core",keyword:"if",lino:c,condition:b});a.compileOne();if(!a.getToken())return a.getCommandAt(d).else=a.getPc(),!0;a.tokenIs("else")?(c=a.getPc(),a.addCommand({domain:"core",keyword:"goto",goto:0}),a.getCommandAt(d).else=a.getPc(),a.next(),a.compileOne(!0),a.getCommandAt(c).goto=
     33a.getPc()):a.getCommandAt(d).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){a.getLino();var c=a.imports,b=a.getProgram();c=$jscomp.makeIterator(c);for(var d=c.next();!d.done;d=c.next()){d=d.value;var l=a.nextToken(),e=d.keyword;if(l===e){if(l=a.compileVariable(d.domain,e,!0),l=b[a.getSymbols()[l.name].pc],l.exporter=d.exporter,l.exportedName=d.name,l.extra=d.extra,l.imported=!0,!a.tokenIs("and"))break}else throw Error("Mismatched import variable type for '"+
     34d.name+"'");}return!0},run:function(a){return a[a.pc].pc+1}},Index:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){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=
     35d);return c.pc+1}},Load:{compile:function(a){var c=a.getLino();a.next();if(a.tokenIs("plugin")){a.next();var b=a.getValue();a.addCommand({domain:"core",keyword:"load",lino:c,name:b});return!0}},run:function(a){var c=a[a.pc],b=a.getValue(c.name);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=
     36null;return a.pc+1}},Multiply:{compile:function(a){var c=a.getLino();a.next();a.getToken();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 void 0===d&&a.warning("core multiply: No target variable given"),
    3737a.addCommand({domain:"core",keyword:"multiply",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 f=e.value[e.index];b?(a=a.getValue(b)*a.getValue(d),e.value[e.index]={type:"constant",numeric:!0,content:a}):(f.numeric||a.nonNumericValueError(c,lino),a=f.content*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=
    3838a.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();a.next();if(a.tokenIs("trigger")){a.next();a.addCommand({domain:"core",keyword:"on",lino:c,
     
    4040value:b});return!0},run:function(a){var c=a[a.pc];a=a.getValue(c.value);console.log("-> "+a);return c.pc+1}},Put:{compile:function(a){var c=a.getLino();a.next();var b=a.getValue();if(a.tokenIs("into")){a.next();if(a.isSymbol()){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()+"'")}return!1},run:function(a){var c=a[a.pc],b=a.getSymbolRecord(c.target);b.isValueHolder||a.variableDoesNotHoldAValueError(c.lino,
    4141b.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();a.next();var b=a.getValue();if(a.tokenIs("with")){a.next();var d=a.getValue();if(a.tokenIs("in")&&(a.next(),a.isSymbol())){var e=a.getSymbolRecord();a.next();if(e.isValueHolder)return a.addCommand({domain:"core",keyword:"replace",lino:c,original:b,replacement:d,target:e.name}),!0}}return!1},run:function(a){var c=
    42 a[a.pc],b=a.getValue(c.original).split("\\r").join("\r").split("\\n").join("\n"),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}},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();a.next();var b=a.getValue(),d=[];if(a.tokenIs("with"))for(;;)if(a.next(),
    43 a.isSymbol()){var e=a.getSymbolRecord();e.exporter=a.getProgram();d.push(e);a.next();if(!a.tokenIs("and"))break}if(a.tokenIs("as")&&(a.next(),a.isSymbol()&&(e=a.getSymbolRecord(),a.next(),"module"===e.keyword)))var f=e.name;a.addCommand({domain:"core",keyword:"run",lino:c,script:b,imports:d,module:f});return!0},run:function(a){a.runScript(a);return 0<a.pc?a[a.pc].pc+1:0}},Script:{compile:function(a){var c=a.getLino();a.next();var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"script",
    44 lino:c,name:b});return!0},run:function(a){var c=a[a.pc];a.script=c.name;return c.pc+1}},Set:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var b=a.getSymbolRecord();if(!b.isValueHolder)return!1;a.next();if(a.tokenIs("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,type:"setArray",target:b.name,value:d});return!0}a.addCommand({domain:"core",keyword:"set",lino:c,type:"setBoolean",target:b.name});
    45 return!0}a.tokenIs("the")&&a.next();if(a.tokenIs("elements")&&(a.next(),a.tokenIs("of"))){a.next();a.getTarget();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,type:"setElements",symbol:b,value:d}),!0}if(a.tokenIs("encoding")){a.next();if(a.tokenIs("to"))return a.next(),b=a.getValue(),a.addCommand({domain:"core",keyword:"set",type:"encoding",lino:c,encoding:b}),
    46 !0;a.addWarning("Unknown encoding option")}return!1},run:function(a){var c=a[a.pc];switch(c.type){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 "setElements":b=a.getSymbolRecord(c.symbol);b.elements=a.getValue(c.value);b.index=0;b.value=[];for(a=0;a<b.elements;a++)b.value.push({});break;case "setArray":a=a.getSymbolRecord(c.target);a.elements=c.value.length;
    47 a.value=c.value;break;case "encoding":a.encoding=a.getValue(c.encoding)}return c.pc+1}},Stop:{compile:function(a){var c=a.getLino();a.next();a.addCommand({domain:"core",keyword:"stop",lino:c,next:0});return!0},run:function(){return 0}},Take:{compile:function(a){var c=a.getLino();a.next();var b=a.getValue();if(a.tokenIs("from"))if(a.next(),a.getToken(),a.isSymbol()){var d=a.getSymbol();if(a.getCommandAt(d.pc).isValueHolder){if("giving"===a.peek()){d=a.getValue();a.next();var f=a.getToken();a.next();
    48 a.addCommand({domain:"core",keyword:"take",lino:c,value1:b,value2:d,target:f})}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=a.getValue();if(a.tokenIs("giving"))return a.next(),f=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"take",lino:c,value1:b,value2:d,target:f}),!0;a.warning("core "+e.name+': Expected "giving"')}return!1},run:function(a){var c=a[a.pc],b=c.value1,
    49 d=c.value2,e=a.getSymbolRecord(c.target);if(e.isValueHolder){var f=e.value[e.index];d?(a=a.getValue(d)-a.getValue(b),e.value[e.index]={type:"constant",numeric:!0,content:a}):(f.numeric||a.nonNumericValueError(c,lino),a=a.getValue(f)-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",
    50 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}},Trigger:{compile:function(a){var c=a.getLino();a.next();return a.tokenIs("parent")?(a.next(),a.addCommand({domain:"core",keyword:"trigger",lino:c,module:"parent"}),!0):a.isSymbol()&&(moduleRecord=a.getSymbolRecord(),
    51 a.next(),"module"===moduleRecord.keyword)?(g=moduleRecord.name,a.addCommand({domain:"core",keyword:"trigger",lino:c,module:g}),!0):!1},run:function(a){var c=a[a.pc];"parent"===c.module?a.parent&&a.parent.trigger(!0):(a=a.getSymbolRecord(c.module),a.exporter?(exporterRecord=a.exporter.getSymbolRecord(c.module),exporterRecord.program.trigger()):a.program.trigger());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=
    52 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();
    53 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 "begin":return b.Begin;case "clear":return b.Clear;case "debug":return b.Debug;
    54 case "decode":return b.Decode;case "divide":return b.Divide;case "encode":return b.Encode;case "end":return b.End;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;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;
    55 case "return":return b.Return;case "run":return b.Run;case "script":return b.Script;case "set":return b.Set;case "stop":return b.Stop;case "take":return b.Take;case "toggle":return b.Toggle;case "trigger":return b.Trigger;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"===
    56 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":return a.nextTokenIs("modulo")?(a=a.getNextValue(),{domain:"core",type:"modulo",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",
    57 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"===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",
    58 type:"empty"};if("now"===c)return a.next(),{domain:"core",type:"now"};if("newline"===c)return a.next(),{domain:"core",type:"newline"};if("encode"===c)return a.next(),{domain:"core",type:"encode",value:a.getValue()};if("decode"===c)return a.next(),{domain:"core",type:"decode",value:a.getValue()};if("lowercase"===c)return a.next(),{domain:"core",type:"lowercase",value:a.getValue()};if("element"===c){c=a.getNextValue();if(a.tokenIs("of")&&a.nextIsSymbol()){var b=a.getSymbolRecord();a.next();if("variable"===
    59 b.keyword)return{domain:"core",type:"element",element:c,symbol:b.name}}return 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;a.tokenIs("the")&&a.next();switch(a.getToken()){case "index":a.next();if(a.tokenIs("of")&&(a.next(),a.isSymbol()))return c=a.getToken(),a.next(),{domain:"core",type:"index",name:c};break;case "value":a.next();if(a.tokenIs("of"))return a.next(),
    60 {domain:"core",type:"valueOf",value:a.getValue()};break;case "length":a.next();if(a.tokenIs("of"))return a.next(),{domain:"core",type:"lengthOf",value:a.getValue()};break;case "left":a.next();c=a.getValue();if(a.tokenIs("of"))return a.next(),a=a.getValue(),{domain:"core",type:"left",count:c,value:a};break;case "right":a.next();c=a.getValue();if(a.tokenIs("of"))return a.next(),a=a.getValue(),{domain:"core",type:"right",count:c,value:a};break;case "position":a.next();if(a.tokenIs("of")&&(a.next(),c=
    61 !1,a.tokenIs("the")&&(a.next(),a.tokenIs("last")&&(a.next(),c=!0)),b=a.getValue(),a.tokenIs("in")))return a.next(),a=a.getValue(),{domain:"core",type:"position",needle:b,haystack:a,last:c};break;case "time":return a.next(),{domain:"core",type:"time"}}return null},get:function(a,b){switch(b.type){case "boolean":return{type:"boolean",numeric:!1,content:b.content};case "index":return{type:"constant",numeric:!0,content:a.getSymbolRecord(b.name).index};case "random":return a=a.evaluate(b.range),{type:"constant",
    62 numeric:!0,content:Math.floor(Math.random()*a.content)};case "cos":var c=a.getValue(b.angle_c);a=a.getValue(b.radius_c);return{type:"constant",numeric:!0,content:parseInt(Math.cos(.01745329*parseFloat(c))*a,10)};case "sin":return c=a.getValue(b.angle_s),a=a.getValue(b.radius_s),{type:"constant",numeric:!0,content:parseInt(Math.sin(.01745329*parseFloat(c))*a,10)};case "tan":return c=a.getValue(b.angle_t),a=a.getValue(b.radius_t),{type:"constant",numeric:!0,content:parseInt(Math.tan(.01745329*parseFloat(c))*
    63 a,10)};case "valueOf":return a=parseInt(a.getValue(b.value)),{type:"constant",numeric:!0,content:a?a:0};case "lengthOf":return{type:"constant",numeric:!0,content:a.getValue(b.value).length};case "left":return{type:"constant",numeric:!1,content:a.getValue(b.value).substr(0,a.getValue(b.count))};case "right":return{type:"constant",numeric:!1,content:a.getValue(b.value).substr(a.getValue(b.count))};case "position":return c=a.getValue(b.needle),a=a.getValue(b.haystack),{type:"constant",numeric:!0,content:b.last?
    64 a.lastIndexOf(c):a.indexOf(c)};case "modulo":return c=a.getSymbolRecord(b.name),a=a.evaluate(b.value),{type:"constant",numeric:!0,content:c.value[c.index].content%a.content};case "empty":return{type:"constant",numeric:!1,content:""};case "now":return{type:"constant",numeric:!0,content:Date.now()/1E3};case "newline":return{type:"constant",numeric:!1,content:"\n"};case "encode":return{type:"constant",numeric:!1,content:a.encode(a.getValue(b.value))};case "decode":return{type:"constant",numeric:!1,content:a.decode(a.getValue(b.value))};
    65 case "lowercase":return{type:"constant",numeric:!1,content:a.getValue(b.value).toLowerCase()};case "element":c=a.getValue(b.element);b=a.getSymbolRecord(b.symbol);var d="";try{d=JSON.parse(a.getValue(b.value[b.index]))[c]}catch(k){}return{type:"constant",numeric:!1,content:"object"===typeof d?JSON.stringify(d):d};case "property":c=a.getValue(b.property);b=a.getSymbolRecord(b.symbol);a=a.getValue(b.value[b.index]);b="";if("object"===typeof a)b=a[c];else try{b=JSON.parse(a)[c]}catch(k){console.log("Can't parse "+
    66 a+": "+k.message)}return{type:"constant",numeric:!1,content:b};case "time":return{type:"constant",numeric:!0,content:Math.round((new Date).getTime())};case "module":return{type:"boolean",numeric:!1,content:a.getSymbolRecord(b.name).program}}return null},put:function(a,b){a.value[a.index]=b}},condition:{compile:function(a){if(a.tokenIs("not"))return a.next(),{domain:"core",type:"not",value:a.getValue()};try{var c=a.getValue();if("is"===a.getToken()){a.next();var d=b.isNegate(a);if(a.tokenIs("even"))return a.next(),
    67 {domain:"core",type:"even",value1:c};if(a.tokenIs("odd"))return a.next(),{domain:"core",type:"odd",value1:c};if(a.tokenIs("greater")){a.next();if(a.tokenIs("than")){a.next();var e=a.getValue();return{domain:"core",type:"greater",value1:c,value2:e,negate:d}}return null}if(a.tokenIs("less")){a.next();if(a.tokenIs("than")){a.next();var f=a.getValue();return{domain:"core",type:"less",value1:c,value2:f,negate:d}}return null}var g=a.getValue();return{domain:"core",type:"is",value1:c,value2:g,negate:d}}if(c)return{domain:"core",
    68 type:"boolean",value:c}}catch(n){}return null},test:function(a,b){switch(b.type){case "boolean":return a.getValue(b.value);case "even":return 0===a.getValue(b.value1)%2;case "odd":return 1===a.getValue(b.value1)%2;case "is":return a=a.compare(a,b.value1,b.value2),b.negate?0!==a:0===a;case "greater":return a=a.compare(a,b.value1,b.value2),b.negate?0>=a:0<a;case "less":return a=a.compare(a,b.value1,b.value2),b.negate?0<=a:0>a;case "not":return!a.getValue(b.value)}return!1}}};g.exports=b},{}],6:[function(d,
    69 g,f){var e=this,b=d("./Tokenise"),a=d("./Compile"),c=d("./Run"),m=d("./Value"),h=d("./Condition"),k=d("./Compare"),l={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>',a.style.display="none")},runtimeError:function(a,
    70 b){this.lino=a;this.reportError({message:"Line "+(0<=a?a:"")+": "+b},l.program)},nonNumericValueError:function(a){this.runtimeError(a,"Non-numeric value")},variableDoesNotHoldAValueError:function(a,b){this.runtimeError(a,"Variable '"+b+"' does not hold a value")},reportError:function(b,c,d){if(b.message){d=this.compiling?d:c.source;var e=d.tokens;d=d.scriptLines;e=this.compiling?e[a.getIndex()].lino:c[c.pc].lino;c=this.compiling?"Compile error":"Runtime error in '"+c.script+"'";c+=":\n";var n=e-5;
    71 for(n=0>n?0:n;n<e;n++){for(var p=""+(n+1);4>p.length;)p=" "+p;c+=p+" "+d[n].line.split("\\s").join(" ")+"\n"}c+=b.message+"\n";b=a.getWarnings();if(b.length)for(c+="Warnings:\n",b=$jscomp.makeIterator(b),d=b.next();!d.done;d=b.next())c+=d.value+"\n";console.log(c);alert(c);l.aborted=!0}else console.log("An error occurred - origin was "+b.path[0])},getSymbolRecord:function(a){a=this[this.symbols[a].pc];if(a.alias)return this[this.symbols[a.alias].pc];var b=a.exporter;b&&b!==this&&(b=b.getSymbolRecord(a.exportedName),
    72 a.value=b.value,a.index=b.index,a.elements=b.elements);return a},evaluate:function(a){return m.evaluate(this,a)},encode:function(a){return m.encode(a,this.encoding)},decode:function(a){return m.decode(a,this.encoding)},getValue:function(a){return m.getValue(this,a)},run:function(a){l.program=this;c(this,a)},trigger:function(a){(void 0===a?0:a)||this.forEach(function(a){if(a.exporter){var b=a.exporter.getSymbolRecord(a.exportedName);a.elements=b.elements;a.index=b.index;a.value=b.value}});this.onTrigger&&
    73 c(this,this.onTrigger)},addJS:function(a,b,c){var d=document.createElement("script");d.type="text/javascript";d.src=b+"/"+a+".js";d.onload=function(){c(a)};document.head.appendChild(d)},register:function(a){l.program=a},runScript:function(a){var b=a[a.pc],c=a.getValue(b.script),d=b.imports;a=b.module?a.getSymbolRecord(b.module):null;l.tokeniseScript(c.split("\n"),d,a,this)},compileScript:function(b,d,e,f){var n=b.tokens;this.compiling=!0;var g=Date.now();a.value=m;a.condition=h;a.domain=l.domain;
    74 a.imports=d;d=a.compile(n);var p=Date.now();console.log("Compiled "+n.length+" tokens in "+(p-g)+"ms");this.compiling=!1;d.value=m;d.condition=h;d.compare=k;d.source=b;d.run=this.run;d.runScript=this.runScript;d.evaluate=this.evaluate;d.getValue=this.getValue;d.encode=this.encode;d.decode=this.decode;d.domain=this.domain;d.trigger=this.trigger;d.addJS=this.addJS;d.checkPlugin=this.checkPlugin;d.getPlugin=this.getPlugin;d.addLocalPlugin=this.addLocalPlugin;d.getPluginsPath=this.getPluginsPath;d.getSymbolRecord=
    75 this.getSymbolRecord;d.runtimeError=this.runtimeError;d.nonNumericValueError=this.nonNumericValueError;d.variableDoesNotHoldAValueError=this.variableDoesNotHoldAValueError;d.reportError=this.reportError;d.register=this.register;d.symbols=a.getSymbols();d.encoding="ec";d.popups=[];d.stack=[];d.queue=[0];d.module=e;d.parent=f;e&&(e.program=d);this.setupTracer();c(d,0)},tokeniseScript:function(a,c,d,e){var f=Date.now();a=b.tokenise(a);var h=Date.now();console.log("Tokenised "+a.scriptLines.length+" lines in "+
    76 (h-f+" ms"));try{l.compileScript(a,c,d,e)}catch(t){"stop"!==t.message&&this.reportError(t,l.program,a)}},tokenize:function(a){a=a.split("\n");if(!e.tokenising){try{l.tokeniseScript(a)}catch(p){l.reportError(p)}e.tokenising=!0}},setPluginCount:function(a){e.plugins=[];e.pluginCount=a},checkPlugin:function(a){return l.domain[a]},getPlugin:function(a,b,c){l.domain[a]?c():(a=document.createElement("script"),a.type="text/javascript",a.src=b,a.onload=function(){console.log("Plugin "+b+" loaded");c()},document.head.appendChild(a))},
    77 addGlobalPlugin:function(a,b){e.plugins.push({name:a,handler:b});e.plugins.length===e.pluginCount&&(e.plugins.forEach(function(a){l.domain[a.name]=a.handler}),l.tokenize(e.source))},addLocalPlugin:function(a,b,c){l.domain[a]=b;c()},getPluginsPath:function(){return l.pluginsPath},loadPluginJs:function(a){var b=new XMLHttpRequest;b.open("GET",""+window.location.origin+a+"/easycoder/plugins.js",!0);b.onreadystatechange=function(){if(4===b.readyState)switch(b.status){case 200:var c=document.createElement("script");
    78 c.src=""+window.location.origin+a+"/easycoder/plugins.js";c.type="text/javascript";c.onload=function(){EasyCoder_Plugins.getGlobalPlugins(a,l.setPluginCount,l.getPlugin,l.addGlobalPlugin)};document.head.appendChild(c);l.pluginsPath=a;break;case 404:a?l.loadPluginJs(a.slice(0,a.lastIndexOf("/"))):l.reportError({message:"Can't load plugins.js"},l.program,this.source)}};b.send()},start:function(a){e.source=a;a=window.location.pathname;a.endsWith("/")&&(a=a.slice(0,-1));l.loadPluginJs(a)}};g.exports=
    79 l},{"./Compare":2,"./Compile":3,"./Condition":4,"./Core":5,"./Run":7,"./Tokenise":8,"./Value":9}],7:[function(d,g,f){var e=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&&!EasyCoder.aborted;)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?"),
    80 b);break}b.watchdog++;var f=b[b.pc].domain;b.debugStep&&console.log(b.script+" "+b.pc+" "+f+":"+b[b.pc].keyword);var g=b.domain[f];if(!g){b.runtimeError(b[b.pc].lino,"Unknown domain '"+f+"'");break}b.pc=g.run(b);if(!b.pc)break;if(b.stop){b.tracing=!1;return}if(b.tracing){f=b[b.pc];g=b.source.scriptLines;var l=d(g),n=document.getElementById("easycoder-tracer");if(n){n.style.display="block";n.style.visibility="visible";var p="";if(b.tracer){b.tracer.variables.forEach(function(a,c,d){var e=b.getSymbolRecord(a);
    81 if(1<e.elements)for(p+=a+": "+e.index+"/"+e.elements+": ",a=0;a<e.elements;a++){var f=e.value[a];p=f?p+(f.content+" "):p+"undefined "}else p=(e=e.value[e.index])?p+(a+": "+e.content):p+(a+": undefined");switch(b.tracer.alignment){case "horizontal":c<d.length-1&&(p+=", ");break;case "vertical":p+="<br>"}});p+="<hr>";n="";for(var q=5;0<q;q--)f.lino&&(n+='<input type="text" name="'+q+'"'+('value="'+g[f.lino-q].line.substr(l)+'"')+'style="width:100%;border:none;enabled:false">'),n+="<br>";f=document.getElementById("easycoder-tracer-content");
    82 f.innerHTML=p+n;f.style.display="block";a.run=document.getElementById("easycoder-run-button");a.step=document.getElementById("easycoder-step-button");a.run.onclick=function(a){return function(c){a.run.blur();b.tracing=!1;document.getElementById("easycoder-tracer-content").style.display="none";try{e(b,b.resume)}catch(r){c="Error in run handler: "+r.message,console.log(c),alert(c)}}}(a);a.step.onclick=function(a){return function(c){console.log("step");a.step.blur();b.tracing=!0;document.getElementById("easycoder-tracer-content").style.display=
    83 "block";try{e(b,b.resume)}catch(r){c="Error in step handler: "+r.message,console.log(c),alert(c)}}}(a);b.resume=b.pc;b.pc=0}}break}a={run:a.run,step:a.step}}};g.exports=e},{}],8:[function(d,g,f){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,f=void 0===b.newList?[]:b.newList;if(c>=a.length)return f;var g=a[c];b=g.lino;g=g.token;var l={list:a,index:c+1,inComment:!1,newList:f.concat({lino:b,index:c,token:g})};f={list:a,index:c+1,inComment:!0,
    84 newList:f.concat({lino:b,index:c,comment:!0,token:g})};return d&&0<c&&b===a[c-1].lino?e.markComments(f):"!"===g.charAt(0)?e.markComments(f):e.markComments(l)},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 f=c.charAt(0),g=b&&" "===f?"\\s":f;if(1===c.length)return g;c=c.substring(1);if("!"===f&&!b)return f+e.findStrings({original:a,line:c,inComment:!0,inQuote:!1});if("`"===f&&!d&&!b)return f+e.findStrings({original:a,line:c,
     42a[a.pc],b=a.getValue(c.original).split("\\r").join("\r").split("\\n").join("\n"),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}},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()){var e=
     43a.getSymbolRecord();e.exporter=a.getProgram();d.push(e);a.next();if(!a.tokenIs("and"))break}if(a.tokenIs("as")&&a.nextIsSymbol()&&(e=a.getSymbolRecord(),a.next(),"module"===e.keyword))var f=e.name;a.addCommand({domain:"core",keyword:"run",lino:c,script:b,imports:d,module:f});return!0},run:function(a){a.runScript(a);return 0<a.pc?a[a.pc].pc+1:0}},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=
     44a[a.pc];a.script=c.name;return c.pc+1}},Set:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var b=a.getSymbolRecord();if(!b.isValueHolder)return!1;a.next();if(a.tokenIs("to")){a.next();for(var d=[];;){a.mark();try{d.push(a.getValue())}catch(l){a.rewind();break}}a.addCommand({domain:"core",keyword:"set",lino:c,type:"setArray",target:b.name,value:d});return!0}a.addCommand({domain:"core",keyword:"set",lino:c,type:"setBoolean",target:b.name});return!0}a.tokenIs("the")&&a.next();if(a.tokenIs("elements")&&
     45(a.next(),a.tokenIs("of"))){a.next();a.getTarget();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,type:"setElements",symbol:b,value:d}),!0}if(a.tokenIs("encoding")){a.next();if(a.tokenIs("to"))return a.next(),b=a.getValue(),a.addCommand({domain:"core",keyword:"set",type:"encoding",lino:c,encoding:b}),!0;a.addWarning("Unknown encoding option")}return!1},run:function(a){var c=
     46a[a.pc];switch(c.type){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 "setElements":b=a.getSymbolRecord(c.symbol);b.elements=a.getValue(c.value);b.index=0;b.value=[];for(a=0;a<b.elements;a++)b.value.push({}),b.element.push("");break;case "setArray":a=a.getSymbolRecord(c.target);a.elements=c.value.length;a.value=c.value;break;case "encoding":a.encoding=a.getValue(c.encoding)}return c.pc+
     471}},Stop:{compile:function(a){var c=a.getLino();a.next();a.addCommand({domain:"core",keyword:"stop",lino:c,next:0});return!0},run:function(){return 0}},Take:{compile:function(a){var c=a.getLino();a.next();var b=a.getValue();if(a.tokenIs("from"))if(a.next(),a.getToken(),a.isSymbol()){var d=a.getSymbol();if(a.getCommandAt(d.pc).isValueHolder){if("giving"===a.peek()){d=a.getValue();a.next();var f=a.getToken();a.next();a.addCommand({domain:"core",keyword:"take",lino:c,value1:b,value2:d,target:f})}else d=
     48a.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=a.getValue();if(a.tokenIs("giving"))return a.next(),f=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"take",lino:c,value1:b,value2:d,target:f}),!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 f=e.value[e.index];
     49d?(a=a.getValue(d)-a.getValue(b),e.value[e.index]={type:"constant",numeric:!0,content:a}):(f.numeric||a.nonNumericValueError(c,lino),a=a.getValue(f)-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],
     50b=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}},Trigger:{compile:function(a){var c=a.getLino();a.next();return a.tokenIs("parent")?(a.next(),a.addCommand({domain:"core",keyword:"trigger",lino:c,module:"parent"}),!0):a.isSymbol()&&(moduleRecord=a.getSymbolRecord(),a.next(),"module"===moduleRecord.keyword)?(g=moduleRecord.name,a.addCommand({domain:"core",
     51keyword:"trigger",lino:c,module:g}),!0):!1},run:function(a){var c=a[a.pc];"parent"===c.module?a.parent&&a.parent.trigger(!0):(a=a.getSymbolRecord(c.module),a.exporter?(exporterRecord=a.exporter.getSymbolRecord(c.module),exporterRecord.program.trigger()):a.program.trigger());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();
     52d=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();var b=a.getCondition(),d=a.getPc();a.addCommand({domain:"core",keyword:"while",lino:c,condition:b});
     53c=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 "begin":return b.Begin;case "clear":return b.Clear;case "debug":return b.Debug;case "decode":return b.Decode;case "divide":return b.Divide;case "encode":return b.Encode;
     54case "end":return b.End;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;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 "return":return b.Return;case "run":return b.Run;case "script":return b.Script;
     55case "set":return b.Set;case "stop":return b.Stop;case "take":return b.Take;case "toggle":return b.Toggle;case "trigger":return b.Trigger;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=
     56a.getToken();switch(a.getSymbolRecord().keyword){case "module":return a.next(),{domain:"core",type:"module",name:c};case "variable":return a.nextTokenIs("modulo")?(a=a.getNextValue(),{domain:"core",type:"modulo",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()};
     57if("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"===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"===c)return a.next(),{domain:"core",type:"now"};if("newline"===
     58c)return a.next(),{domain:"core",type:"newline"};if("encode"===c)return a.next(),{domain:"core",type:"encode",value:a.getValue()};if("decode"===c)return a.next(),{domain:"core",type:"decode",value:a.getValue()};if("lowercase"===c)return a.next(),{domain:"core",type:"lowercase",value:a.getValue()};if("element"===c){c=a.getNextValue();if(a.tokenIs("of")&&a.nextIsSymbol()){var b=a.getSymbolRecord();a.next();if("variable"===b.keyword)return{domain:"core",type:"element",element:c,symbol:b.name}}return null}if("property"===
     59c)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;a.tokenIs("the")&&a.next();switch(a.getToken()){case "index":a.next();if(a.tokenIs("of")&&(a.next(),a.isSymbol()))return c=a.getToken(),a.next(),{domain:"core",type:"index",name:c};break;case "value":a.next();if(a.tokenIs("of"))return a.next(),{domain:"core",type:"valueOf",value:a.getValue()};break;case "length":a.next();
     60if(a.tokenIs("of"))return a.next(),{domain:"core",type:"lengthOf",value:a.getValue()};break;case "left":a.next();c=a.getValue();if(a.tokenIs("of"))return a.next(),a=a.getValue(),{domain:"core",type:"left",count:c,value:a};break;case "right":a.next();c=a.getValue();if(a.tokenIs("of"))return a.next(),a=a.getValue(),{domain:"core",type:"right",count:c,value:a};break;case "position":if(a.next(),a.tokenIs("of")&&(a.next(),c=!1,a.tokenIs("the")&&(a.next(),a.tokenIs("last")&&(a.next(),c=!0)),b=a.getValue(),
     61a.tokenIs("in")))return a.next(),a=a.getValue(),{domain:"core",type:"position",needle:b,haystack:a,last:c}}return null},get:function(a,b){switch(b.type){case "boolean":return{type:"boolean",numeric:!1,content:b.content};case "index":return{type:"constant",numeric:!0,content:a.getSymbolRecord(b.name).index};case "random":return a=a.evaluate(b.range),{type:"constant",numeric:!0,content:Math.floor(Math.random()*a.content)};case "cos":var c=a.getValue(b.angle_c);a=a.getValue(b.radius_c);return{type:"constant",
     62numeric:!0,content:parseInt(Math.cos(.01745329*parseFloat(c))*a,10)};case "sin":return c=a.getValue(b.angle_s),a=a.getValue(b.radius_s),{type:"constant",numeric:!0,content:parseInt(Math.sin(.01745329*parseFloat(c))*a,10)};case "tan":return c=a.getValue(b.angle_t),a=a.getValue(b.radius_t),{type:"constant",numeric:!0,content:parseInt(Math.tan(.01745329*parseFloat(c))*a,10)};case "valueOf":return a=parseInt(a.getValue(b.value)),{type:"constant",numeric:!0,content:a?a:0};case "lengthOf":return{type:"constant",
     63numeric:!0,content:a.getValue(b.value).length};case "left":return{type:"constant",numeric:!1,content:a.getValue(b.value).substr(0,a.getValue(b.count))};case "right":return{type:"constant",numeric:!1,content:a.getValue(b.value).substr(a.getValue(b.count))};case "position":return c=a.getValue(b.needle),a=a.getValue(b.haystack),{type:"constant",numeric:!0,content:b.last?a.lastIndexOf(c):a.indexOf(c)};case "modulo":return c=a.getSymbolRecord(b.name),a=a.evaluate(b.value),{type:"constant",numeric:!0,content:c.value[c.index].content%
     64a.content};case "empty":return{type:"constant",numeric:!1,content:""};case "now":return{type:"constant",numeric:!0,content:Date.now()/1E3};case "newline":return{type:"constant",numeric:!1,content:"\n"};case "encode":return{type:"constant",numeric:!1,content:a.encode(a.getValue(b.value))};case "decode":return{type:"constant",numeric:!1,content:a.decode(a.getValue(b.value))};case "lowercase":return{type:"constant",numeric:!1,content:a.getValue(b.value).toLowerCase()};case "element":c=a.getValue(b.element);
     65b=a.getSymbolRecord(b.symbol);var d="";try{d=JSON.parse(a.getValue(b.value[b.index]))[c]}catch(l){}return{type:"constant",numeric:!1,content:"object"===typeof d?JSON.stringify(d):d};case "property":c=a.getValue(b.property);b=a.getSymbolRecord(b.symbol);a=a.getValue(b.value[b.index]);b="";if("object"===typeof a)b=a[c];else try{b=JSON.parse(a)[c]}catch(l){console.log("Can't parse "+a+": "+l.message)}return{type:"constant",numeric:!1,content:b};case "module":return{type:"boolean",numeric:!1,content:a.getSymbolRecord(b.name).program}}return null},
     66put:function(a,b){a.value[a.index]=b}},condition:{compile:function(a){if(a.tokenIs("not"))return a.next(),{domain:"core",type:"not",value:a.getValue()};try{var c=a.getValue();if("is"===a.getToken()){a.next();var d=b.isNegate(a);if(a.tokenIs("even"))return a.next(),{domain:"core",type:"even",value1:c};if(a.tokenIs("odd"))return a.next(),{domain:"core",type:"odd",value1:c};if(a.tokenIs("greater")){a.next();if(a.tokenIs("than")){a.next();var e=a.getValue();return{domain:"core",type:"greater",value1:c,
     67value2:e,negate:d}}return null}if(a.tokenIs("less")){a.next();if(a.tokenIs("than")){a.next();var f=a.getValue();return{domain:"core",type:"less",value1:c,value2:f,negate:d}}return null}var g=a.getValue();return{domain:"core",type:"is",value1:c,value2:g,negate:d}}if(c)return{domain:"core",type:"boolean",value:c}}catch(n){}return null},test:function(a,b){switch(b.type){case "boolean":return a.getValue(b.value);case "even":return 0===a.getValue(b.value1)%2;case "odd":return 1===a.getValue(b.value1)%
     682;case "is":return a=a.compare(a,b.value1,b.value2),b.negate?0!==a:0===a;case "greater":return a=a.compare(a,b.value1,b.value2),b.negate?0>=a:0<a;case "less":return a=a.compare(a,b.value1,b.value2),b.negate?0<=a:0>a;case "not":return!a.getValue(b.value)}return!1}}};g.exports=b},{}],6:[function(d,g,f){var e=this,b=d("./Tokenise"),a=d("./Compile"),c=d("./Run"),m=d("./Value"),h=d("./Condition"),l=d("./Compare"),k={domain:{core:d("./Core")},setupTracer:function(){var a=document.getElementById("easycoder-tracer");
     69a&&(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>',a.style.display="none")},runtimeError:function(a,b){this.lino=a;this.reportError({message:"Line "+(0<=a?a:"")+": "+b},k.program)},nonNumericValueError:function(a){this.runtimeError(a,"Non-numeric value")},variableDoesNotHoldAValueError:function(a,b){this.runtimeError(a,
     70"Variable '"+b+"' does not hold a value")},reportError:function(b,c,d){if(b.message){d=this.compiling?d:c.source;var e=d.tokens;d=d.scriptLines;e=this.compiling?e[a.getIndex()].lino:c[c.pc].lino;c=this.compiling?"Compile error":"Runtime error in '"+c.script+"'";c+=":\n";var n=e-5;for(n=0>n?0:n;n<e;n++){for(var p=""+(n+1);4>p.length;)p=" "+p;c+=p+" "+d[n].line.split("\\s").join(" ")+"\n"}c+=b.message+"\n";b=a.getWarnings();if(b.length)for(c+="Warnings:\n",b=$jscomp.makeIterator(b),d=b.next();!d.done;d=
     71b.next())c+=d.value+"\n";console.log(c);alert(c);k.aborted=!0}else console.log("An error occurred - origin was "+b.path[0])},getSymbolRecord:function(a){a=this[this.symbols[a].pc];if(a.alias)return this[this.symbols[a.alias].pc];var b=a.exporter;b&&b!==this&&(b=b.getSymbolRecord(a.exportedName),a.value=b.value,a.index=b.index,a.elements=b.elements);return a},evaluate:function(a){return m.evaluate(this,a)},encode:function(a){return m.encode(a,this.encoding)},decode:function(a){return m.decode(a,this.encoding)},
     72getValue:function(a){return m.getValue(this,a)},run:function(a){k.program=this;c(this,a)},trigger:function(a){(void 0===a?0:a)||this.forEach(function(a){if(a.exporter){var b=a.exporter.getSymbolRecord(a.exportedName);a.elements=b.elements;a.index=b.index;a.value=b.value}});this.onTrigger&&c(this,this.onTrigger)},addJS:function(a,b,c){var d=document.createElement("script");d.type="text/javascript";d.src=b+"/"+a+".js";d.onload=function(){c(a)};document.head.appendChild(d)},register:function(a){k.program=
     73a},runScript:function(a){var b=a[a.pc],c=a.getValue(b.script),d=b.imports;a=b.module?a.getSymbolRecord(b.module):null;k.tokeniseScript(c.split("\n"),d,a,this)},compileScript:function(b,d,e,f){var n=b.tokens;this.compiling=!0;var g=Date.now();a.value=m;a.condition=h;a.domain=k.domain;a.imports=d;d=a.compile(n);var p=Date.now();console.log(p-k.timestamp+" ms: Compiled "+n.length+" tokens in "+(p-g+" ms"));this.compiling=!1;d.EasyCoder=k;d.value=m;d.condition=h;d.compare=l;d.source=b;d.run=this.run;
     74d.runScript=this.runScript;d.evaluate=this.evaluate;d.getValue=this.getValue;d.encode=this.encode;d.decode=this.decode;d.domain=this.domain;d.trigger=this.trigger;d.addJS=this.addJS;d.checkPlugin=this.checkPlugin;d.getPlugin=this.getPlugin;d.addLocalPlugin=this.addLocalPlugin;d.getPluginsPath=this.getPluginsPath;d.getSymbolRecord=this.getSymbolRecord;d.runtimeError=this.runtimeError;d.nonNumericValueError=this.nonNumericValueError;d.variableDoesNotHoldAValueError=this.variableDoesNotHoldAValueError;
     75d.reportError=this.reportError;d.register=this.register;d.symbols=a.getSymbols();d.encoding="ec";d.popups=[];d.stack=[];d.queue=[0];d.module=e;d.parent=f;e&&(e.program=d);this.setupTracer();c(d,0)},tokeniseScript:function(a,c,d,e){var f=Date.now();a=b.tokenise(a);var h=Date.now();console.log(h-k.timestamp+" ms: Tokenised "+a.scriptLines.length+" lines in "+(h-f+" ms"));try{k.compileScript(a,c,d,e)}catch(t){"stop"!==t.message&&this.reportError(t,k.program,a)}},tokenize:function(a){a=a.split("\n");
     76if(!e.tokenising){try{k.tokeniseScript(a)}catch(p){k.reportError(p)}e.tokenising=!0}},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,a.onload=function(){console.log("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]=
     77a.handler}),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 plugins.js");var b=new XMLHttpRequest;b.open("GET",""+window.location.origin+a+"/easycoder/plugins.js",!0);b.onreadystatechange=function(){if(4===b.readyState)switch(b.status){case 200:var c=document.createElement("script");c.src=""+window.location.origin+a+"/easycoder/plugins.js";c.type="text/javascript";
     78c.onload=function(){EasyCoder_Plugins.getGlobalPlugins(k.timestamp,a,k.setPluginCount,k.getPlugin,k.addGlobalPlugin)};document.head.appendChild(c);k.pluginsPath=a;break;case 404:a?k.loadPluginJs(a.slice(0,a.lastIndexOf("/"))):k.reportError({message:"Can't load plugins.js"},k.program,this.source)}};b.send()},start:function(a){e.source=a;a=window.location.pathname;a.endsWith("/")&&(a=a.slice(0,-1));k.loadPluginJs(a)}};g.exports=k},{"./Compare":2,"./Compile":3,"./Condition":4,"./Core":5,"./Run":7,"./Tokenise":8,
     79"./Value":9}],7:[function(d,g,f){var e=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&&!EasyCoder.aborted;)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);break}b.watchdog++;var f=b[b.pc].domain;b.debugStep&&
     80console.log(b.script+" "+b.pc+" "+f+":"+b[b.pc].keyword);var g=b.domain[f];if(!g){b.runtimeError(b[b.pc].lino,"Unknown domain '"+f+"'");break}b.pc=g.run(b);if(!b.pc)break;if(b.stop){b.tracing=!1;return}if(b.tracing){f=b[b.pc];g=b.source.scriptLines;var k=d(g),n=document.getElementById("easycoder-tracer");if(n){n.style.display="block";n.style.visibility="visible";var p="";if(b.tracer){b.tracer.variables.forEach(function(a,c,d){var e=b.getSymbolRecord(a);if(1<e.elements)for(p+=a+": "+e.index+"/"+e.elements+
     81": ",a=0;a<e.elements;a++){var f=e.value[a];p=f?p+(f.content+" "):p+"undefined "}else p=(e=e.value[e.index])?p+(a+": "+e.content):p+(a+": undefined");switch(b.tracer.alignment){case "horizontal":c<d.length-1&&(p+=", ");break;case "vertical":p+="<br>"}});p+="<hr>";n="";for(var q=5;0<q;q--)f.lino&&(n+='<input type="text" name="'+q+'"'+('value="'+g[f.lino-q].line.substr(k)+'"')+'style="width:100%;border:none;enabled:false">'),n+="<br>";f=document.getElementById("easycoder-tracer-content");f.innerHTML=
     82p+n;f.style.display="block";a.run=document.getElementById("easycoder-run-button");a.step=document.getElementById("easycoder-step-button");a.run.onclick=function(a){return function(c){a.run.blur();b.tracing=!1;document.getElementById("easycoder-tracer-content").style.display="none";try{e(b,b.resume)}catch(r){c="Error in run handler: "+r.message,console.log(c),alert(c)}}}(a);a.step.onclick=function(a){return function(c){console.log("step");a.step.blur();b.tracing=!0;document.getElementById("easycoder-tracer-content").style.display=
     83"block";try{e(b,b.resume)}catch(r){c="Error in step handler: "+r.message,console.log(c),alert(c)}}}(a);b.resume=b.pc;b.pc=0}}break}a={run:a.run,step:a.step}}};g.exports=e},{}],8:[function(d,g,f){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,f=void 0===b.newList?[]:b.newList;if(c>=a.length)return f;var g=a[c];b=g.lino;g=g.token;var k={list:a,index:c+1,inComment:!1,newList:f.concat({lino:b,index:c,token:g})};f={list:a,index:c+1,inComment:!0,
     84newList:f.concat({lino:b,index:c,comment:!0,token:g})};return d&&0<c&&b===a[c-1].lino?e.markComments(f):"!"===g.charAt(0)?e.markComments(f):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 f=c.charAt(0),g=b&&" "===f?"\\s":f;if(1===c.length)return g;c=c.substring(1);if("!"===f&&!b)return f+e.findStrings({original:a,line:c,inComment:!0,inQuote:!1});if("`"===f&&!d&&!b)return f+e.findStrings({original:a,line:c,
    8585inComment:d,inQuote:!0});if("`"===f&&b)return f+e.findStrings({original:a,line:c,inComment:d,inQuote:!1});if(!d&&!b&&!f.match(/[A-z0-9_\-\+\*\/\- ]/)){if("'"==f||'"'==f)throw Error('Bad syntax in "'+a+'":\nStrings in EasyCoder must be enclosed in backticks.');throw Error('Unrecognised character "'+f+'" in "'+a+'".');}return g+e.findStrings({original:a,line:c,inComment:d,inQuote:b})},tokenise:function(b){b=b.map(function(a){return a.length?e.findStrings({original:a,line:a}):""}).map(function(a,b){return{lino:b+
    86861,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}}};g.exports=e},{}],9:[function(d,g,f){var e={getItem:function(b){var a=b.getToken();if(!a)return null;if("true"===a)return b.next(),
  • easycoder/trunk/easycoder.js

    r1990067 r1996019  
    44const EasyCoder = require('./easycoder/Main');
    55
    6 console.log('Starting up EasyCoder...');
     6EasyCoder.timestamp = Date.now();
     7console.log(`Starting up EasyCoder...`);
    78window.onload = function () {
    89
     
    222223      index: 0,
    223224      value: [{}],
     225      element: [],
    224226      extra
    225227    };
     228    if (extra === 'dom') {
     229      command.element = [];
     230    }
    226231    EasyCoder_Compiler.addCommand(command);
    227232    return command;
     
    942947      const program = compiler.getProgram();
    943948      for (const symbolRecord of imports) {
    944         compiler.next();
    945         const thisType = compiler.getToken();
     949        const thisType = compiler.nextToken();
    946950        const exportedType = symbolRecord.keyword;
    947951        if (thisType === exportedType) {
     
    950954          newRecord.exporter = symbolRecord.exporter;
    951955          newRecord.exportedName = symbolRecord.name;
     956          newRecord.extra = symbolRecord.extra;
    952957          newRecord.imported = true;
    953958          if (!compiler.tokenIs('and')) {
     
    971976    compile: compiler => {
    972977      const lino = compiler.getLino();
    973       compiler.next();
    974978      // get the variable
    975       if (compiler.isSymbol()) {
     979      if (compiler.nextIsSymbol()) {
    976980        const symbol = compiler.getToken();
    977         compiler.next();
    978         if (compiler.tokenIs('to')) {
    979           compiler.next();
     981        if (compiler.nextTokenIs('to')) {
    980982          // get the value
    981           const value = compiler.getValue();
     983          const value = compiler.getNextValue();
    982984          compiler.addCommand({
    983985            domain: 'core',
     
    13681370    compile: compiler => {
    13691371      const lino = compiler.getLino();
    1370       compiler.next();
    1371       const script = compiler.getValue();
     1372      const script = compiler.getNextValue();
    13721373      const imports = [];
    13731374      if (compiler.tokenIs('with')) {
    13741375        while (true) {
    1375           compiler.next();
    1376           if (compiler.isSymbol()) {
     1376          if (compiler.nextIsSymbol()) {
    13771377            const symbolRecord = compiler.getSymbolRecord();
    13781378            symbolRecord.exporter = compiler.getProgram();
     
    13871387      var module;
    13881388      if (compiler.tokenIs('as')) {
    1389         compiler.next();
    1390         if (compiler.isSymbol()) {
     1389        if (compiler.nextIsSymbol()) {
    13911390          const moduleRecord = compiler.getSymbolRecord();
    13921391          compiler.next();
     
    14191418    compile: compiler => {
    14201419      const lino = compiler.getLino();
    1421       compiler.next();
    1422       const name = compiler.getToken();
     1420      const name = compiler.nextToken();
    14231421      compiler.next();
    14241422      compiler.addCommand({
     
    15521550          for (var n = 0; n < symbol.elements; n++) {
    15531551            symbol.value.push({});
     1552            symbol.element.push("");
    15541553          }
    15551554          break;
     
    22532252          }
    22542253          break;
    2255         case 'time':
    2256           compiler.next();
    2257           return {
    2258             domain: 'core',
    2259             type: 'time'
    2260           };
    2261       }
    2262       ;
     2254      };
    22632255      return null;
    22642256    },
     
    24202412            content
    24212413          };
    2422         case 'time':
    2423           return {
    2424             type: 'constant',
    2425             numeric: true,
    2426             content: Math.round(new Date().getTime())
    2427           };
    24282414        case 'module':
    24292415          const module = program.getSymbolRecord(value.name);
     
    27032689  compileScript: function (source, imports, module, parent) {
    27042690    const { tokens } = source;
    2705     //  console.log('Compile script: ');
    27062691    this.compiling = true;
    27072692    const startCompile = Date.now();
     
    27132698    const program = EasyCoder_Compiler.compile(tokens);
    27142699    const finishCompile = Date.now();
    2715     console.log('Compiled ' + tokens.length + ' tokens in ' + (finishCompile - startCompile) + 'ms');
     2700    console.log(`${finishCompile - EasyCoder.timestamp} ms: Compiled ${tokens.length} tokens in ` + `${finishCompile - startCompile} ms`);
    27162701    //    console.log('Program: ' + JSON.stringify(program, null, 2));
    27172702    this.compiling = false;
    27182703
     2704    program.EasyCoder = EasyCoder;
    27192705    program.value = EasyCoder_Value;
    27202706    program.condition = EasyCoder_Condition;
     
    27612747    const source = EasyCoder_Tokenise.tokenise(file);
    27622748    const finishTokenise = Date.now();
    2763     console.log(`Tokenised ${source.scriptLines.length} lines in ` + `${finishTokenise - startTokenise} ms`);
     2749    console.log(`${finishTokenise - EasyCoder.timestamp} ms: Tokenised ${source.scriptLines.length} lines in ` + `${finishTokenise - startTokenise} ms`);
    27642750    //  console.log('Source: ' + JSON.stringify(source, null, 2));
    27652751    try {
     
    28282814
    28292815  loadPluginJs: pathname => {
     2816    console.log(`${Date.now() - EasyCoder.timestamp} ms: Load plugins.js`);
    28302817    const fullPath = `${window.location.origin}${pathname}/easycoder/plugins.js`;
    28312818    const ajax = new XMLHttpRequest();
     
    28392826            script.type = 'text/javascript';
    28402827            script.onload = function () {
    2841               EasyCoder_Plugins.getGlobalPlugins(pathname, EasyCoder.setPluginCount, EasyCoder.getPlugin, EasyCoder.addGlobalPlugin);
     2828              EasyCoder_Plugins.getGlobalPlugins(EasyCoder.timestamp, pathname, EasyCoder.setPluginCount, EasyCoder.getPlugin, EasyCoder.addGlobalPlugin);
    28422829            };
    28432830            document.head.appendChild(script);
  • easycoder/trunk/easycoder.php

    r1990067 r1996019  
    44  * Plugin URI: https://easycoder.software
    55  * 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.1.7
     6  * Version: 2.1.8
    77  * Author: EasyCoder Software
    88  * Author URI: https://easycoder.software
     
    1717  function easycoder_enqueue_script() {   
    1818    wp_enqueue_script('easycoder_script', plugin_dir_url( __FILE__ )
    19             . 'easycoder-min.js', array(), '2.1.7');
     19            . 'easycoder-min.js', array(), '2.1.8');
    2020  }
    2121 
  • easycoder/trunk/plugins-sample.js

    r1987789 r1996019  
    11const EasyCoder_Plugins = {
    22
    3   getGlobalPlugins: (path, setPluginCount, getPlugin, addPlugin) => {
    4    
     3  getGlobalPlugins: (timestamp, path, setPluginCount, getPlugin, addPlugin) => {
     4     
     5    console.log(`${Date.now() - timestamp} ms: Load plugins`);
     6   
    57    /*
    68     * To include EasyCoder global plugins in your site, add them here.
  • easycoder/trunk/plugins/browser.js

    r1990067 r1996019  
    4646          case 'div':
    4747          case 'form':
    48           case 'header':
     48          case 'h1':
     49          case 'h2':
     50          case 'h3':
     51          case 'h4':
     52          case 'h5':
     53          case 'h6':
    4954          case 'p':
    5055          case 'a':
     
    7883        }
    7984      }
    80       compiler.addWarning('Unrecognised syntax in \'attach\'');
     85      compiler.addWarning(`Unrecognised syntax in 'attach'`);
    8186      return false;
    8287    },
     
    8590      const command = program[program.pc];
    8691      const content = program.value.evaluate(program, command.cssId).content;
    87       try {
    88         const element = document.getElementById(content);
    89         if (!element) {
    90           throw Error(`No such element: '${content}'`);
    91         }
    92       } catch (err) {
    93         console.log(err.message);
    94         program.runtimeError(command.lino, err.message);
     92      const element = document.getElementById(content);
     93      if (!element) {
     94        program.runtimeError(command.lino, `No such element: '${content}'`);
     95        return 0;
    9596      }
    9697      const target = program.getSymbolRecord(command.symbol);
     98      target.element[target.index] = element;
    9799      target.value[target.index] = {
    98100        type: 'constant',
     
    144146      if (compiler.nextIsSymbol()) {
    145147        const symbolRecord = compiler.getSymbolRecord();
    146         const target = symbolRecord.name;
    147         compiler.next();
    148         switch (symbolRecord.keyword) {
    149           case 'audioclip':
    150             if (compiler.tokenIs('from')) {
    151               compiler.next();
    152             }
    153             const value = compiler.getValue();
     148        if (symbolRecord.keyword === 'audioclip') {
     149          if (compiler.nextTokenIs('from')) {
     150            const value = compiler.getNextValue();
    154151            compiler.addCommand({
    155152              domain: 'browser',
     
    158155              name: symbolRecord.name,
    159156              lino,
    160               target,
    161157              value
    162158            });
    163159            return true;
    164           case 'div':
    165           case 'p':
    166           case 'h1':
    167           case 'h2':
    168           case 'h3':
    169           case 'h4':
    170           case 'h5':
    171           case 'h6':
    172           case 'span':
    173           case 'button':
    174           case 'input':
    175           case 'pre':
    176             var inputType = '';
    177             if (symbolRecord.keyword === 'input') {
    178               if (compiler.tokenIs('type')) {
    179                 compiler.next();
    180                 inputType = compiler.getToken();
    181                 compiler.next();
    182               } else {
    183                 throw new Error('Missing input type');
    184               }
    185             }
    186             if (compiler.tokenIs('in')) {
     160          }
     161          return false;
     162        }
     163        if (['a',
     164            'button',
     165            'div',
     166            'form',
     167            'h1',
     168            'h2',
     169            'h3',
     170            'h4',
     171            'h5',
     172            'h6',
     173            'img',
     174            'input',
     175            'li',
     176            'p',
     177            'pre',
     178            'select',
     179            'span',
     180            'text',
     181            'textarea',
     182            'ul'
     183          ].includes(symbolRecord.keyword)) {
     184          if (compiler.nextTokenIs('in')) {
     185            if (compiler.nextIsSymbol()) {
     186              const parentRecord = compiler.getSymbolRecord();
    187187              compiler.next();
    188               if (compiler.isSymbol()) {
    189                 const parentRecord = compiler.getSymbolRecord();
    190                 if (parentRecord.extra !== 'dom') {
    191                   throw new Error(`Inappropriate type '${parentRecord.keyword}'`);
    192                 }
    193                 compiler.next();
    194                 var className = '';
    195                 var style = '';
    196                 var text = '';
    197                 var flag = true;
    198                 while (flag) {
    199                   const token = compiler.getToken();
    200                   if (!token) {
    201                     break;
    202                   }
    203                   compiler.next();
    204                   switch (token) {
    205                     case 'class':
    206                       className = compiler.getValue();
    207                       break;
    208                     case 'style':
    209                       style = compiler.getValue();
    210                       break;
    211                     case 'text':
    212                       text = compiler.getValue();
    213                       break;
    214                     default:
    215                       compiler.prev();
    216                       flag = false;
    217                       break;
    218                   }
    219                 }
    220                 compiler.addCommand({
    221                   domain: 'browser',
    222                   keyword: 'create',
    223                   lino,
    224                   type: symbolRecord.keyword,
    225                   name: symbolRecord.name,
    226                   inputType,
    227                   className,
    228                   style,
    229                   text,
    230                   parent: parentRecord.name
    231                 });
    232                 return true;
    233               }
    234             }
    235             break;
     188              compiler.addCommand({
     189                domain: 'browser',
     190                keyword: 'create',
     191                lino,
     192                name: symbolRecord.name,
     193                parent: parentRecord.name
     194              });
     195              return true;
     196            }
     197          }
    236198        }
    237199      }
     
    248210        default:
    249211          const parentRecord = program.getSymbolRecord(command.parent);
    250           const container = document.getElementById(parentRecord.value[parentRecord.index].content);
    251           const element = document.createElement(command.type);
    252           element.id = "easycoder-" + targetRecord.name + "-" + targetRecord.index;
    253           targetRecord.value[targetRecord.index] = {
    254             type: 'constant',
    255             numeric: false,
    256             content: element.id
    257           };
    258           container.appendChild(element);
    259           if (command.inputType) {
    260             element.setAttribute('type', command.inputType);
    261           }
    262           if (command.className) {
    263             element.className = command.className;
    264           }
    265           const styles = program.value.evaluate(program, command.style).content;
    266           for (const item of styles.split(';')) {
    267             const style = item.split(':');
    268             element.style[style[0]] = style[1];
    269           }
    270           ;
    271           if (command.text) {
    272             element.textContent = program.value.evaluate(program, command.text).content;
    273           }
     212          if (!parentRecord.element[parentRecord.index]) {
     213            parentRecord.element[parentRecord.index] = document.getElementById(parentRecord.value[parentRecord.index].content);
     214          }
     215          targetRecord.element[targetRecord.index] = document.createElement(targetRecord.keyword);
     216          if (!this.elementId) {
     217            this.elementId = 0;
     218          }
     219          targetRecord.element[targetRecord.index].id = this.elementId++;
     220          parentRecord.element[parentRecord.index].appendChild(targetRecord.element[targetRecord.index]);
    274221          break;
    275222      }
     
    350297    compile: (compiler) => {
    351298      const item = compiler.compileVariable('browser', 'form', false, 'dom');
    352       return true;
    353     },
    354 
    355     run: (program) => {
    356       return program[program.pc].pc + 1;
    357     }
    358   },
    359 
    360   Header: {
    361 
    362     compile: (compiler) => {
    363       const item = compiler.compileVariable('browser', 'header', false, 'dom');
    364299      return true;
    365300    },
     
    444379  },
    445380
     381  H1: {
     382
     383    compile: (compiler) => {
     384      const item = compiler.compileVariable('browser', 'h1', false, 'dom');
     385      return true;
     386    },
     387
     388    run: (program) => {
     389      return program[program.pc].pc + 1;
     390    }
     391  },
     392
     393  H2: {
     394
     395    compile: (compiler) => {
     396      const item = compiler.compileVariable('browser', 'h2', false, 'dom');
     397      return true;
     398    },
     399
     400    run: (program) => {
     401      return program[program.pc].pc + 1;
     402    }
     403  },
     404
     405  H3: {
     406
     407    compile: (compiler) => {
     408      const item = compiler.compileVariable('browser', 'h3', false, 'dom');
     409      return true;
     410    },
     411
     412    run: (program) => {
     413      return program[program.pc].pc + 1;
     414    }
     415  },
     416
     417  H4: {
     418
     419    compile: (compiler) => {
     420      const item = compiler.compileVariable('browser', 'h4', false, 'dom');
     421      return true;
     422    },
     423
     424    run: (program) => {
     425      return program[program.pc].pc + 1;
     426    }
     427  },
     428
     429  H5: {
     430
     431    compile: (compiler) => {
     432      const item = compiler.compileVariable('browser', 'h5', false, 'dom');
     433      return true;
     434    },
     435
     436    run: (program) => {
     437      return program[program.pc].pc + 1;
     438    }
     439  },
     440
     441  H6: {
     442
     443    compile: (compiler) => {
     444      const item = compiler.compileVariable('browser', 'h6', false, 'dom');
     445      return true;
     446    },
     447
     448    run: (program) => {
     449      return program[program.pc].pc + 1;
     450    }
     451  },
     452
    446453  IMG: {
    447454
     
    542549      const command = program[program.pc];
    543550      if (command.subject) {
    544         window.location.href = `mailto:${program.getValue(command.to)}`
    545           + `?subject=${program.getValue(command.subject)}&body=${program.getValue(command.body)}`;
     551        window.location.href = `mailto:${program.getValue(command.to)}` +
     552          `?subject=${program.getValue(command.subject)}&body=${program.getValue(command.body)}`;
    546553      } else {
    547554        window.location.href = `mailto:${program.getValue(command.to)}`;
     
    649656          break;
    650657        case 'click':
    651           const clickItem = program.getSymbolRecord(command.symbol);
    652           clickItem.value.forEach(function (value, index) {
    653             const cssId = value.content;
    654             if (cssId) {
    655               const target = document.getElementById(cssId);
    656               target.targetPc = command.pc + 2;
    657               target.targetIndex = index;
    658               target.onclick = function (event) {
    659                 const eventTarget = event.target;
    660                 eventTarget.blur();
    661                 clickItem.index = eventTarget.targetIndex;
    662                 setTimeout(function () {
    663                   program.run(eventTarget.targetPc);
    664                 }, 1);
    665                 return false;
    666               };
    667             }
     658          const targetRecord = program.getSymbolRecord(command.symbol);
     659
     660          targetRecord.element.forEach(function (element, index) {
     661            var target = targetRecord.element[index];
     662            target.targetRecord = targetRecord;
     663            target.targetIndex = index;
     664            target.targetPc = command.pc + 2;
     665            target.onclick = function (event) {
     666              const eventTarget = event.target;
     667              eventTarget.blur();
     668              eventTarget.targetRecord.index = eventTarget.targetIndex;
     669              setTimeout(function () {
     670                program.run(eventTarget.targetPc);
     671              }, 1);
     672              return false;
     673            };
    668674          });
    669675          break;
     
    677683              }, 1);
    678684            } catch (err) {
    679               console.log('Error: ' + err.message);
     685              console.log(`Error: ${err.message}`);
    680686            }
    681687            return true;
     
    782788    }
    783789  },
    784  
     790
    785791  Put: {
    786792
     
    812818      const command = program[program.pc];
    813819      window.localStorage.setItem(program.getValue(command.key), program.getValue(command.value));
     820      return command.pc + 1;
     821    }
     822  },
     823
     824  Remove: {
     825
     826    compile: (compiler) => {
     827      const lino = compiler.getLino();
     828      if (compiler.nextTokenIs('attribute')) {
     829        const attribute = compiler.getNextValue();
     830        if (compiler.tokenIs('of')) {
     831          if (compiler.nextIsSymbol()) {
     832            const targetRecord = compiler.getSymbolRecord();
     833            if (targetRecord.extra !== 'dom') {
     834              throw new Error(`Inappropriate type '${targetRecord.keyword}'`);
     835            }
     836            compiler.next();
     837            compiler.addCommand({
     838              domain: 'browser',
     839              keyword: 'remove',
     840              lino,
     841              attribute,
     842              target: targetRecord.name
     843            });
     844            return true;
     845          }
     846        }
     847      }
     848      return false;
     849    },
     850
     851    // runtime
     852
     853    run: (program) => {
     854      const command = program[program.pc];
     855      const attribute = program.getValue(command.attribute);
     856      const targetRecord = program.getSymbolRecord(command.target);
     857      targetId = program.getValue(targetRecord.value[targetRecord.index]);
     858      target = document.getElementById(targetId);
     859      target.removeAttribute(attribute);
    814860      return command.pc + 1;
    815861    }
     
    900946            throw new Error(`Expected a symbol at '{compiler.getToken()}'`);
    901947          }
     948        } else if (token === 'id') {
     949          if (compiler.nextTokenIs('of')) {
     950            if (compiler.nextIsSymbol()) {
     951              const symbol = compiler.getSymbolRecord();
     952              if (symbol.extra === 'dom') {
     953                if (compiler.nextTokenIs('to')) {
     954                  const value = compiler.getNextValue();
     955                  compiler.addCommand({
     956                    domain: 'browser',
     957                    keyword: 'set',
     958                    lino,
     959                    type: 'setId',
     960                    symbolName: symbol.name,
     961                    value
     962                  });
     963                  return true;
     964                }
     965              }
     966            }
     967          }
    902968        } else if (token === 'text') {
    903969          if (compiler.nextTokenIs('of')) {
    904             compiler.next();
    905             if (compiler.isSymbol()) {
     970            if (compiler.nextIsSymbol()) {
    906971              const symbol = compiler.getSymbolRecord();
    907972              switch (symbol.keyword) {
     
    909974                case 'input':
    910975                  if (compiler.nextTokenIs('to')) {
    911                     compiler.next();
    912                     const value = compiler.getValue();
     976                    const value = compiler.getNextValue();
    913977                    compiler.addCommand({
    914978                      domain: 'browser',
     
    9771041          }
    9781042        } else if (token === 'style') {
    979           const styleName = compiler.getNextValue();
     1043          if (compiler.nextTokenIs('of')) {
     1044            if (compiler.nextIsSymbol()) {
     1045              const symbolRecord = compiler.getSymbolRecord();
     1046              symbolName = symbolRecord.name;
     1047              if (symbolRecord.extra !== 'dom') {
     1048                compiler.warning(`'${symbolName}' is not a DOM type`);
     1049                return false;
     1050              }
     1051              if (compiler.nextTokenIs('to')) {
     1052                const styleValue = compiler.getNextValue();
     1053                if (styleValue) {
     1054                  compiler.addCommand({
     1055                    domain: 'browser',
     1056                    keyword: 'set',
     1057                    lino,
     1058                    type: 'setStyles',
     1059                    symbolName,
     1060                    styleValue
     1061                  });
     1062                  return true;
     1063                }
     1064              }
     1065            }
     1066            compiler.warning(`'${compiler.getToken()}' is not a symbol`);
     1067            return false;
     1068          }
     1069          const styleName = compiler.getValue();
    9801070          var type = 'setStyle';
    9811071          var symbolName = '';
    9821072          if (compiler.tokenIs('of')) {
    983 
    9841073            if (compiler.nextToken() === 'body') {
    9851074              type = 'setBodyStyle';
    9861075            } else if (compiler.isSymbol()) {
    987               symbolName = compiler.getToken();
     1076              const symbolRecord = compiler.getSymbolRecord();
     1077              symbolName = symbolRecord.name;
     1078              if (symbolRecord.extra !== 'dom') {
     1079                throw Error(`'${symbolName}' is not a DOM type`);
     1080              }
    9881081            } else {
    9891082              throw Error(`'${compiler.getToken()}' is not a known symbol`);
    9901083            }
    991             compiler.next();
    992             if (compiler.tokenIs('to')) {
     1084            if (compiler.nextTokenIs('to')) {
    9931085              const styleValue = compiler.getNextValue();
    9941086              if (styleValue) {
     
    10081100        }
    10091101      }
    1010       compiler.addWarning('Unrecognised syntax in \'set\'');
     1102      compiler.addWarning(`Unrecognised syntax in 'set'`);
    10111103      return false;
    10121104    },
     
    10251117          targetVar = program.getSymbolRecord(command.target);
    10261118          const source = document.getElementById(sourceVar.value[sourceVar.index].content);
    1027           target = document.getElementById(targetVar.value[targetVar.index].content);
     1119          target = targetVar.element[targetVar.index];
     1120          if (!target) {
     1121            targetId = program.getValue(targetVar.value[targetVar.index]);
     1122            target = document.getElementById(targetId);
     1123          }
    10281124          target.innerHTML = source.innerHTML;
    10291125          break;
    10301126        case 'setContent':
    1031           const valueSpec = program.value.evaluate(program, command.value);
    1032           value = valueSpec.content;
    1033           if (valueSpec.numeric) {
    1034             value = '' + value;
    1035           }
     1127          value = program.getValue(command.value);
     1128          // 2018-12-14
     1129          // if (valueSpec.numeric) {
     1130          //   value = '' + value;
     1131          // }
    10361132          targetVar = program.getSymbolRecord(command.target);
    1037           cssId = targetVar.value[targetVar.index].content;
    1038           if (!cssId) {
    1039             program.runtimeError(command.lino,
    1040               'Variable \'' + targetVar.name + '\' has not been attached to a DOM element.');
    1041           }
    1042           target = document.getElementById(cssId);
     1133          target = targetVar.element[targetVar.index];
     1134          if (!target) {
     1135            cssId = targetVar.value[targetVar.index].content;
     1136            if (!cssId) {
     1137              program.runtimeError(command.lino,
     1138                `Variable '${targetVar.name}' has not been attached to a DOM element.`);
     1139            }
     1140            target = document.getElementById(cssId);
     1141          }
     1142          targetVar.element[targetVar.index] = target;
    10431143          switch (targetVar.keyword) {
    10441144            case 'text':
     
    10541154          }
    10551155          break;
     1156        case 'setId':
     1157          symbol = program.getSymbolRecord(command.symbolName);
     1158          target = symbol.element[symbol.index];
     1159          if (!target) {
     1160            targetId = program.getValue(symbol.value[symbol.index]);
     1161            target = document.getElementById(targetId);
     1162          }
     1163          target.id = program.getValue(command.value);
     1164          break;
    10561165        case 'setText':
    10571166          symbol = program.getSymbolRecord(command.symbolName);
    1058           target = document.getElementById(symbol.value[symbol.index].content);
    1059           value = program.value.evaluate(program, command.value).content;
     1167          target = symbol.element[symbol.index];
     1168          if (!target) {
     1169            targetId = program.getValue(symbol.value[symbol.index]);
     1170            target = document.getElementById(targetId);
     1171          }
     1172          value = program.getValue(command.value);
    10601173          switch (symbol.keyword) {
    10611174            case 'button':
     
    10721185          symbol = program.getSymbolRecord(command.symbolName);
    10731186          if (symbol.keyword === 'input') {
    1074             targetId = symbol.value[symbol.index].content;
    1075             target = document.getElementById(targetId);
     1187            target = symbol.element[symbol.index];
     1188            if (!target) {
     1189              targetId = program.getValue(symbol.value[symbol.index]);
     1190              target = document.getElementById(targetId);
     1191            }
    10761192            target.size = program.getValue(command.value);
    10771193          } else {
     
    10811197        case 'setAttribute':
    10821198          symbol = program.getSymbolRecord(command.symbolName);
    1083           targetId = program.getValue(symbol.value[symbol.index]);
    1084           target = document.getElementById(targetId);
     1199          target = symbol.element[symbol.index];
     1200          if (!target) {
     1201            targetId = program.getValue(symbol.value[symbol.index]);
     1202            target = document.getElementById(targetId);
     1203          }
    10851204          const attributeName = program.getValue(command.attributeName);
    10861205          if (command.attributeValue.type === 'boolean') {
     
    10911210          break;
    10921211        case 'setStyle':
     1212        case 'setStyles':
    10931213          symbol = program.getSymbolRecord(command.symbolName);
    1094           const styleValue = program.value.evaluate(program, command.styleValue);
     1214          target = symbol.element[symbol.index];
     1215          if (!target) {
     1216            targetId = program.getValue(symbol.value[symbol.index]);
     1217            target = document.getElementById(targetId);
     1218          }
     1219          const styleValue = program.getValue(command.styleValue);
    10951220          if (!symbol.value[symbol.index]) {
    10961221            program.runtimeError(command.lino, `Variable '${symbol.name}' has not been assigned.`);
    10971222          }
    1098           targetId = symbol.value[symbol.index].content;
    1099           const styleTarget = document.getElementById(targetId);
    1100           const styles = {};
    1101           styles[command.styleName.content] = styleValue.content;
    1102           Object.assign(styleTarget.style, styles);
     1223          switch (command.type) {
     1224            case 'setStyle':
     1225              target.style[command.styleName.content] = styleValue;
     1226              break;
     1227            case 'setStyles':
     1228              target.style.cssText = styleValue;
     1229              break;
     1230          }
    11031231          break;
    11041232        case 'setBodyStyle':
    1105           const bodyStyleValue = program.value.evaluate(program, command.styleValue);
     1233          const bodyStyleValue = program.getValue(command.styleValue);
    11061234          document.body.style[command.styleName.content] = bodyStyleValue.content;
    11071235          break;
     
    13511479      case 'get':
    13521480        return EasyCoder_Browser.Get;
    1353       case 'header':
    13541481      case 'h1':
     1482        return EasyCoder_Browser.H1;
    13551483      case 'h2':
     1484        return EasyCoder_Browser.H2;
    13561485      case 'h3':
     1486        return EasyCoder_Browser.H3;
    13571487      case 'h4':
     1488        return EasyCoder_Browser.H4;
    13581489      case 'h5':
     1490        return EasyCoder_Browser.H5;
    13591491      case 'h6':
    1360         return EasyCoder_Browser.Header;
     1492        return EasyCoder_Browser.H6;
    13611493      case 'img':
    13621494        return EasyCoder_Browser.IMG;
     
    13831515      case 'put':
    13841516        return EasyCoder_Browser.Put;
     1517      case 'remove':
     1518        return EasyCoder_Browser.Remove;
    13851519      case 'select':
    13861520        return EasyCoder_Browser.SELECT;
     
    14081542    const handler = EasyCoder_Browser.getHandler(command.keyword);
    14091543    if (!handler) {
    1410       program.runtimeError(command.lino, 'Unknown keyword \'' + command.keyword
    1411         + '\' in \'browser\' package');
     1544      program.runtimeError(command.lino, `Unknown keyword '${command.keyword}' in 'browser' package`);
    14121545    }
    14131546    return handler.run(program);
     
    15811714            domain: 'browser',
    15821715            type: 'boolean',
    1583             content: (typeof window.orientation !== "undefined")
    1584               || (navigator.userAgent.indexOf('IEMobile') !== -1)
     1716            content: (typeof window.orientation !== "undefined") ||
     1717              (navigator.userAgent.indexOf('IEMobile') !== -1)
    15851718          };
    15861719        case 'br':
     
    16561789          let hex = styleValue.toString(16);
    16571790          while (hex.length < 6) {
    1658             hex = '00' + hex;
     1791            hex = `00${hex}`;
    16591792          }
    16601793          return {
    16611794            type: 'constant',
    16621795            numeric: false,
    1663             content: '#' + hex
     1796            content: `#${hex}`
    16641797          };
    16651798          break;
     
    17051838      const style = item.split(':');
    17061839      element.setAttribute(style[0], style[1]);
    1707     }
    1708     ;
     1840    };
    17091841  }
    17101842};
  • easycoder/trunk/plugins/json.js

    r1990067 r1996019  
    338338              case 200:
    339339              case 201:
     340                const loaded = Date.now();
     341                console.log(`${loaded - program.EasyCoder.timestamp} ms: Request completed`);
    340342                if (command.request === 'get') {
    341343                  var content = this.responseText;
  • easycoder/trunk/plugins/svg.js

    r1990067 r1996019  
    133133          case 'line':
    134134          case 'rect':
    135           case 'text':
     135          case 'svgtext':
    136136            if (compiler.tokenIs('in')) {
    137137              if (compiler.nextIsSymbol()) {
     
    164164                  keyword: 'create',
    165165                  lino,
    166                   type: symbolRecord.keyword,
     166                  type: symbolRecord.keyword === 'svgtext' ? 'text' : symbolRecord.keyword,
    167167                  name: symbolRecord.name,
    168168                  style,
     
    190190        symbolRecord.y = 0;
    191191      } else {
    192         if (parentRecord.keyword === 'group') {
     192        if (parentRecord.keyword === 'group') { 
    193193          group = parentRecord;
    194194          // Add this element to the group
     
    208208        const container = document.getElementById(parentRecord.value[parentRecord.index].content);
    209209        const element = document.createElementNS(ns, command.type);
     210        symbolRecord.element[symbolRecord.index] = element;
    210211        container.appendChild(element);
    211212        // Set the id
    212213        const id = 'ec-' + symbolRecord.name + '-' + symbolRecord.index;
    213214        element.setAttribute('id', id);
    214         if (symbolRecord.keyword === 'text') {
     215        if (symbolRecord.keyword === 'svgtext') {
    215216          element.textContent = program.value.evaluate(program, command.text).content;
    216217        }
     
    238239              break;
    239240            case 'rect':
    240             case 'text':
     241            case 'svgtext':
    241242              value.x = element.getAttribute('x');
    242243              value.y = element.getAttribute('y');
     
    340341                break;
    341342              case 'rect':
    342               case 'text':
     343              case 'svgtext':
    343344                element.setAttribute('x', x);
    344345                element.setAttribute('y', y);
     
    353354        case 'line':
    354355        case 'rect':
    355         case 'text':
     356        case 'svgtext':
    356357          var px = 0;
    357358          var py = 0;
     
    379380              break;
    380381            case 'rect':
    381             case 'text':
     382            case 'svgtext':
    382383              element.setAttribute('x', px + newX);
    383384              element.setAttribute('y', py + newY);
     
    426427          }
    427428      }
    428       compiler.addWarning('Unrecognised syntax in \'on\'');
     429      compiler.addWarning(`Unrecognised syntax in 'on'`);
    429430      return false;
    430431    },
     
    507508            const symbol = compiler.getSymbolRecord();
    508509            switch (symbol.keyword) {
    509               case 'text':
     510              case 'svgtext':
    510511                if (compiler.nextTokenIs('to')) {
    511512                  compiler.next();
     
    546547          value = program.value.evaluate(program, command.value).content;
    547548          switch (symbol.keyword) {
    548             case 'text':
     549            case 'svgtext':
    549550              target.innerHTML = value;
    550551              break;
     
    572573  },
    573574
    574   Text: {
    575 
    576     compile: (compiler) => {
    577       const item = compiler.compileVariable('svg', 'text', false, 'dom');
     575  SVGText: {
     576
     577    compile: (compiler) => {
     578      const item = compiler.compileVariable('svg', 'svgtext', false, 'dom');
    578579      return true;
    579580    },
     
    608609      case 'svg':
    609610        return EasyCoder_SVG.SVG;
    610       case 'text':
    611         return EasyCoder_SVG.Text;
     611      case 'svgtext':
     612        return EasyCoder_SVG.SVGText;
    612613      default:
    613614        return false;
     
    635636            const symbolRecord = compiler.getSymbolRecord();
    636637            compiler.next();
    637             if (symbolRecord.keyword === 'text') {
     638            if (symbolRecord.keyword === 'svgtext') {
    638639              return {
    639640                domain: 'svg',
    640                 type: 'text',
     641                type: 'svgtext',
    641642                name: symbolRecord.name
    642643              };
     
    650651    get: (program, value) => {
    651652      switch (value.type) {
    652         case 'text':
     653        case 'svgtext':
    653654          const symbolRecord = program.getSymbolRecord(value.name);
    654655//          console.log('symbolRecord: ' + JSON.stringify(symbolRecord.value[symbolRecord.index], null, 2));
  • easycoder/trunk/readme.txt

    r1990067 r1996019  
    5050
    5151== Changelog ==
     52
     53= 2.1.8 16-dec-2018 =
     54* All UI components can be created programmatically.
    5255
    5356= 2.1.7 09-dec-2018 =
  • easycoder/trunk/rest.php

    r1990067 r1996019  
    204204                        $count = $request[1];
    205205                        break;
    206                     case 2:
     206                    case 3:
    207207                        $offset = $request[1];
    208208                        $count = $request[2];
     
    293293                        case 'name':
    294294                            // Set by name. If the record does not exist, add it
    295                             $value = $_POST['value'];
     295                            header("Content-Type: application/text");
     296                            $value = stripslashes(file_get_contents("php://input"));
    296297                            $name = $request[2];
    297298                            // See if there's an item with this name
Note: See TracChangeset for help on using the changeset viewer.