Changeset 1949051
- Timestamp:
- 09/29/2018 12:44:36 PM (8 years ago)
- Location:
- easycoder/trunk
- Files:
-
- 4 edited
-
easycoder-min.js (modified) (2 diffs)
-
easycoder.js (modified) (80 diffs)
-
easycoder.php (modified) (2 diffs)
-
readme.txt (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
easycoder/trunk/easycoder-min.js
r1885298 r1949051 2 2 $jscomp.initSymbol=function(){$jscomp.initSymbol=function(){};$jscomp.global.Symbol||($jscomp.global.Symbol=$jscomp.Symbol)};$jscomp.Symbol=function(){var e=0;return function(k){return $jscomp.SYMBOL_PREFIX+(k||"")+e++}}(); 3 3 $jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var e=$jscomp.global.Symbol.iterator;e||(e=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol("iterator"));"function"!=typeof Array.prototype[e]&&$jscomp.defineProperty(Array.prototype,e,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}});$jscomp.initSymbolIterator=function(){}};$jscomp.arrayIterator=function(e){var k=0;return $jscomp.iteratorPrototype(function(){return k<e.length?{done:!1,value:e[k++]}:{done:!0}})}; 4 $jscomp.iteratorPrototype=function(e){$jscomp.initSymbolIterator();e={next:e};e[$jscomp.global.Symbol.iterator]=function(){return this};return e};$jscomp.makeIterator=function(e){$jscomp.initSymbolIterator(); var k=e[Symbol.iterator];return k?k.call(e):$jscomp.arrayIterator(e)};4 $jscomp.iteratorPrototype=function(e){$jscomp.initSymbolIterator();e={next:e};e[$jscomp.global.Symbol.iterator]=function(){return this};return e};$jscomp.makeIterator=function(e){$jscomp.initSymbolIterator();$jscomp.initSymbol();$jscomp.initSymbolIterator();var k=e[Symbol.iterator];return k?k.call(e):$jscomp.arrayIterator(e)}; 5 5 $jscomp.polyfill=function(e,k,h,g){if(k){h=$jscomp.global;e=e.split(".");for(g=0;g<e.length-1;g++){var a=e[g];a in h||(h[a]={});h=h[a]}e=e[e.length-1];g=h[e];k=k(g);k!=g&&null!=k&&$jscomp.defineProperty(h,e,{configurable:!0,writable:!0,value:k})}};$jscomp.polyfill("Math.trunc",function(e){return e?e:function(e){e=Number(e);if(isNaN(e)||Infinity===e||-Infinity===e||0===e)return e;var k=Math.floor(Math.abs(e));return 0>e?-k:k}},"es6","es3"); 6 6 $jscomp.polyfill("Object.is",function(e){return e?e:function(e,h){return e===h?0!==e||1/e===1/h:e!==e&&h!==h}},"es6","es3");$jscomp.polyfill("Array.prototype.includes",function(e){return e?e:function(e,h){var g=this;g instanceof String&&(g=String(g));var a=g.length;h=h||0;for(0>h&&(h=Math.max(h+a,0));h<a;h++){var b=g[h];if(b===e||Object.is(b,e))return!0}return!1}},"es7","es3"); … … 10 10 $jscomp.polyfill("String.prototype.endsWith",function(e){return e?e:function(e,h){var g=$jscomp.checkStringArgs(this,e,"endsWith");e+="";void 0===h&&(h=g.length);h=Math.max(0,Math.min(h|0,g.length));for(var a=e.length;0<a&&0<h;)if(g[--h]!=e[--a])return!1;return 0>=a}},"es6","es3");$jscomp.polyfill("Number.isFinite",function(e){return e?e:function(e){return"number"!==typeof e?!1:!isNaN(e)&&Infinity!==e&&-Infinity!==e}},"es6","es3"); 11 11 $jscomp.polyfill("Number.isInteger",function(e){return e?e:function(e){return Number.isFinite(e)?e===Math.floor(e):!1}},"es6","es3"); 12 (function(){function e(k,h,g){function a(c,f){if(!h[c]){if(!k[c]){var d="function"==typeof require&&require;if(!f&&d)return d(c,!0);if(b)return b(c,!0);f=Error("Cannot find module '"+c+"'");throw f.code="MODULE_NOT_FOUND",f;}f=h[c]={exports:{}};k[c][0].call(f.exports,function(b){return a(k[c][1][b]||b)},f,f.exports,e,k,h,g)}return h[c].exports}for(var b="function"==typeof require&&require,c=0;c<g.length;c++)a(g[c]);return a}return e})()({1:[function(e,k,h){var g=this,a=e("./easycoder/Tokenise"),b= 13 e("./easycoder/Compile"),c=e("./easycoder/Run"),d=e("./easycoder/Value"),f=e("./easycoder/Condition"),l=e("./easycoder/Compare");k=e("./domain/Basic");h=e("./domain/Browser");var n=e("./domain/Json");e=e("./domain/Svg");var m={domain:{basic:k,browser:h,json:n,svg:e},compileError:{dontUnderstandError:function(b){throw Error("I don't understand '"+b+"'");},duplicateSymbolError:function(b){throw Error("Symbol '"+b+"' is a duplicate");},inappropriateTypeError:function(b){throw Error("Inappropriate type '"+ 14 b+"'");},inappropriateVariableTypeError:function(b){throw Error("Inappropriate variable type '"+b+"'");},noSuchVariableError:function(b){throw Error("No such variable: "+b);},notAnIntegerError:function(b){throw Error("Value is not an integer: "+b);},undefinedValueError:function(b){throw Error("Undefined value: "+b);},unknownTypeError:function(b){throw Error("Unknown type: "+b);},unknownVariableError:function(b){throw Error("Unknown variable: "+b);},unrecognisedValueError:function(b){throw Error("I don't understand this value: "+ 15 b);},variableDoesNotHoldAValueError:function(b){throw Error("Variable '"+b+"' does not hold a value");}},runtimeError:{arrayIndexOutOfRangeError:function(b){throw Error("Array index out of range for "+b);},cantDecodeValueError:function(){throw Error("Can't decode value");},dataTypeMismatchError:function(){throw Error("Data type mismatch");},nonNumericValueError:function(){throw Error("Non-numeric value");},noSuchElementError:function(b){throw Error("No such element: "+b);},runtimeError:function(b){throw Error(b); 16 },undefinedValueError:function(b,a){g.errorPc=a;throw Error("Undefined value: "+b);},variableDoesNotHoldAValueError:function(b){throw Error("Variable '"+b+"' does not hold a value");}},setupTracer:function(){var b=document.getElementById("easycoder-tracer");b&&(b.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>', 17 b.style.display="none")},reportError:function(a,c){var d=b.getProgram(),f=a.tokens;a=a.scriptLines;f=g.compiling?f[b.getIndex()].lino:d.pc.lino;d="";var l=f-5;for(l=0>l?0:l;l<f;l++){for(var e=""+l;4>e.length;)e=" "+e;d+=e+" "+a[l].line+"\n"}d+=c.message+"\n";c=b.getWarnings();if(c.length)for(d+="Warnings:\n",c=$jscomp.makeIterator(c),a=c.next();!a.done;a=c.next())d+=a.value+"\n";console.log(d);alert(d)},getSymbolRecord:function(b,a){a=b[b.symbols[a].pc];return a.alias?b[b.symbols[a.alias].pc]:a}, 18 compileScript:function(a){var e=a.tokens;try{g.compiling=!0;var h=Date.now();b.value=d;b.condition=f;b.domain=m.domain;b.error=m.compileError;var n=b.compile(e),k=Date.now();console.log("Compiled "+e.length+" tokens in "+(k-h)+"ms");g.compiling=!1;n.source=a;n.run=c;n.value=d;n.condition=f;n.compare=l;n.domain=m.domain;n.getSymbolRecord=m.getSymbolRecord;n.error=m.runtimeError;n.reportError=m.reportError;n.symbols=b.getSymbols();n.encoding="none";n.popups=[];n.stack=[];n.queue=[0];m.setupTracer(); 19 console.log("Run the script");n.run(n,0)}catch(u){m.reportError(a,u)}},start:function(b){try{var c=Date.now(),d=a.tokenise(b),f=Date.now();console.log("Tokenised "+d.scriptLines.length+" lines in "+(f-c)+"ms");m.compileScript(d)}catch(r){console.log(r)}}};console.log("Starting EasyCoder...");window.onload=function(){var b=document.getElementById("easycoder-script");b&&(b.style.display="none",m.start(b.innerText))}},{"./domain/Basic":2,"./domain/Browser":3,"./domain/Json":4,"./domain/Svg":5,"./easycoder/Compare":6, 20 "./easycoder/Compile":7,"./easycoder/Condition":8,"./easycoder/Run":9,"./easycoder/Tokenise":10,"./easycoder/Value":11}],2:[function(e,k,h){var g=this,a={Add:{compile:function(b){var a=b.getLino();b.next();var d=b.getValue();if(b.tokenIs("to"))if(b.next(),b.getToken(),b.isSymbol()){var f=b.getSymbol();if(b.getCommandAt(f.pc).isValueHolder){if("giving"===b.peek()){f=b.getValue();b.next();var l=b.getToken();b.next();b.addCommand({domain:"basic",keyword:"add",lino:a,value1:d,value2:f,target:l})}else f= 21 b.getToken(),b.next(),b.addCommand({domain:"basic",keyword:"add",lino:a,value1:d,target:f});return!0}b.warning("basic "+g.name+"': Expected value holder")}else{f=b.getValue();if(b.tokenIs("giving"))return b.next(),l=b.getToken(),b.next(),b.addCommand({domain:"basic",keyword:"add",lino:a,value1:d,value2:f,target:l}),!0;b.warning("basic "+g.name+'\': Expected "giving"')}return!1},run:function(b){var a=b[b.pc],d=a.value1,f=a.value2,l=b.getSymbolRecord(b,a.target);if(l.isValueHolder){var e=l.value[l.index]; 22 f?(b=b.value.evaluate(b,f).content+b.value.evaluate(b,d).content,l.value[l.index]={type:"constant",numeric:!0,content:b}):(e.numeric||b.error.nonNumericValueError(),b=e.content+b.value.evaluate(b,d).content,l.value[l.index]={type:"constant",numeric:!0,content:b})}else b.error.VariableDoesNotHoldAValueError(l.name);return a.pc+1}},Alias:{compile:function(b){var a=b.getLino();b.next();if(b.isSymbol()){var d=b.getToken();b.next();if(b.tokenIs("to")&&(b.next(),b.isSymbol())){var f=b.getToken();b.next(); 23 b.addCommand({domain:"basic",keyword:"alias",lino:a,alias:d,symbol:f});return!0}}return!1},run:function(b){var a=b[b.pc],d=b.symbols[a.alias].pc,f=b[d],l=b.getSymbolRecord(b,a.symbol);b[d]={pc:f.pc,domain:l.domain,keyword:l.keyword,lino:f.lino,name:f.name,alias:a.symbol};return a.pc+1}},Begin:{compile:function(b){b.next();b.compileFromHere(["end"]);return!0},run:function(b){return b[b.pc].pc+1}},Clear:{compile:function(b){var a=b.getLino();b.next();if(b.isSymbol()){var d=b.getToken();b.next();b.addCommand({domain:"basic", 24 keyword:"clear",lino:a,symbol:d});return!0}return!1},run:function(b){var a=b[b.pc],d=b.getSymbolRecord(b,a.symbol);d.isValueHolder?(b.domain[d.domain].value.put(d,{type:"boolean",content:!1}),a.numeric=!1):b.error.VariableDoesNotHoldAValueError(d.name);return a.pc+1}},Debug:{compile:function(b){var a=b.getLino();b.next();if(b.tokenIs("program")){b.next();if(b.tokenIs("item")||b.tokenIs("pc")){b.next();var d=b.getValue();b.addCommand({domain:"basic",keyword:"debug",lino:a,item:d});return!0}b.addCommand({domain:"basic", 25 keyword:"debug",lino:a,item:-1});return!0}if(b.tokenIs("symbols"))return b.next(),b.addCommand({domain:"basic",keyword:"debug",lino:a,item:"symbols"}),!0;if(b.tokenIs("symbol"))return b.next(),d=b.getToken(),b.next(),b.addCommand({domain:"basic",keyword:"debug",lino:a,item:"symbol",name:d}),!0;program.error.NoSuchVariableError(b.getToken())},run:function(b){var a=b[b.pc],d=a.item;switch(d){case "symbols":console.log("Symbols: "+JSON.stringify(b.symbols,null,2));break;case "symbol":console.log("Symbol: "+ 26 JSON.stringify(b.getSymbolRecord(b,a.name),null,2));break;default:0<=d.content?console.log("Debug item "+d.content+": "+JSON.stringify(b[d.content],null,2)):console.log("Debug program: "+JSON.stringify(b,null,2))}return a.pc+1}},Divide:{compile:function(b){var a=b.getLino();b.next();b.getToken();if(b.isSymbol()){var d=b.getSymbol();var f=b.getCommandAt(d.pc).name}d=b.getValue();b.tokenIs("by")&&b.next();var l=b.getValue();if(b.tokenIs("giving")){b.next();if(b.isSymbol())return f=b.getSymbol(),f=b.getCommandAt(f.pc).name, 27 b.next(),b.addCommand({domain:"basic",keyword:"divide",lino:a,value1:d,value2:l,target:f}),!0;b.warning("basic "+g.name+"': Expected value holder")}else return void 0===f&&b.warning("basic "+g.name+"': No target variable given"),b.addCommand({domain:"basic",keyword:"divide",lino:a,value2:l,target:f}),!0;return!1},run:function(b){var a=b[b.pc],d=a.value1,f=a.value2,l=b.getSymbolRecord(b,a.target);if(l.isValueHolder){var e=l.value[l.index];d?(b=b.value.evaluate(b,d).content/b.value.evaluate(b,f).content, 28 l.value[l.index]={type:"constant",numeric:!0,content:Math.trunc(b)}):(e.numeric||b.error.nonNumericValueError(),b=e.content/b.value.evaluate(b,f).content,l.value[l.index]={type:"constant",numeric:!0,content:Math.trunc(b)})}else b.error.VariableDoesNotHoldAValueError(l.name);return a.pc+1}},End:{compile:function(b){b.next();return!0},run:function(){return 0}},Extend:{compile:function(b){var a=b.getLino();b.next();var d=b.getValue(),f=b.getValue();b.addCommand({domain:"basic",keyword:"extend",lino:a, 29 request:d,data:f});return!0},run:function(b){var a=b[b.pc];try{if("function"===typeof EasyCoder_extension){var d=b.value.evaluate(b,a.request).content,f=b.value.evaluate(b,a.data).content;EasyCoder_extension(b,d,f)}else b.error.runtimeError("No extension found")}catch(l){b.error.runtimeError(l.message)}return a.pc+1}},Fork:{compile:function(b){var a=b.getLino();b.next();b.tokenIs("to")&&b.next();var d=b.getToken();b.next();b.addCommand({domain:"basic",keyword:"fork",lino:a,label:d});return!0},run:function(b){var a= 30 b[b.pc];try{b.run(b,b.symbols[a.label].pc)}catch(d){console.log(d.message),alert(d.message)}return a.pc+1}},Go:{compile:function(b){var a=b.getLino();b.next();b.tokenIs("to")&&b.next();var d=b.getToken();b.next();b.addCommand({domain:"basic",keyword:"goto",lino:a,label:d});return!0},run:function(b){return b[b.pc].pc+1}},Gosub:{compile:function(b){var a=b.getLino();b.next();b.tokenIs("to")&&b.next();var d=b.getToken();b.next();b.addCommand({domain:"basic",keyword:"gosub",lino:a,label:d});return!0}, 31 run:function(b){var a=b[b.pc];b.stack.push(b.pc+1);return b.symbols[a.label].pc}},Goto:{compile:function(b){var a=b.getLino();b.next();var d=b.getToken();b.next();b.addCommand({domain:"basic",keyword:"goto",lino:a,label:d});return!0},run:function(a){var b=a[a.pc];return b.label?a.symbols[b.label].pc:b.goto}},If:{compile:function(a){var b=a.getLino();a.next();var d=a.condition.compile(a),f=a.getPc();a.addCommand({domain:"basic",keyword:"if",lino:b,condition:d});a.compileOne();if(!a.getToken())return a.getCommandAt(f).else= 32 a.getPc(),!0;a.tokenIs("else")?(b=a.getPc(),a.addCommand({domain:"basic",keyword:"goto",goto:0}),a.getCommandAt(f).else=a.getPc(),a.next(),a.compileOne(!0),a.getCommandAt(b).goto=a.getPc()):a.getCommandAt(f).else=a.getPc();return!0},run:function(a){var b=a[a.pc];return a.condition.test(a,b.condition)?b.pc+1:b.else}},Index:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var d=a.getToken();a.next();if(a.tokenIs("to")){a.next();var f=a.getValue();a.addCommand({domain:"basic", 33 keyword:"index",lino:b,symbol:d,value:f});return!0}}return!1},run:function(a){var b=a[a.pc],d=a.getSymbolRecord(a,b.symbol);d.index=a.value.evaluate(a,b.value).content;d.index>=d.elements&&a.error.arrayIndexOutOfRangeError(d.name);return b.pc+1}},Multiply:{compile:function(a){var b=a.getLino();a.next();a.getToken();if(a.isSymbol()){var d=a.getSymbol();var f=a.getCommandAt(d.pc).name}d=a.getValue();a.tokenIs("by")&&a.next();var e=a.getValue();if(a.tokenIs("giving")){a.next();if(a.isSymbol())return f= 34 a.getSymbol(),f=a.getCommandAt(f.pc).name,a.next(),a.addCommand({domain:"basic",keyword:"multiply",lino:b,value1:d,value2:e,target:f}),!0;a.warning("basic multiply': Expected value holder")}else return void 0===f&&a.warning("basic multiply': No target variable given"),a.addCommand({domain:"basic",keyword:"multiply",lino:b,value2:e,target:f}),!0;return!1},run:function(a){var b=a[a.pc],d=b.value1,f=b.value2,e=a.getSymbolRecord(a,b.target);if(e.isValueHolder){var g=e.value[e.index];d?(a=a.value.evaluate(a, 35 d).content*a.value.evaluate(a,f).content,e.value[e.index]={type:"constant",numeric:!0,content:a}):(g.numeric||a.error.nonNumericValueError(),a=g.content*a.value.evaluate(a,f).content,e.value[e.index]={type:"constant",numeric:!0,content:a})}else a.error.VariableDoesNotHoldAValueError(e.name);return b.pc+1}},Negate:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var d=a.getToken();a.next();a.addCommand({domain:"basic",keyword:"negate",lino:b,symbol:d});return!0}return!1}, 36 run:function(a){var b=a[a.pc],d=a.getSymbolRecord(a,b.symbol);d.isValueHolder?d.value[d.index]={type:"constant",numeric:!0,content:-d.value[d.index].content}:a.error.VariableDoesNotHoldAValueError(d.name);return b.pc+1}},Print:{compile:function(a){var b=a.getLino();a.next();var d=a.getValue();a.addCommand({domain:"basic",keyword:"print",lino:b,value:d});return!0},run:function(a){var b=a.value.evaluate(a,a[a.pc].value).content;console.log("-> "+b);return a[a.pc].pc+1}},Put:{compile:function(a){var b= 37 a.getLino();a.next();var d=a.getValue();if(a.tokenIs("into")){a.next();if(a.isSymbol()){var f=a.getToken();a.next();a.addCommand({domain:"basic",keyword:"put",lino:b,value:d,target:f});return!0}a.error.noSuchVariableError(a.getToken())}return!1},run:function(a){var b=a[a.pc],d=b.value,f=a.getSymbolRecord(a,b.target);f.isValueHolder||a.error.variableDoesNotHoldAValueError(f.name);f.value[f.index]=a.value.evaluate(a,d);return b.pc+1}},Return:{compile:function(a){var b=a.getLino();a.next();a.addCommand({domain:"basic", 38 keyword:"return",lino:b});return!0},run:function(a){return a.stack.pop()}},Set:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var d=a.getSymbolRecord();if(!d.isValueHolder)return!1;a.next();if(a.tokenIs("to")){a.next();for(var f=[];;){a.mark();try{f.push(a.getValue())}catch(l){a.rewind();break}}a.addCommand({domain:"basic",keyword:"set",lino:b,type:"setArray",target:d.name,value:f});return!0}a.addCommand({domain:"basic",keyword:"set",lino:b,type:"setBoolean",target:d.name});return!0}a.tokenIs("the")&& 39 a.next();return a.tokenIs("elements")&&(a.next(),a.tokenIs("of")&&(a.next(),a.getTarget(),a.isSymbol()||a.error.unknownVariableError(a.getToken()),d=a.getToken(),a.next(),a.tokenIs("to")))?(a.next(),f=a.getValue(),a.addCommand({domain:"basic",keyword:"set",lino:b,type:"setElements",symbol:d,value:f}),!0):!1},run:function(a){var b=a[a.pc];switch(b.type){case "setBoolean":var d=a.getSymbolRecord(a,b.target);d.isValueHolder?(d.value[d.index]={type:"boolean",content:!0},b.numeric=!1):a.error.VariableDoesNotHoldAValueError(d.name); 40 break;case "setElements":d=a.getSymbolRecord(a,b.symbol);d.elements=a.value.evaluate(a,b.value).content;d.index=0;d.value=[];for(a=0;a<d.elements;a++)d.value.push({});break;case "setArray":a=a.getSymbolRecord(a,b.target),a.elements=b.value.length,a.value=b.value}return b.pc+1}},Stop:{compile:function(a){var b=a.getLino();a.next();a.addCommand({domain:"basic",keyword:"stop",lino:b,next:0});return!0},run:function(){return 0}},Take:{compile:function(a){var b=a.getLino();a.next();var d=a.getValue();if(a.tokenIs("from"))if(a.next(), 41 a.getToken(),a.isSymbol()){var f=a.getSymbol();if(a.getCommandAt(f.pc).isValueHolder){if("giving"===a.peek()){f=a.getValue();a.next();var e=a.getToken();a.next();a.addCommand({domain:"basic",keyword:"take",lino:b,value1:d,value2:f,target:e})}else f=a.getToken(),a.next(),a.addCommand({domain:"basic",keyword:"take",lino:b,value1:d,target:f});return!0}a.warning("basic "+g.name+"': Expected value holder")}else{f=a.getValue();if(a.tokenIs("giving"))return a.next(),e=a.getToken(),a.next(),a.addCommand({domain:"basic", 42 keyword:"take",lino:b,value1:d,value2:f,target:e}),!0;a.warning("basic "+g.name+'\': Expected "giving"')}return!1},run:function(a){var b=a[a.pc],d=b.value1,f=b.value2,e=a.getSymbolRecord(a,b.target);if(e.isValueHolder){var g=e.value[e.index];f?(a=a.value.evaluate(a,f).content-a.value.evaluate(a,d).content,e.value[e.index]={type:"constant",numeric:!0,content:a}):(g.numeric||a.error.nonNumericValueError(),a=a.value.evaluate(a,g).content-a.value.evaluate(a,d).content,e.value[e.index]={type:"constant", 43 numeric:!0,content:a})}else a.error.VariableDoesNotHoldAValueError(e.name);return b.pc+1}},Toggle:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var d=a.getSymbolPc();a.next();a.addCommand({domain:"basic",keyword:"toggle",lino:b,symbol:d});return!0}return!1},run:function(a){var b=a[a.pc],d=a[b.symbol];if(d.isValueHolder){var f=a.domain[d.domain];a=f.value.get(a,d.value[d.index]).content;f.value.put(d,{type:"boolean",content:!a})}else a.error.VariableDoesNotHoldAValueError(d.name); 44 return b.pc+1}},Variable:{compile:function(a){a.compileVariable("basic","variable",!0);return!0},run:function(a){return a[a.pc].pc+1}},Wait:{compile:function(a){var b=a.getLino();a.next();var d=a.getValue(a),f=1E3;switch(a.getToken()){case "milli":case "millis":a.next();f=1;break;case "tick":case "ticks":a.next();f=10;break;case "second":case "seconds":a.next();f=1E3;break;case "minute":case "minutes":a.next(),f=6E4}a.addCommand({domain:"basic",keyword:"wait",lino:b,value:d,multiplier:f});return!0}, 45 run:function(a){var b=a[a.pc],d=a.value.evaluate(a,b.value).content;setTimeout(function(){a.run(a,b.pc+1)},d*b.multiplier);return 0}},While:{compile:function(a){var b=a.getLino();a.next();var d=a.condition.compile(a),f=a.getPc();a.addCommand({domain:"basic",keyword:"while",lino:b,condition:d});b=a.getPc();a.addCommand({domain:"basic",keyword:"goto",goto:0});a.compileOne();a.addCommand({domain:"basic",keyword:"goto",goto:f});a.getCommandAt(b).goto=a.getPc();return!0},run:function(a){return a.condition.test(a, 46 a[a.pc].condition)?a.pc+2:a.pc+1}},getHandler:function(b){switch(b){case "add":return a.Add;case "alias":return a.Alias;case "begin":return a.Begin;case "clear":return a.Clear;case "debug":return a.Debug;case "divide":return a.Divide;case "end":return a.End;case "extend":return a.Extend;case "fork":return a.Fork;case "go":return a.Go;case "gosub":return a.Gosub;case "goto":return a.Goto;case "if":return a.If;case "index":return a.Index;case "multiply":return a.Multiply;case "negate":return a.Negate; 47 case "print":return a.Print;case "put":return a.Put;case "return":return a.Return;case "set":return a.Set;case "stop":return a.Stop;case "take":return a.Take;case "toggle":return a.Toggle;case "variable":return a.Variable;case "wait":return a.Wait;case "while":return a.While;default:return!1}},run:function(b){var c=b[b.pc],d=a.getHandler(c.keyword);d||b.error.runtimeError("Unknown keyword '"+c.keyword+"' in 'basic' package");return d.run(b)},isNegate:function(a){return"not"===a.getToken()?(a.next(), 48 !0):!1},value:{compile:function(a){if(a.isSymbol()){var b=a.getToken();a.next();return a.tokenIs("modulo")?(a.next(),a=a.getValue(),{domain:"basic",type:"modulo",name:b,value:a}):{domain:"basic",type:"symbol",name:b}}b=a.getToken();if("true"===b)return a.next(),{domain:"basic",type:"boolean",content:!0};if("false"===b)return a.next(),{domain:"basic",type:"boolean",content:!1};if("random"===b)return a.next(),{domain:"basic",type:"random",range:a.getValue()};if("empty"===b)return a.next(),{domain:"basic", 49 type:"empty"};a.tokenIs("the")&&a.next();b=a.getToken();if("index"===b){if(a.next(),a.tokenIs("of")&&(a.next(),a.isSymbol()))return b=a.getToken(),a.next(),{domain:"basic",type:"index",name:b}}else if("value"===b&&(a.next(),a.tokenIs("of")))return a.next(),{domain:"basic",type:"valueOf",value:a.getValue()};return null},get:function(a,c){switch(c.type){case "boolean":return{type:"boolean",numeric:!1,content:c.content};case "index":return{type:"constant",numeric:!0,content:a.getSymbolRecord(a,c.name).index}; 50 case "random":var b=a.value.evaluate(a,c.range);return{type:"constant",numeric:!0,content:Math.floor(Math.random()*b.content)};case "valueOf":return b=a.value.evaluate(a,c.value),{type:"constant",numeric:!0,content:parseInt(b.content)};case "modulo":return b=a.getSymbolRecord(a,c.name),a=a.value.evaluate(a,c.value),{type:"constant",numeric:!0,content:b.value[b.index].content%a.content};case "empty":return{type:"constant",numeric:!1,content:""}}return null},put:function(a,c){a.value[a.index]=c}},condition:{compile:function(b){if(b.tokenIs("not"))return b.next(), 51 {domain:"basic",type:"not",value:b.getValue()};try{var c=b.getValue();if("is"===b.getToken()){b.next();var d=a.isNegate(b);if(b.tokenIs("greater")){b.next();if(b.tokenIs("than")){b.next();var f=b.getValue();return{domain:"basic",type:"greater",value1:c,value2:f,negate:d}}return null}if(b.tokenIs("less")){b.next();if(b.tokenIs("than")){b.next();var e=b.getValue();return{domain:"basic",type:"less",value1:c,value2:e,negate:d}}return null}var g=b.getValue();return{domain:"basic",type:"is",value1:c,value2:g, 52 negate:d}}if(c)return{domain:"basic",type:"boolean",value:c}}catch(m){console.log(m)}return null},test:function(a,c){switch(c.type){case "boolean":return a.value.evaluate(a,c.value).content;case "is":return a=a.compare(a,c.value1,c.value2),c.negate?0!==a:0===a;case "greater":return a=a.compare(a,c.value1,c.value2),c.negate?0>=a:0<a;case "less":return a=a.compare(a,c.value1,c.value2),c.negate?0<=a:0>a;case "not":return!a.value.evaluate(a,c.value).content}}}};k.exports=a},{}],3:[function(e,k,h){var g= 53 {A:{compile:function(a){a.compileVariable("browser","a",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Alert:{compile:function(a){var b=a.getLino();a.next();var c=a.getValue();a.addCommand({domain:"browser",keyword:"alert",lino:b,value:c});return!0},run:function(a){var b=a.value.evaluate(a,a[a.pc].value).content;alert(b);return a[a.pc].pc+1}},Attach:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var c=a.getProgram()[a.getSymbol().pc];switch(c.keyword){case "button":case "div":case "header":case "p":case "a":case "img":case "input":case "ul":case "li":case "select":case "span":case "popup":a.next(); 54 if(a.tokenIs("to")){a.next();var d=a.getValue();a.addCommand({domain:"browser",keyword:"attach",lino:b,type:c.keyword,symbol:c.name,cssId:d});return!0}break;default:return a.addWarning("type '"+c.keyword+"' not recognized in browser 'attach'"),!1}}a.addWarning("Unrecognised syntax in 'attach'");return!1},run:function(a){var b=a[a.pc],c=a.value.evaluate(a,b.cssId).content,d=document.getElementById(c);d||a.error.noSuchElementError(c);var f=a.getSymbolRecord(a,b.symbol);f.value[f.index]={type:"constant", 55 numeric:"false",content:c};"popup"===b.type&&(a.popups.push(d.id),window.onclick=function(b){a.popups.includes(b.target.id)&&(b.target.style.display="none")});return b.pc+1}},Audioclip:{compile:function(a){a.compileVariable("browser","audioclip");return!0},run:function(a){return a[a.pc].pc+1}},BUTTON:{compile:function(a){a.compileVariable("browser","button",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Create:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getSymbolRecord(), 56 d=c.name;a.next();if("audioclip"===c.keyword)return a.tokenIs("from")&&a.next(),c=a.getValue(),a.addCommand({domain:"browser",keyword:"create",lino:b,target:d,value:c}),!0}return!1},run:function(a){var b=a[a.pc],c=a.getSymbolRecord(a,b.target);c.value[c.index]=b.value;return a[a.pc].pc+1}},DIV:{compile:function(a){a.compileVariable("browser","div",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Header:{compile:function(a){a.compileVariable("browser","header",!1,"dom");return!0},run:function(a){return a[a.pc].pc+ 57 1}},Hide:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var c=a.getToken();a.next();a.addCommand({domain:"browser",keyword:"hide",lino:b,symbol:c});return!0}a.addWarning("Unrecognised syntax in 'hide'");return!1},run:function(a){var b=a[a.pc];a=a.getSymbolRecord(a,b.symbol);document.getElementById(a.value[a.index].content).style.visibility="hidden";return b.pc+1}},IMG:{compile:function(a){a.compileVariable("browser","img",!1,"dom");return!0},run:function(a){return a[a.pc].pc+ 12 (function(){function e(k,h,g){function a(c,f){if(!h[c]){if(!k[c]){var d="function"==typeof require&&require;if(!f&&d)return d(c,!0);if(b)return b(c,!0);f=Error("Cannot find module '"+c+"'");throw f.code="MODULE_NOT_FOUND",f;}f=h[c]={exports:{}};k[c][0].call(f.exports,function(b){return a(k[c][1][b]||b)},f,f.exports,e,k,h,g)}return h[c].exports}for(var b="function"==typeof require&&require,c=0;c<g.length;c++)a(g[c]);return a}return e})()({1:[function(e,k,h){var g=e("./easycoder/Main");console.log("Starting up EasyCoder..."); 13 window.onload=function(){var a=document.getElementById("easycoder-script");a&&(a.style.display="none",g.start(a.innerText))}},{"./easycoder/Main":9}],2:[function(e,k,h){var g=this,a={Add:{compile:function(b){var a=b.getLino();b.next();var d=b.getValue();if(b.tokenIs("to"))if(b.next(),b.getToken(),b.isSymbol()){var f=b.getSymbol();if(b.getCommandAt(f.pc).isValueHolder){if("giving"===b.peek()){f=b.getValue();b.next();var l=b.getToken();b.next();b.addCommand({domain:"basic",keyword:"add",lino:a,value1:d, 14 value2:f,target:l})}else f=b.getToken(),b.next(),b.addCommand({domain:"basic",keyword:"add",lino:a,value1:d,target:f});return!0}b.warning("basic "+g.name+"': Expected value holder")}else{f=b.getValue();if(b.tokenIs("giving"))return b.next(),l=b.getToken(),b.next(),b.addCommand({domain:"basic",keyword:"add",lino:a,value1:d,value2:f,target:l}),!0;b.warning("basic "+g.name+'\': Expected "giving"')}return!1},run:function(b){var a=b[b.pc],d=a.value1,f=a.value2,l=b.getSymbolRecord(a.target);if(l.isValueHolder){var e= 15 l.value[l.index];f?(b=b.getValue(f)+b.getValue(d),l.value[l.index]={type:"constant",numeric:!0,content:b}):(e.numeric||b.error.nonNumericValueError(),b=e.content+b.getValue(d),l.value[l.index]={type:"constant",numeric:!0,content:b})}else b.error.VariableDoesNotHoldAValueError(l.name);return a.pc+1}},Alias:{compile:function(b){var a=b.getLino();b.next();if(b.isSymbol()){var d=b.getToken();b.next();if(b.tokenIs("to")&&(b.next(),b.isSymbol())){var f=b.getToken();b.next();b.addCommand({domain:"basic", 16 keyword:"alias",lino:a,alias:d,symbol:f});return!0}}return!1},run:function(b){var a=b[b.pc],d=b.symbols[a.alias].pc,f=b[d],l=b.getSymbolRecord(a.symbol);b[d]={pc:f.pc,domain:l.domain,keyword:l.keyword,lino:f.lino,name:f.name,alias:a.symbol};return a.pc+1}},Begin:{compile:function(b){b.next();b.compileFromHere(["end"]);return!0},run:function(b){return b[b.pc].pc+1}},Clear:{compile:function(b){var a=b.getLino();b.next();if(b.isSymbol()){var d=b.getToken();b.next();b.addCommand({domain:"basic",keyword:"clear", 17 lino:a,symbol:d});return!0}return!1},run:function(b){var a=b[b.pc],d=b.getSymbolRecord(a.symbol);d.isValueHolder?(b.domain[d.domain].value.put(d,{type:"boolean",content:!1}),a.numeric=!1):b.error.VariableDoesNotHoldAValueError(d.name);return a.pc+1}},Debug:{compile:function(b){var a=b.getLino();b.next();if(b.tokenIs("program")){b.next();if(b.tokenIs("item")||b.tokenIs("pc")){b.next();var d=b.getValue();b.addCommand({domain:"basic",keyword:"debug",lino:a,item:d});return!0}b.addCommand({domain:"basic", 18 keyword:"debug",lino:a,item:-1});return!0}if(b.tokenIs("symbols"))return b.next(),b.addCommand({domain:"basic",keyword:"debug",lino:a,item:"symbols"}),!0;if(b.tokenIs("symbol"))return b.next(),d=b.getToken(),b.next(),b.addCommand({domain:"basic",keyword:"debug",lino:a,item:"symbol",name:d}),!0;b.error.NoSuchVariableError(b.getToken())},run:function(b){var a=b[b.pc],d=a.item;switch(d){case "symbols":console.log("Symbols: "+JSON.stringify(b.symbols,null,2));break;case "symbol":console.log("Symbol: "+ 19 JSON.stringify(b.getSymbolRecord(a.name),null,2));break;default:0<=d.content?console.log("Debug item "+d.content+": "+JSON.stringify(b[d.content],null,2)):console.log("Debug program: "+JSON.stringify(b,null,2))}return a.pc+1}},Divide:{compile:function(b){var a=b.getLino();b.next();b.getToken();if(b.isSymbol()){var d=b.getSymbol();var f=b.getCommandAt(d.pc).name}d=b.getValue();b.tokenIs("by")&&b.next();var l=b.getValue();if(b.tokenIs("giving")){b.next();if(b.isSymbol())return f=b.getSymbol(),f=b.getCommandAt(f.pc).name, 20 b.next(),b.addCommand({domain:"basic",keyword:"divide",lino:a,value1:d,value2:l,target:f}),!0;b.warning("basic "+g.name+"': Expected value holder")}else return void 0===f&&b.warning("basic "+g.name+"': No target variable given"),b.addCommand({domain:"basic",keyword:"divide",lino:a,value2:l,target:f}),!0;return!1},run:function(b){var a=b[b.pc],d=a.value1,f=a.value2,l=b.getSymbolRecord(a.target);if(l.isValueHolder){var e=l.value[l.index];d?(b=b.getValue(d)/b.getValue(f),l.value[l.index]={type:"constant", 21 numeric:!0,content:Math.trunc(b)}):(e.numeric||b.error.nonNumericValueError(),b=e.content/b.getValue(f),l.value[l.index]={type:"constant",numeric:!0,content:Math.trunc(b)})}else b.error.VariableDoesNotHoldAValueError(l.name);return a.pc+1}},End:{compile:function(a){a.next();return!0},run:function(){return 0}},Extend:{compile:function(a){var b=a.getLino();a.next();var d=a.getValue(),f=a.getValue();a.addCommand({domain:"basic",keyword:"extend",lino:b,request:d,data:f});return!0},run:function(a){var b= 22 a[a.pc];try{if("function"===typeof EasyCoder_extension){var d=a.getValue(b.request),f=a.getValue(b.data);EasyCoder_extension(a,d,f)}else a.error.runtimeError("No extension found")}catch(l){a.error.runtimeError(l.message)}return b.pc+1}},Fork:{compile:function(a){var b=a.getLino();a.next();a.tokenIs("to")&&a.next();var d=a.getToken();a.next();a.addCommand({domain:"basic",keyword:"fork",lino:b,label:d});return!0},run:function(a){var b=a[a.pc];try{a.run(a,a.symbols[b.label].pc)}catch(d){console.log(d.message), 23 alert(d.message)}return b.pc+1}},Go:{compile:function(a){var b=a.getLino();a.next();a.tokenIs("to")&&a.next();var d=a.getToken();a.next();a.addCommand({domain:"basic",keyword:"goto",lino:b,label:d});return!0},run:function(a){return a[a.pc].pc+1}},Gosub:{compile:function(a){var b=a.getLino();a.next();a.tokenIs("to")&&a.next();var d=a.getToken();a.next();a.addCommand({domain:"basic",keyword:"gosub",lino:b,label:d});return!0},run:function(a){var b=a[a.pc];a.stack.push(a.pc+1);return a.symbols[b.label].pc}}, 24 Goto:{compile:function(a){var b=a.getLino();a.next();var d=a.getToken();a.next();a.addCommand({domain:"basic",keyword:"goto",lino:b,label:d});return!0},run:function(a){var b=a[a.pc];return b.label?a.symbols[b.label].pc:b.goto}},If:{compile:function(a){var b=a.getLino();a.next();var d=a.condition.compile(a),f=a.getPc();a.addCommand({domain:"basic",keyword:"if",lino:b,condition:d});a.compileOne();if(!a.getToken())return a.getCommandAt(f).else=a.getPc(),!0;a.tokenIs("else")?(b=a.getPc(),a.addCommand({domain:"basic", 25 keyword:"goto",goto:0}),a.getCommandAt(f).else=a.getPc(),a.next(),a.compileOne(!0),a.getCommandAt(b).goto=a.getPc()):a.getCommandAt(f).else=a.getPc();return!0},run:function(a){var b=a[a.pc];return a.condition.test(a,b.condition)?b.pc+1:b.else}},Index:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var d=a.getToken();a.next();if(a.tokenIs("to")){a.next();var f=a.getValue();a.addCommand({domain:"basic",keyword:"index",lino:b,symbol:d,value:f});return!0}}return!1},run:function(a){var b= 26 a[a.pc],d=a.getSymbolRecord(b.symbol);d.index=a.getValue(b.value);d.index>=d.elements&&a.error.arrayIndexOutOfRangeError(d.name);return b.pc+1}},Multiply:{compile:function(a){var b=a.getLino();a.next();a.getToken();if(a.isSymbol()){var d=a.getSymbol();var f=a.getCommandAt(d.pc).name}d=a.getValue();a.tokenIs("by")&&a.next();var l=a.getValue();if(a.tokenIs("giving")){a.next();if(a.isSymbol())return f=a.getSymbol(),f=a.getCommandAt(f.pc).name,a.next(),a.addCommand({domain:"basic",keyword:"multiply", 27 lino:b,value1:d,value2:l,target:f}),!0;a.warning("basic multiply': Expected value holder")}else return void 0===f&&a.warning("basic multiply': No target variable given"),a.addCommand({domain:"basic",keyword:"multiply",lino:b,value2:l,target:f}),!0;return!1},run:function(a){var b=a[a.pc],d=b.value1,f=b.value2,l=a.getSymbolRecord(b.target);if(l.isValueHolder){var e=l.value[l.index];d?(a=a.getValue(d)*a.getValue(f),l.value[l.index]={type:"constant",numeric:!0,content:a}):(e.numeric||a.error.nonNumericValueError(), 28 a=e.content*a.getValue(f),l.value[l.index]={type:"constant",numeric:!0,content:a})}else a.error.VariableDoesNotHoldAValueError(l.name);return b.pc+1}},Negate:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var d=a.getToken();a.next();a.addCommand({domain:"basic",keyword:"negate",lino:b,symbol:d});return!0}return!1},run:function(a){var b=a[a.pc],d=a.getSymbolRecord(b.symbol);d.isValueHolder?d.value[d.index]={type:"constant",numeric:!0,content:-d.value[d.index].content}: 29 a.error.VariableDoesNotHoldAValueError(d.name);return b.pc+1}},Print:{compile:function(a){var b=a.getLino();a.next();var d=a.getValue();a.addCommand({domain:"basic",keyword:"print",lino:b,value:d});return!0},run:function(a){var b=a[a.pc];a=a.getValue(b.value);console.log("-> "+a);return b.pc+1}},Put:{compile:function(a){var b=a.getLino();a.next();var d=a.getValue();if(a.tokenIs("into")){a.next();if(a.isSymbol()){var f=a.getToken();a.next();a.addCommand({domain:"basic",keyword:"put",lino:b,value:d, 30 target:f});return!0}a.error.noSuchVariableError(a.getToken())}return!1},run:function(a){var b=a[a.pc],d=b.value,f=a.getSymbolRecord(b.target);f.isValueHolder||a.error.variableDoesNotHoldAValueError(f.name);f.value[f.index]=a.evaluate(d);return b.pc+1}},Return:{compile:function(a){var b=a.getLino();a.next();a.addCommand({domain:"basic",keyword:"return",lino:b});return!0},run:function(a){return a.stack.pop()}},Set:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var d=a.getSymbolRecord(); 31 if(!d.isValueHolder)return!1;a.next();if(a.tokenIs("to")){a.next();for(var f=[];;){a.mark();try{f.push(a.getValue())}catch(l){a.rewind();break}}a.addCommand({domain:"basic",keyword:"set",lino:b,type:"setArray",target:d.name,value:f});return!0}a.addCommand({domain:"basic",keyword:"set",lino:b,type:"setBoolean",target:d.name});return!0}a.tokenIs("the")&&a.next();return a.tokenIs("elements")&&(a.next(),a.tokenIs("of")&&(a.next(),a.getTarget(),a.isSymbol()||a.error.unknownVariableError(a.getToken()), 32 d=a.getToken(),a.next(),a.tokenIs("to")))?(a.next(),f=a.getValue(),a.addCommand({domain:"basic",keyword:"set",lino:b,type:"setElements",symbol:d,value:f}),!0):!1},run:function(a){var b=a[a.pc];switch(b.type){case "setBoolean":var d=a.getSymbolRecord(b.target);d.isValueHolder?(d.value[d.index]={type:"boolean",content:!0},b.numeric=!1):a.error.VariableDoesNotHoldAValueError(d.name);break;case "setElements":d=a.getSymbolRecord(b.symbol);d.elements=a.getValue(b.value);d.index=0;d.value=[];for(a=0;a<d.elements;a++)d.value.push({}); 33 break;case "setArray":a=a.getSymbolRecord(b.target),a.elements=b.value.length,a.value=b.value}return b.pc+1}},Stop:{compile:function(a){var b=a.getLino();a.next();a.addCommand({domain:"basic",keyword:"stop",lino:b,next:0});return!0},run:function(){return 0}},Take:{compile:function(a){var b=a.getLino();a.next();var d=a.getValue();if(a.tokenIs("from"))if(a.next(),a.getToken(),a.isSymbol()){var f=a.getSymbol();if(a.getCommandAt(f.pc).isValueHolder){if("giving"===a.peek()){f=a.getValue();a.next();var e= 34 a.getToken();a.next();a.addCommand({domain:"basic",keyword:"take",lino:b,value1:d,value2:f,target:e})}else f=a.getToken(),a.next(),a.addCommand({domain:"basic",keyword:"take",lino:b,value1:d,target:f});return!0}a.warning("basic "+g.name+"': Expected value holder")}else{f=a.getValue();if(a.tokenIs("giving"))return a.next(),e=a.getToken(),a.next(),a.addCommand({domain:"basic",keyword:"take",lino:b,value1:d,value2:f,target:e}),!0;a.warning("basic "+g.name+'\': Expected "giving"')}return!1},run:function(a){var b= 35 a[a.pc],d=b.value1,f=b.value2,e=a.getSymbolRecord(b.target);if(e.isValueHolder){var g=e.value[e.index];f?(a=a.getValue(f)-a.getValue(d),e.value[e.index]={type:"constant",numeric:!0,content:a}):(g.numeric||a.error.nonNumericValueError(),a=a.getValue(g)-a.getValue(d),e.value[e.index]={type:"constant",numeric:!0,content:a})}else a.error.VariableDoesNotHoldAValueError(e.name);return b.pc+1}},Toggle:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var d=a.getSymbolPc();a.next(); 36 a.addCommand({domain:"basic",keyword:"toggle",lino:b,symbol:d});return!0}return!1},run:function(a){var b=a[a.pc],d=a[b.symbol];if(d.isValueHolder){var f=a.domain[d.domain];a=f.value.get(a,d.value[d.index]).content;f.value.put(d,{type:"boolean",content:!a})}else a.error.VariableDoesNotHoldAValueError(d.name);return b.pc+1}},Variable:{compile:function(a){a.compileVariable("basic","variable",!0);return!0},run:function(a){return a[a.pc].pc+1}},Wait:{compile:function(a){var b=a.getLino();a.next();var d= 37 a.getValue(a),f=1E3;switch(a.getToken()){case "milli":case "millis":a.next();f=1;break;case "tick":case "ticks":a.next();f=10;break;case "second":case "seconds":a.next();f=1E3;break;case "minute":case "minutes":a.next(),f=6E4}a.addCommand({domain:"basic",keyword:"wait",lino:b,value:d,multiplier:f});return!0},run:function(a){var b=a[a.pc],d=a.getValue(b.value);setTimeout(function(){a.run(a,b.pc+1)},d*b.multiplier);return 0}},While:{compile:function(a){var b=a.getLino();a.next();var d=a.getCondition(), 38 f=a.getPc();a.addCommand({domain:"basic",keyword:"while",lino:b,condition:d});b=a.getPc();a.addCommand({domain:"basic",keyword:"goto",goto:0});a.compileOne();a.addCommand({domain:"basic",keyword:"goto",goto:f});a.getCommandAt(b).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(b){switch(b){case "add":return a.Add;case "alias":return a.Alias;case "begin":return a.Begin;case "clear":return a.Clear;case "debug":return a.Debug;case "divide":return a.Divide; 39 case "end":return a.End;case "extend":return a.Extend;case "fork":return a.Fork;case "go":return a.Go;case "gosub":return a.Gosub;case "goto":return a.Goto;case "if":return a.If;case "index":return a.Index;case "multiply":return a.Multiply;case "negate":return a.Negate;case "print":return a.Print;case "put":return a.Put;case "return":return a.Return;case "set":return a.Set;case "stop":return a.Stop;case "take":return a.Take;case "toggle":return a.Toggle;case "variable":return a.Variable;case "wait":return a.Wait; 40 case "while":return a.While;default:return!1}},run:function(b){var c=b[b.pc],d=a.getHandler(c.keyword);d||b.error.runtimeError("Unknown keyword '"+c.keyword+"' in 'basic' package");return d.run(b)},isNegate:function(a){return"not"===a.getToken()?(a.next(),!0):!1},value:{compile:function(a){if(a.isSymbol()){var b=a.getToken();a.next();return a.tokenIs("modulo")?(a.next(),a=a.getValue(),{domain:"basic",type:"modulo",name:b,value:a}):{domain:"basic",type:"symbol",name:b}}b=a.getToken();if("true"===b)return a.next(), 41 {domain:"basic",type:"boolean",content:!0};if("false"===b)return a.next(),{domain:"basic",type:"boolean",content:!1};if("random"===b)return a.next(),{domain:"basic",type:"random",range:a.getValue()};if("cos"===b)return a.next(),b=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"basic",type:"cos",angle_c:b,radius_c:a};if("sin"===b)return a.next(),b=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"basic",type:"sin",angle_s:b,radius_s:a};if("tan"===b)return a.next(),b=a.getValue(),a.skip("radius"), 42 a=a.getValue(),{domain:"basic",type:"tan",angle_t:b,radius_t:a};if("empty"===b)return a.next(),{domain:"basic",type:"empty"};a.tokenIs("the")&&a.next();switch(a.getToken()){case "index":a.next();if(a.tokenIs("of")&&(a.next(),a.isSymbol()))return b=a.getToken(),a.next(),{domain:"basic",type:"index",name:b};break;case "value":a.next();if(a.tokenIs("of"))return a.next(),{domain:"basic",type:"valueOf",value:a.getValue()};break;case "length":a.next();if(a.tokenIs("of"))return a.next(),{domain:"basic", 43 type:"lengthOf",value:a.getValue()};break;case "left":a.next();b=a.getValue();if(a.tokenIs("of"))return a.next(),a=a.getValue(),{domain:"basic",type:"left",count:b,value:a};break;case "right":if(a.next(),b=a.getValue(),a.tokenIs("of"))return a.next(),a=a.getValue(),{domain:"basic",type:"right",count:b,value:a}}return null},get:function(a,c){switch(c.type){case "boolean":return{type:"boolean",numeric:!1,content:c.content};case "index":return{type:"constant",numeric:!0,content:a.getSymbolRecord(c.name).index}; 44 case "random":return a=a.evaluate(c.range),{type:"constant",numeric:!0,content:Math.floor(Math.random()*a.content)};case "cos":var b=a.getValue(c.angle_c);a=a.getValue(c.radius_c);return{type:"constant",numeric:!0,content:parseInt(Math.cos(.01745329*parseFloat(b))*a,10)};case "sin":return b=a.getValue(c.angle_s),a=a.getValue(c.radius_s),{type:"constant",numeric:!0,content:parseInt(Math.sin(.01745329*parseFloat(b))*a,10)};case "tan":return b=a.getValue(c.angle_t),a=a.getValue(c.radius_t),{type:"constant", 45 numeric:!0,content:parseInt(Math.tan(.01745329*parseFloat(b))*a,10)};case "valueOf":return{type:"constant",numeric:!0,content:a.getValue(c.value)};case "lengthOf":return{type:"constant",numeric:!0,content:a.getValue(c.value).length};case "left":return a.getValue(c.value),{type:"constant",numeric:!1,content:a.getValue(c.value).substr(0,a.getValue(c.count))};case "modulo":return b=a.getSymbolRecord(c.name),a=a.evaluate(c.value),{type:"constant",numeric:!0,content:b.value[b.index].content%a.content}; 46 case "empty":return{type:"constant",numeric:!1,content:""}}return null},put:function(a,c){a.value[a.index]=c}},condition:{compile:function(b){if(b.tokenIs("not"))return b.next(),{domain:"basic",type:"not",value:b.getValue()};try{var c=b.getValue();if("is"===b.getToken()){b.next();var d=a.isNegate(b);if(b.tokenIs("greater")){b.next();if(b.tokenIs("than")){b.next();var f=b.getValue();return{domain:"basic",type:"greater",value1:c,value2:f,negate:d}}return null}if(b.tokenIs("less")){b.next();if(b.tokenIs("than")){b.next(); 47 var e=b.getValue();return{domain:"basic",type:"less",value1:c,value2:e,negate:d}}return null}var g=b.getValue();return{domain:"basic",type:"is",value1:c,value2:g,negate:d}}if(c)return{domain:"basic",type:"boolean",value:c}}catch(n){console.log(n)}return null},test:function(a,c){switch(c.type){case "boolean":return a.getValue(c.value);case "is":return a=a.compare(a,c.value1,c.value2),c.negate?0!==a:0===a;case "greater":return a=a.compare(a,c.value1,c.value2),c.negate?0>=a:0<a;case "less":return a= 48 a.compare(a,c.value1,c.value2),c.negate?0<=a:0>a;case "not":return!a.getValue(c.value)}}}};k.exports=a},{}],3:[function(e,k,h){var g={A:{compile:function(a){a.compileVariable("browser","a",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Alert:{compile:function(a){var b=a.getLino();a.next();var c=a.getValue();a.addCommand({domain:"browser",keyword:"alert",lino:b,value:c});return!0},run:function(a){var b=a.value.evaluate(a,a[a.pc].value).content;alert(b);return a[a.pc].pc+1}},Attach:{compile:function(a){var b= 49 a.getLino();a.getTokens();a.next();if(a.isSymbol()){var c=a.getProgram()[a.getSymbol().pc];switch(c.keyword){case "button":case "div":case "header":case "p":case "a":case "img":case "input":case "ul":case "li":case "select":case "span":case "pre":case "popup":a.next();if(a.tokenIs("to")){a.next();var d=a.getValue();a.addCommand({domain:"browser",keyword:"attach",lino:b,type:c.keyword,symbol:c.name,cssId:d});return!0}break;default:return a.addWarning("type '"+c.keyword+"' not recognized in browser 'attach'"), 50 !1}}a.addWarning("Unrecognised syntax in 'attach'");return!1},run:function(a){var b=a[a.pc],c=a.value.evaluate(a,b.cssId).content,d=document.getElementById(c);d||a.error.noSuchElementError(c);var f=a.getSymbolRecord(b.symbol);f.value[f.index]={type:"constant",numeric:"false",content:c};"popup"===b.type&&(a.popups.push(d.id),window.onclick=function(b){a.popups.includes(b.target.id)&&(b.target.style.display="none")});return b.pc+1}},Audioclip:{compile:function(a){a.compileVariable("browser","audioclip"); 51 return!0},run:function(a){return a[a.pc].pc+1}},BUTTON:{compile:function(a){a.compileVariable("browser","button",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Create:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getSymbolRecord(),d=c.name;a.next();switch(c.keyword){case "audioclip":a.tokenIs("from")&&a.next();var f=a.getValue();a.addCommand({domain:"browser",keyword:"create",type:"audioclip",name:c.name,lino:b,target:d,value:f});return!0;case "div":case "p":case "h1":case "h2":case "h3":case "h4":case "h5":case "h6":case "span":case "button":case "input":case "pre":if(d= 52 "","input"===c.keyword&&(a.tokenIs("type")?(a.next(),d=a.getToken(),a.next()):a.error.missingInputTypeError()),a.tokenIs("in")&&(a.next(),a.isSymbol())){f=a.getSymbolRecord();"dom"!==f.extra&&a.error.inappropriateTypeError(f.keyword);a.next();for(var e="",g="",h="",k=!0;k;){var p=a.getToken();if(!p)break;a.next();switch(p){case "class":e=a.getValue();break;case "style":g=a.getValue();break;case "text":h=a.getValue();break;default:a.prev(),k=!1}}a.addCommand({domain:"browser",keyword:"create",lino:b, 53 type:c.keyword,name:c.name,inputType:d,className:e,style:g,text:h,parent:f.name});return!0}}}return!1},run:function(a){var b=a[a.pc],c=a.getSymbolRecord(b.name);switch(b.type){case "audioclip":c.value[c.index]=b.value;break;default:var d=a.getSymbolRecord(b.parent),f=document.getElementById(d.value[d.index].content);d=document.createElement(b.type);d.id="easycoder-"+c.name+"-"+c.index;c.value[c.index]={type:"constant",numeric:!1,content:d.id};f.appendChild(d);b.inputType&&d.setAttribute("type",b.inputType); 54 b.className&&(d.className=b.className);c=a.value.evaluate(a,b.style).content;c=$jscomp.makeIterator(c.split(";"));for(f=c.next();!f.done;f=c.next())f=f.value.split(":"),d.style[f[0]]=f[1];b.text&&(d.textContent=a.value.evaluate(a,b.text).content)}return a[a.pc].pc+1}},DIV:{compile:function(a){a.compileVariable("browser","div",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Header:{compile:function(a){a.compileVariable("browser","header",!1,"dom");return!0},run:function(a){return a[a.pc].pc+ 55 1}},Hide:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var c=a.getToken();a.next();a.addCommand({domain:"browser",keyword:"hide",lino:b,symbol:c});return!0}a.addWarning("Unrecognised syntax in 'hide'");return!1},run:function(a){var b=a[a.pc];a=a.getSymbolRecord(b.symbol);document.getElementById(a.value[a.index].content).style.visibility="hidden";return b.pc+1}},IMG:{compile:function(a){a.compileVariable("browser","img",!1,"dom");return!0},run:function(a){return a[a.pc].pc+ 58 56 1}},INPUT:{compile:function(a){a.compileVariable("browser","input",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},LI:{compile:function(a){a.compileVariable("browser","li",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Location:{compile:function(a){var b=a.getLino();a.getTokens();a.next();var c=a.getValue();a.addCommand({domain:"browser",keyword:"location",lino:b,location:c});return!0},run:function(a){a=a[a.pc];window.location=a.location.content;return a.pc+1}},On:{compile:function(a){var b= 59 a.getLino();a.next();var c=a.getToken();switch(c){case "change":case "click":if(a.next(),a.isSymbol()){var d=a.getSymbolRecord();a.next();if("dom"!==d.extra)return!1;a.addCommand({domain:"browser",keyword:"on",lino:b,action:c,symbol:d.name});b=a.getPc();a.addCommand({domain:"basic",keyword:"goto",goto:0});a.compileOne();a.getCommandAt(b).goto=a.getPc();return!0}}a.addWarning("Unrecognised syntax in 'on'");return!1},run:function(a){var b=a[a.pc],c=a.getSymbolRecord(a,b.symbol);switch(b.action){case "change":if("select"=== 60 c.keyword){var d=c.value[c.index].content;if(d){var f=document.getElementById(d);f.targetPc=b.pc+2;f.addEventListener("change",function(){try{a.run(a,f.targetPc)}catch(l){console.log(l.message),alert(l.message)}return!1})}}break;case "click":c.value.forEach(function(d,f){if(d=d.content)d=document.getElementById(d),d.targetPc=b.pc+2,d.targetIndex=f,d.onclick=function(b){b.target.blur();c.index=b.target.targetIndex;try{a.run(a,b.target.targetPc)}catch(p){console.log(p.message),alert(p.message)}return!1}})}return b.pc+ 61 1}},P:{compile:function(a){a.compileVariable("browser","p",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Play:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getSymbolRecord();"audioclip"===c.keyword&&(a.next(),a.addCommand({domain:"browser",keyword:"play",lino:b,target:c.name}))}return!0},run:function(a){var b=a.getSymbolRecord(a,a[a.pc].target);b=a.value.evaluate(a,b.value[b.index]).content;(new Audio(b)).play();return a[a.pc].pc+1}},Popup:{compile:function(a){a.compileVariable("browser", 62 "popup");return!0},run:function(a){return a[a.pc].pc+1}},Remove:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var c=a.getToken();a.next();a.addCommand({domain:"browser",keyword:"remove",lino:b,symbol:c});return!0}a.unrecognisedSymbol(a.getToken());return!1},run:function(a){var b=a[a.pc];a=a.getSymbolRecord(a,b.symbol);document.getElementById(a.value[a.index].content).style.display="none";return b.pc+1}},SELECT:{compile:function(a){a.compileVariable("browser","select", 63 !1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Set:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getToken();a.next();if(a.tokenIs("from")&&(a.next(),a.isSymbol())){var d=a.getToken();a.next();a.addCommand({domain:"browser",keyword:"set",lino:b,type:"setContentVar",source:d,target:c});return!0}}else if(c=a.getToken(),"the"===c&&(a.next(),c=a.getToken()),"content"===c){if(a.next(),a.tokenIs("of")&&(a.next(),a.isSymbol())){c=a.getToken();a.next();if(a.tokenIs("from")&& 64 (a.next(),a.isSymbol()))return d=a.getToken(),a.next(),a.addCommand({domain:"browser",keyword:"set",lino:b,type:"setContentVar",source:d,target:c}),!0;if(a.tokenIs("to"))return a.next(),d=a.getValue(),a.addCommand({domain:"browser",keyword:"set",lino:b,type:"setContent",value:d,target:c}),!0}}else if("text"===c){if(a.next(),a.tokenIs("of")&&(a.next(),a.isSymbol()))switch(c=a.getSymbolRecord(),c.keyword){case "button":case "input":if(a.next(),a.tokenIs("to"))return a.next(),d=a.getValue(),a.addCommand({domain:"browser", 65 keyword:"set",lino:b,type:"setText",symbolName:c.name,value:d}),!0}}else if("attribute"===c){if(a.next(),c=a.getValue(),a.tokenIs("of")&&(a.next(),a.isSymbol()&&(d=a.getToken(),a.next(),a.tokenIs("to")))){a.next();var f=a.getValue();a.addCommand({domain:"browser",keyword:"set",lino:b,type:"setAttribute",symbolName:d,attributeName:c,attributeValue:f});return!0}}else if("style"===c&&(a.next(),c=a.getValue(),a.tokenIs("of")&&(a.next(),a.isSymbol()&&(d=a.getToken(),a.next(),a.tokenIs("to")&&(a.next(), 66 f=a.getValue())))))return a.addCommand({domain:"browser",keyword:"set",lino:b,type:"setStyle",symbolName:d,styleName:c,styleValue:f}),!0;a.addWarning("Unrecognised syntax in 'set'");return!1},run:function(a){var b=a[a.pc];switch(b.type){case "setContentVar":var c=a.getSymbolRecord(a,b.source);a=a.getSymbolRecord(a,b.target);c=document.getElementById(c.value[c.index].content);var d=document.getElementById(a.value[a.index].content);d.innerHTML=c.innerHTML;break;case "setContent":c=a.value.evaluate(a, 67 b.value);var f=c.content;c.numeric&&(f=""+f);a=a.getSymbolRecord(a,b.target);a=a.value[a.index].content;d=document.getElementById(a);d.innerHTML=f;break;case "setText":c=a.getSymbolRecord(a,b.symbolName);d=document.getElementById(c.value[c.index].content);f=a.value.evaluate(a,b.value).content;switch(c.keyword){case "button":d.innerHTML=f;break;case "input":d.value=f}break;case "setAttribute":c=a.getSymbolRecord(a,b.symbolName);switch(b.attributeValue.type){case "constant":f=b.attributeValue.content; 68 break;case "symbol":a=a.getSymbolRecord(a,b.attributeValue.name),f=a.value[a.index].content}a=c.value[c.index].content;d=document.getElementById(a);d.setAttribute(b.attributeName.content,f);break;case "setStyle":c=a.getSymbolRecord(a,b.symbolName),f=a.value.evaluate(a,b.styleValue),c.value[c.index]||a.error.runtimeError("Variable '"+c.name+"' has not been assigned."),a=c.value[c.index].content,a=document.getElementById(a),c={},c[b.styleName.content]=f.content,Object.assign(a.style,c)}return b.pc+ 69 1}},Show:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var c=a.getToken();a.next();a.addCommand({domain:"browser",keyword:"show",lino:b,symbol:c});return!0}a.addWarning("Unrecognised syntax in 'show'");return!1},run:function(a){var b=a[a.pc];a=a.getSymbolRecord(a,b.symbol);var c=document.getElementById(a.value[a.index].content);switch(a.type){case "span":c.style.display="inline";break;default:c.style.display="block"}c.style.visibility="visible";return b.pc+1}},SPAN:{compile:function(a){a.compileVariable("browser", 70 "span",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Trace:{compile:function(a){var b=a.getLino();a.next();var c=[];if(a.isSymbol()){for(;a.isSymbol();)c.push(a.getToken()),a.next();var d="horizontal";if(a.tokenIs("horizontal")||a.tokenIs("vertical"))d=a.getToken(),a.next();a.addCommand({domain:"browser",keyword:"trace",variant:"setup",lino:b,variables:c,alignment:d});return!0}a.addCommand({domain:"browser",keyword:"trace",variant:"run",lino:b});return!0},run:function(a){var b=a[a.pc]; 71 switch(b.variant){case "setup":console.log("Set up tracer");a.tracer={variables:b.variables,alignment:b.alignment};break;case "run":console.log("Run tracer"),a.tracer||(a.tracer={variables:[],alignment:"horizontal"}),a.tracing=!0,a.stop=!1}return a.pc+1}},UL:{compile:function(a){a.compileVariable("browser","ul",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},getHandler:function(a){switch(a){case "a":return g.A;case "alert":return g.Alert;case "attach":return g.Attach;case "audioclip":return g.Audioclip; 72 case "button":return g.BUTTON;case "create":return g.Create;case "div":return g.DIV;case "header":case "h1":case "h2":case "h3":case "h4":case "h5":case "h6":return g.Header;case "hide":return g.Hide;case "img":return g.IMG;case "input":return g.INPUT;case "li":return g.LI;case "location":return g.Location;case "on":return g.On;case "p":return g.P;case "play":return g.Play;case "popup":return g.Popup;case "remove":return g.Remove;case "select":return g.SELECT;case "set":return g.Set;case "show":return g.Show; 73 case "span":return g.SPAN;case "trace":return g.Trace;case "ul":return g.UL;default:return!1}},run:function(a){var b=a[a.pc],c=g.getHandler(b.keyword);c||a.error.runtimeError("Unknown keyword '"+b.keyword+"' in 'browser' package");return c.run(a)},value:{compile:function(a){var b=a.getToken();if("property"===b){a.next();b=a.getValue();if(a.tokenIs("of")&&(a.next(),a.isSymbol())){var c=a.getSymbolRecord();a.next();switch(c.keyword){case "select":case "variable":return{domain:"browser",type:"property", 74 property:b,symbol:c.name}}}return null}if("mobile"===b)return a.next(),{domain:"browser",type:"mobile"};if("br"===b)return a.next(),{domain:"browser",type:"br"};if("color"===b)return a.next(),{domain:"browser",type:"color",value:a.getValue()};a.tokenIs("the")&&a.next();b=a.getToken();return"content"===b?(a.next(),a.tokenIs("of")&&(a.next(),a.isSymbol())?(b=a.getSymbolRecord(),a.next(),{domain:"browser",type:"contentOf",pc:b.pc}):null):["width","height"].includes(b)&&(a.next(),a.tokenIs("of")&&(a.next(), 75 a.isSymbol()&&(c=a.getSymbolRecord(),a.next(),"dom"===c.extra)))?{domain:"browser",type:"width"===b?"widthOf":"heightOf",symbol:c.name}:null},get:function(a,b){switch(b.type){case "symbol":b=a.getSymbolRecord(a,b.name);a=b.value[b.index].content;switch(b.keyword){case "input":case "select":return a=document.getElementById(a),{type:"constant",numeric:!1,content:a.value}}break;case "property":var c=a.value.evaluate(a,b.property).content;b=a.getSymbolRecord(a,b.symbol);content=a.value.evaluate(a,b.value[b.index]).content; 76 content=JSON.parse(content);content=a.value.decode(content[c],a.encoding);switch(b.keyword){case "select":document.getElementById(content);break;case "variable":return{type:"constant",numeric:!1,content:content}}break;case "mobile":return{domain:"browser",type:"boolean",content:"undefined"!==typeof window.orientation||-1!==navigator.userAgent.indexOf("IEMobile")};case "br":return{type:"constant",numeric:!1,content:"<br />"};case "widthOf":return b=a.getSymbolRecord(a,b.symbol),a=b.value[b.index].content, 77 a=document.getElementById(a),{type:"constant",numeric:!0,content:a.offsetWidth};case "heightOf":return b=a.getSymbolRecord(a,b.symbol),a=b.value[b.index].content,a=document.getElementById(a),{type:"constant",numeric:!0,content:a.offsetHeight};case "color":for(a=a.value.evaluate(a,b.value).content.toString(16);6>a.length;)a="00"+a;return{type:"constant",numeric:!1,content:"#"+a}}}},condition:{compile:function(a){},test:function(a,b){}},setStyles:function(a,b){a=document.getElementById(a);b=b.split(";"); 78 b=$jscomp.makeIterator(b);for(var c=b.next();!c.done;c=b.next())c=c.value.split(":"),a.setAttribute(c[0],c[1])}};k.exports=g},{}],4:[function(e,k,h){var g={Json:{compile:function(a){var b=a.getLino();a.getTokens();a.next();switch(a.getToken()){case "get":a.next();if(a.isSymbol()){var c=a.getSymbolRecord();if("variable"===c.keyword){a.next();if(a.tokenIs("from")){a.next();var d=a.getValue();a.addCommand({domain:"json",keyword:"json",lino:b,request:"get",target:c.name,value:d});return!0}if(a.tokenIs("as")&& 79 (a.next(),a.tokenIs("item"))){a.next();d=a.getValue();if(a.tokenIs("of")&&(a.next(),a.isSymbol())){var f=a.getToken();a.next();a.addCommand({domain:"json",keyword:"json",lino:b,request:"getItem",target:c.name,item:d,source:f})}return!0}}}break;case "set":a.next();if(a.tokenIs("encoding")){a.next();if(a.tokenIs("to"))return a.next(),c=a.getValue(),a.addCommand({domain:"json",keyword:"json",lino:b,request:"encoding",encoding:c}),!0;a.addWarning("Unknown encoding option");return!1}if(a.isSymbol()&&(c= 80 a.getSymbolRecord(),"select"===c.keyword&&(a.next(),a.tokenIs("from")&&(a.next(),a.isSymbol()&&(d=a.getSymbolRecord(),"variable"===d.keyword)))))return a.next(),f=null,a.tokenIs("as")&&(a.next(),f=a.getValue()),a.addCommand({domain:"json",keyword:"json",lino:b,request:"setList",target:c.name,source:d.name,display:f}),!0}a.addWarning("Unrecognised syntax in 'json'");return!1},run:function(a){var b=a[a.pc];switch(b.request){case "get":a.ajaxCommand=b;var c=new XMLHttpRequest;c.onreadystatechange=function(){if(4=== 81 this.readyState&&200===this.status){var b=a.ajaxCommand,c=a.getSymbolRecord(a,b.target);c.value[c.index]={type:"constant",numeric:!1,content:this.responseText};a.run(a,b.pc+1)}};b=a.value.evaluate(a,b.value);c.open("GET",b.content,!0);c.send();return 0;case "getItem":var d=a.getSymbolRecord(a,b.source);d=JSON.parse(d.value[d.index].content)[b.item.content];c=a.getSymbolRecord(a,b.target);c.value[c.index]={type:"constant",numeric:!1,content:d};break;case "setList":d=a.getSymbolRecord(a,b.source);c= 82 a.getSymbolRecord(a,b.target);var f=document.getElementById(c.value[c.index].content);f.options.length=0;var e=b.display?a.value.evaluate(a,b.display).content:null;JSON.parse(d.value[d.index].content).forEach(function(b){var c=document.createElement("option");c.value=e?JSON.stringify(b):b;c.innerHTML=e?a.value.decode(b[e],a.encoding):b;f.appendChild(c)});f.selectedIndex=-1;break;case "encoding":a.encoding=a.value.evaluate(a,b.encoding).content}return b.pc+1}},getHandler:function(a){switch(a){case "json":return g.Json; 83 default:return!1}},run:function(a){var b=a[a.pc],c=g.getHandler(b.keyword);c||a.error.runtimeError("Unknown keyword '"+b.keyword+"' in 'json' package");return c.run(a)},value:{compile:function(a){},get:function(a,b){}},condition:{compile:function(a){},test:function(a,b){}}};k.exports=g},{}],5:[function(e,k,h){var g={Attach:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var c=a.getProgram()[a.getSymbol().pc];switch(c.keyword){case "shape":case "svg":a.next();if(a.tokenIs("to")){a.next(); 84 var d=a.getValue();a.addCommand({domain:"svg",keyword:"attach",lino:b,type:c.keyword,symbol:c.name,cssId:d});return!0}break;default:compile.error.InappropriateVariableTypeError(c.keyword)}}a.addWarning("Unrecognised syntax in 'attach'");return!1},run:function(a){var b=a[a.pc],c=a.value.evaluate(a,b.cssId).content;document.getElementById(c)||a.error.noSuchElementError(c);a=a.getSymbolRecord(a,b.symbol);a.value[a.index]={type:"constant",numeric:"false",content:c};return b.pc+1}},Circle:{compile:function(a){a.compileVariable("svg", 85 "circle",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Create:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getSymbolRecord();a.next();switch(c.keyword){case "svg":if(a.tokenIs("in")&&(a.next(),a.isSymbol())){var d=a.getToken();a.next();for(var f=null,e=!0;e;){var g=a.getToken();a.next();switch(g){case "style":f=a.getValue();break;default:a.prev(),e=!1}}f||(f={type:"constant",numeric:!1,content:"width:100%;height:100%"});a.addCommand({domain:"svg",keyword:"create", 86 lino:b,type:"svg",name:c.name,style:f,parent:d});return!0}break;case "group":if(a.tokenIs("in")&&(a.next(),a.isSymbol()))return f=a.getSymbolRecord(),["svg","group"].includes(f.keyword)||a.error.inappropriateTypeError(f.keyword),a.next(),a.addCommand({domain:"svg",keyword:"create",lino:b,type:"group",name:c.name,parent:f.name}),!0;break;case "circle":case "ellipse":case "line":case "rect":case "text":if(a.tokenIs("in")&&(a.next(),a.isSymbol())){d=a.getSymbolRecord();["svg","group"].includes(d.keyword)|| 87 a.error.inappropriateTypeError(d.keyword);a.next();for(e=!0;e;){var h=a.getToken();a.next();switch(h){case "style":f=a.getValue();break;case "text":g=a.getValue();break;default:a.prev(),e=!1}}a.addCommand({domain:"svg",keyword:"create",lino:b,type:c.keyword,name:c.name,style:f,text:g,parent:d.name});return!0}}}return!1},run:function(a){var b=a[a.pc],c=a.getSymbolRecord(a,b.parent),d=a.getSymbolRecord(a,b.name);if("group"===b.type)d.parent=b.parent,d.x=0,d.y=0;else{if("group"===c.keyword){var f=c; 88 var e=f.value[f.index];e.content||(e.content=[]);for(e.content.push({name:d.name,index:d.index});"group"===c.keyword;)c=a.getSymbolRecord(a,c.parent)}e=document.getElementById(c.value[c.index].content);c=document.createElementNS("http://www.w3.org/2000/svg",b.type);e.appendChild(c);e="ec-"+d.name+"-"+d.index;c.setAttribute("id",e);"text"===d.keyword&&(c.textContent=a.value.evaluate(a,b.text).content);d.value[d.index]={type:"constant",numeric:!1,content:e};if(b.style){b=a.value.evaluate(a,b.style).content; 89 a.domain.browser.setStyles(e,b);b=d.value[d.index];switch(d.keyword){case "circle":case "ellipse":b.x=c.getAttribute("cx");b.y=c.getAttribute("cy");break;case "line":b.x=c.getAttribute("x1");b.y=c.getAttribute("y1");b.x2=c.getAttribute("x2");b.y2=c.getAttribute("y2");break;case "rect":case "text":b.x=c.getAttribute("x"),b.y=c.getAttribute("y")}f&&(b.groupName=f.name,b.groupIndex=f.index)}}return a[a.pc].pc+1}},Ellipse:{compile:function(a){a.compileVariable("svg","ellipse",!1,"dom");return!0},run:function(a){return a[a.pc].pc+ 90 1}},Group:{compile:function(a){a.compileVariable("svg","group");return!0},run:function(a){return a[a.pc].pc+1}},Line:{compile:function(a){a.compileVariable("svg","line",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Move:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getSymbolRecord();a.next();if(a.tokenIs("to")){a.next();var d=a.getValue(),f=a.getValue();a.addCommand({domain:"svg",keyword:"move",lino:b,type:"moveTo",name:c.name,x:d,y:f});return!0}}return!1},run:function(a){var b= 91 a[a.pc],c=a.value.evaluate(a,b.x).content,d=a.value.evaluate(a,b.y).content;b=a.getSymbolRecord(a,b.name);switch(b.keyword){case "group":for(var f=$jscomp.makeIterator(b.value[b.index].content),e=f.next();!e.done;e=f.next()){var g=e.value;e=a.getSymbolRecord(a,g.name);g=e.value[g.index];var h=document.getElementById(g.content),k=parseInt(g.x)+c,q=parseInt(g.y)+d;switch(e.keyword){case "circle":case "ellipse":h.setAttribute("cx",k);h.setAttribute("cy",q);break;case "line":h.setAttribute("x1",k);h.setAttribute("y1", 92 q);h.setAttribute("x2",parseInt(g.x2)+c);h.setAttribute("y2",parseInt(g.y2)+d);break;case "rect":case "text":h.setAttribute("x",k),h.setAttribute("y",q)}}b.x=c;b.y=d;break;case "circle":case "ellipse":case "line":case "rect":case "text":e=f=0;g=b.value[b.index];g.groupName&&(e=a.getSymbolRecord(a,g.groupName),f=e.x,e=e.y);g=b.value[b.index];h=document.getElementById(b.value[b.index].content);switch(b.keyword){case "circle":case "ellipse":h.setAttribute("cx",f+c);h.setAttribute("cy",e+d);break;case "line":h.setAttribute("x1", 93 f+c);h.setAttribute("y1",e+d);b=parseInt(g.x2)-parseInt(g.x1);k=parseInt(g.y2)-parseInt(g.y1);h.setAttribute("x2",f+b+c);h.setAttribute("y2",e+k+d);break;case "rect":case "text":h.setAttribute("x",f+c),h.setAttribute("y",e+d)}g.x=c;g.y=d}return a[a.pc].pc+1}},On:{compile:function(a){var b=a.getLino();a.next();var c=a.getToken();switch(c){case "click":if(a.next(),a.isSymbol()){var d=a.getSymbolRecord();a.next();if("group"!==d.keyword)return!1;a.addCommand({domain:"svg",keyword:"on",lino:b,action:c, 94 symbol:d.name});b=a.getPc();a.addCommand({domain:"basic",keyword:"goto",goto:0});a.compileOne();a.getCommandAt(b).goto=a.getPc();return!0}}a.addWarning("Unrecognised syntax in 'on'");return!1},run:function(a){var b=a[a.pc],c=a.getSymbolRecord(a,b.symbol);switch(b.action){case "click":if("group"===c.keyword)for(var d=$jscomp.makeIterator(c.value),e=d.next();!e.done;e=d.next())if(e=e.value,e.content){e=$jscomp.makeIterator(e.content);for(var g=e.next();!g.done;g=e.next()){g=g.value;var h=a.getSymbolRecord(a, 95 g.name),k=h.value[g.index];k.content&&(k=document.getElementById(k.content),k.targetPc=b.pc+2,k.contentItem=h,k.contentIndex=g.index,k.onclick=function(b){b.target.blur();var d=b.target.contentItem;d.index=b.target.contentIndex;d=d.value[d.index];if(d.groupName){c.index=d.groupIndex;d=$jscomp.makeIterator(c.value[c.index].content);for(var e=d.next();!e.done;e=d.next())e=e.value,a.getSymbolRecord(a,e.name).index=e.index}try{a.run(a,b.target.targetPc)}catch(t){a.reportError(a.source,t)}return!1})}}}return b.pc+ 96 1}},Rect:{compile:function(a){a.compileVariable("svg","rect",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Set:{compile:function(a){var b=a.getLino();a.next();var c=a.getToken();"the"===c&&(a.next(),c=a.getToken());if("text"===c&&(a.next(),a.tokenIs("of")&&(a.next(),a.isSymbol())))switch(c=a.getSymbolRecord(),c.keyword){case "text":if(a.next(),a.tokenIs("to")){a.next();var d=a.getValue();a.addCommand({domain:"svg",keyword:"set",lino:b,type:"setText",symbolName:c.name,value:d});return!0}}return!1}, 97 run:function(a){var b=a[a.pc];switch(b.type){case "setText":var c=a.getSymbolRecord(a,b.symbolName);var d=document.getElementById(c.value[c.index].content);a=a.value.evaluate(a,b.value).content;switch(c.keyword){case "text":d.innerHTML=a}}return b.pc+1}},SVG:{compile:function(a){a.compileVariable("svg","svg");return!0},run:function(a){return a[a.pc].pc+1}},Text:{compile:function(a){a.compileVariable("svg","text",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},getHandler:function(a){switch(a){case "attach":return g.Attach; 98 case "circle":return g.Circle;case "create":return g.Create;case "ellipse":return g.Ellipse;case "group":return g.Group;case "line":return g.Line;case "move":return g.Move;case "on":return g.On;case "rect":return g.Rect;case "set":return g.Set;case "svg":return g.SVG;case "text":return g.Text;default:return!1}},run:function(a){var b=a[a.pc],c=g.getHandler(b.keyword);c||a.error.runtimeError("Unknown keyword '"+b.keyword+"' in 'svg' package");return c.run(a)},value:{compile:function(a){a.tokenIs("the")&& 99 a.next();if(a.tokenIs("text")&&(a.next(),a.tokenIs("of")&&(a.next(),a.isSymbol()))){var b=a.getSymbolRecord();a.next();if("text"===b.keyword)return{domain:"svg",type:"text",name:b.name}}return null},get:function(a,b){switch(b.type){case "text":return a=a.getSymbolRecord(a,b.name),{type:"constant",numeric:!1,content:document.getElementById(a.value[a.index].content).innerHTML}}}},condition:{compile:function(a){},test:function(a,b){}}};k.exports=g},{}],6:[function(e,k,h){k.exports=function(e,a,b){a= 100 e.value.evaluate(e,a);b=e.value.evaluate(e,b);a.numeric!==b.numeric&&e.error.dataTypeMismatchError();e=a.content;b=b.content;return e>b?1:e<b?-1:0}},{}],7:[function(e,k,h){var g=Object.assign||function(a){for(var b=1;b<arguments.length;b++){var c=arguments[b],e;for(e in c)Object.prototype.hasOwnProperty.call(c,e)&&(a[e]=c[e])}return a},a=this,b={getTokens:function(){return a.tokens},addWarning:function(b){a.warnings.push(b)},warning:function(a){b.addWarning(a);throw Error();},unrecognisedSymbol:function(a){b.addWarning("Unrecognised symbol '"+ 101 a+"'")},getWarnings:function(){return a.warnings},getIndex:function(){return a.index},next:function(b){a.index+=void 0===b?1:b},peek:function(){return a.tokens[a.index+1].token},getToken:function(){return a.index>=a.tokens.length?null:a.tokens[a.index]?a.tokens[a.index].token:null},prev:function(){a.index--},getLino:function(){return a.index>=a.tokens.length?0:a.tokens[a.index].lino},tokenIs:function(b){return a.index>=a.tokens.length?!1:b===a.tokens[a.index].token},getTarget:function(b){b=void 0=== 102 b?a.index:b;return a.tokens[b].token},getTargetPc:function(c){c=void 0===c?a.index:c;return a.symbols[b.getTarget(c)].pc},getCommandAt:function(b){return a.program[b]},isSymbol:function(){return b.getTarget()in a.symbols},getSymbol:function(){return a.symbols[b.getToken()]},getSymbolPc:function(){return b.getSymbol().pc},getSymbolRecord:function(){return a.program[b.getSymbolPc()]},getSymbols:function(){return a.symbols},getProgram:function(){return a.program},getPc:function(){return a.program.length}, 103 getValue:function(){return b.value.compile(b)},addCommand:function(b){a.program.push(g({pc:a.program.length},b))},addSymbol:function(b,d){a.symbols[b]={pc:d}},mark:function(){a.savedMark=a.index},rewind:function(){a.index=a.savedMark},compileVariable:function(c,d,e,g){e=void 0===e?!1:e;g=void 0===g?null:g;b.next();var f=b.getLino(),h=b.getTokens()[b.getIndex()];a.symbols[h.token]&&b.error.duplicateSymbolError(h.token);var k=b.getPc();b.next();b.addSymbol(h.token,k);b.addCommand({domain:c,keyword:d, 104 lino:f,isSymbol:!0,isValueHolder:e,name:h.token,elements:1,index:0,value:[{}],extra:g})},compileToken:function(){var a=b.getToken();if(a){var d=b.getIndex();b.mark();for(var e=$jscomp.makeIterator(Object.keys(b.domain)),g=e.next();!g.done;g=e.next()){if((g=b.domain[g.value].getHandler(a))&&g.compile(b))return;b.rewind()}b.error.dontUnderstandError(a,d)}},compileOne:function(){var c=b.getToken();if(c){a.warnings=[];var d=a.program.length;c.endsWith(":")?(a.symbols[c.substring(0,c.length-1)]={pc:d}, 105 a.index++):b.compileToken()}},compileFromHere:function(c){for(;a.index<a.tokens.length;){var d=a.tokens[a.index].token;if("else"===d)return a.program;b.compileOne();if(-1<c.indexOf(d))break}},compile:function(c){a.tokens=c;a.index=0;a.program=[];a.symbols={};a.warnings=[];b.compileFromHere([]);b.addCommand({domain:"basic",keyword:"stop",lino:b.getLino(),next:0});return a.program}};k.exports=b},{}],8:[function(e,k,h){var g=Object.assign||function(a){for(var b=1;b<arguments.length;b++){var c=arguments[b], 106 d;for(d in c)Object.prototype.hasOwnProperty.call(c,d)&&(a[d]=c[d])}return a};k.exports={compile:function(a){a.mark();for(var b=$jscomp.makeIterator(Object.keys(a.domain)),c=b.next();!c.done;c=b.next()){if(c=a.domain[c.value].condition.compile(a))return g({domain:name},c);a.rewind()}},test:function(a,b){return a.domain[b.domain].condition.test(a,b)}}},{}],9:[function(e,k,h){var g=function(a,b){var c=function(a){var b=9999;a.forEach(function(a){a=a.line;for(var c=0;c<a.length&&" "===a[c];)c++;0<c&& 107 c<b&&(b=c)});return b},d=[];if(d.length)d.push(b);else for(d.push(b);0<d.length;)for(a.pc=d.shift(),b={};;){a.pc=a.domain[a[a.pc].domain].run(a);if(!a.pc)break;if(a.stop){a.tracing=!1;return}if(a.tracing){var e=a[a.pc],h=a.source.scriptLines,k=c(h),m=document.getElementById("easycoder-tracer");if(m){m.style.display="block";m.style.visibility="visible";var p="";if(a.tracer){a.tracer.variables.forEach(function(b,c,d){var e=a.getSymbolRecord(a,b);p=(e=e.value[e.index])?p+(b+": "+e.content):p+(b+": undefined"); 108 switch(a.tracer.alignment){case "horizontal":c<d.length-1&&(p+=", ");break;case "vertical":p+="<br>"}});p+="<hr>";m="";for(var q=5;0<q;q--)e.lino&&(m+='<input type="text" name="'+q+'" value="'+h[e.lino-q].line.substr(k)+'"style=width:100%;border:none;enabled="false">'),m+="<br>";e=document.getElementById("easycoder-tracer-content");e.innerHTML=p+m;e.style.display="block";b.run=document.getElementById("easycoder-run-button");b.step=document.getElementById("easycoder-step-button");b.run.onclick=function(b){return function(c){b.run.blur(); 109 a.tracing=!1;document.getElementById("easycoder-tracer-content").style.display="none";try{g(a,a.resume)}catch(r){c="Error in run handler: "+r.message,console.log(c),alert(c)}}}(b);b.step.onclick=function(b){return function(c){console.log("step");b.step.blur();a.tracing=!0;document.getElementById("easycoder-tracer-content").style.display="block";try{g(a,a.resume)}catch(r){c="Error in step handler: "+r.message,console.log(c),alert(c)}}}(b);a.resume=a.pc;a.pc=0}}break}b={run:b.run,step:b.step}}};k.exports= 110 g},{}],10:[function(e,k,h){var g={markComments:function(a){var b=a.list,c=void 0===a.index?0:a.index,d=void 0===a.inComment?!1:a.inComment,e=void 0===a.newList?[]:a.newList;if(c>=b.length)return e;var h=b[c];a=h.lino;h=h.token;var k={list:b,index:c+1,inComment:!1,newList:e.concat({lino:a,index:c,token:h})};e={list:b,index:c+1,inComment:!0,newList:e.concat({lino:a,index:c,comment:!0,token:h})};return d&&0<c&&a===b[c-1].lino?g.markComments(e):"!"===h.charAt(0)?g.markComments(e):g.markComments(k)},markSpacesInStrings:function(a){var b= 111 a.line,c=void 0===a.inComment?!1:a.inComment;a=void 0===a.inQuote?!1:a.inQuote;var d=b.charAt(0);d=a&&" "===d?"\\s":d;if(1===b.length)return d;b=b.substring(1);return"!"!==d||a?"{"!==d||c?"}"===d&&a?d+g.markSpacesInStrings({line:b,inComment:c,inQuote:!1}):d+g.markSpacesInStrings({line:b,inComment:c,inQuote:a}):d+g.markSpacesInStrings({line:b,inComment:c,inQuote:!0}):d+g.markSpacesInStrings({line:b,inComment:!0,inQuote:!1})},tokenise:function(a){a=a.split("\n").map(function(a){return a.length?g.markSpacesInStrings({line:a}): 112 ""}).map(function(a,b){return{lino:b+1,line:a}});var b=a.map(function(a){return a.line.trim().split(/\s+/).map(function(b,c){return{lino:a.lino,index:c,token:b}})});b=[].concat.apply([],b).filter(function(a){return a.token}).map(function(a){return{lino:a.lino,index:a.index,token:a.token.split("\\s").join(" ")}});b=g.markComments({list:b}).filter(function(a){return!a.comment});return{scriptLines:a,tokens:b}}};k.exports=g},{}],11:[function(e,k,h){var g={getItem:function(a){var b=a.getToken();if(!b)return null; 113 if("{"===b.charAt(0))return a.next(),{type:"constant",numeric:!1,content:b.substring(1,b.length-1)};if(b[0].match(/[0-9\-]/)){var c=eval(b);if(Number.isInteger(c))return a.next(),{type:"constant",numeric:!0,content:c};a.error.notAnIntegerError(b)}a.mark();b=$jscomp.makeIterator(Object.keys(a.domain));for(c=b.next();!c.done;c=b.next())if(c=a.domain[c.value].value.compile(a))return c;return null},compile:function(a){var b=a.getToken(),c=a.value.getItem(a);c||a.error.undefinedValueError(b);if("cat"=== 114 a.getToken()){for(b={type:"cat",numeric:!1,parts:[c]};a.tokenIs("cat");)a.next(),b.parts.push(a.value.getItem(a));return b}return c},doValue:function(a,b){if("cat"===b.type)return{type:"constant",numeric:!1,content:b.parts.reduce(function(b,c){return b+g.doValue(a,c).content},"")};switch(b.type){case "constant":return b;case "symbol":var c=a.getSymbolRecord(a,b.name);return c.isValueHolder?c.value[c.index]?c.value[c.index]:null:a.domain[c.domain].value.get(a,b);case "boolean":return b}return a.domain[b.domain].value.get(a, 115 b)},evaluate:function(a,b){if(b=g.doValue(a,b))return b;a.error.cantDecodeValueError()},decode:function(a,b){switch(b){case "url":return decodeURIComponent(a.replace(/\+/g," "));default:return a}}};k.exports=g},{}]},{},[1]); 57 a.getLino();a.next();var c=a.getToken();switch(c){case "change":case "click":if(a.next(),a.isSymbol()){var d=a.getSymbolRecord();a.next();if("dom"!==d.extra)return!1;a.addCommand({domain:"browser",keyword:"on",lino:b,action:c,symbol:d.name});c=a.getPc();a.addCommand({domain:"basic",keyword:"goto",goto:0});a.compileOne();a.addCommand({domain:"basic",keyword:"stop",lino:b,next:0});a.getCommandAt(c).goto=a.getPc();return!0}}a.addWarning("Unrecognised syntax in 'on'");return!1},run:function(a){var b= 58 a[a.pc],c=a.getSymbolRecord(b.symbol);switch(b.action){case "change":if("select"===c.keyword){var d=c.value[c.index].content;if(d){var f=document.getElementById(d);f.targetPc=b.pc+2;f.addEventListener("change",function(){try{a.run(a,f.targetPc)}catch(l){console.log(l.message),alert(l.message)}return!1})}}break;case "click":c.value.forEach(function(d,f){if(d=d.content)d=document.getElementById(d),d.targetPc=b.pc+2,d.targetIndex=f,d.onclick=function(b){b.target.blur();c.index=b.target.targetIndex;try{a.run(a, 59 b.target.targetPc)}catch(m){console.log(m.message),alert(m.message)}return!1}})}return b.pc+1}},P:{compile:function(a){a.compileVariable("browser","p",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Play:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getSymbolRecord();"audioclip"===c.keyword&&(a.next(),a.addCommand({domain:"browser",keyword:"play",lino:b,target:c.name}))}return!0},run:function(a){var b=a.getSymbolRecord(a[a.pc].target);b=a.value.evaluate(a,b.value[b.index]).content; 60 (new Audio(b)).play();return a[a.pc].pc+1}},Popup:{compile:function(a){a.compileVariable("browser","popup");return!0},run:function(a){return a[a.pc].pc+1}},PRE:{compile:function(a){a.compileVariable("browser","pre",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Remove:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var c=a.getToken();a.next();a.addCommand({domain:"browser",keyword:"remove",lino:b,symbol:c});return!0}a.unrecognisedSymbol(a.getToken());return!1}, 61 run:function(a){var b=a[a.pc];a=a.getSymbolRecord(b.symbol);document.getElementById(a.value[a.index].content).style.display="none";return b.pc+1}},SELECT:{compile:function(a){a.compileVariable("browser","select",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Set:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getToken();a.next();if(a.tokenIs("from")&&(a.next(),a.isSymbol())){var d=a.getToken();a.next();a.addCommand({domain:"browser",keyword:"set",lino:b,type:"setContentVar", 62 source:d,target:c});return!0}}else if(c=a.getToken(),"the"===c&&(a.next(),c=a.getToken()),"content"===c){if(a.next(),a.tokenIs("of")&&(a.next(),a.isSymbol())){c=a.getToken();a.next();if(a.tokenIs("from")&&(a.next(),a.isSymbol()))return d=a.getToken(),a.next(),a.addCommand({domain:"browser",keyword:"set",lino:b,type:"setContentVar",source:d,target:c}),!0;if(a.tokenIs("to"))return a.next(),d=a.getValue(),a.addCommand({domain:"browser",keyword:"set",lino:b,type:"setContent",value:d,target:c}),!0}}else if("text"=== 63 c){if(a.next(),a.tokenIs("of")&&(a.next(),a.isSymbol()))switch(c=a.getSymbolRecord(),c.keyword){case "button":case "input":if(a.next(),a.tokenIs("to"))return a.next(),d=a.getValue(),a.addCommand({domain:"browser",keyword:"set",lino:b,type:"setText",symbolName:c.name,value:d}),!0}}else if("attribute"===c){if(a.next(),c=a.getValue(),a.tokenIs("of")&&(a.next(),a.isSymbol()&&(d=a.getToken(),a.next(),a.tokenIs("to")))){a.next();var f=a.getValue();a.addCommand({domain:"browser",keyword:"set",lino:b,type:"setAttribute", 64 symbolName:d,attributeName:c,attributeValue:f});return!0}}else if("style"===c&&(a.next(),c=a.getValue(),a.tokenIs("of")&&(a.next(),a.isSymbol()&&(d=a.getToken(),a.next(),a.tokenIs("to")&&(a.next(),f=a.getValue())))))return a.addCommand({domain:"browser",keyword:"set",lino:b,type:"setStyle",symbolName:d,styleName:c,styleValue:f}),!0;a.addWarning("Unrecognised syntax in 'set'");return!1},run:function(a){var b=a[a.pc];switch(b.type){case "setContentVar":var c=a.getSymbolRecord(b.source);a=a.getSymbolRecord(b.target); 65 c=document.getElementById(c.value[c.index].content);var d=document.getElementById(a.value[a.index].content);d.innerHTML=c.innerHTML;break;case "setContent":c=a.value.evaluate(a,b.value);var f=c.content;c.numeric&&(f=""+f);a=a.getSymbolRecord(b.target);a=a.value[a.index].content;d=document.getElementById(a);d.innerHTML=f;break;case "setText":c=a.getSymbolRecord(b.symbolName);d=document.getElementById(c.value[c.index].content);f=a.value.evaluate(a,b.value).content;switch(c.keyword){case "button":d.innerHTML= 66 f;break;case "input":d.value=f}break;case "setAttribute":c=a.getSymbolRecord(b.symbolName);switch(b.attributeValue.type){case "constant":f=b.attributeValue.content;break;case "symbol":a=a.getSymbolRecord(b.attributeValue.name),f=a.value[a.index].content}a=c.value[c.index].content;d=document.getElementById(a);d.setAttribute(b.attributeName.content,f);break;case "setStyle":c=a.getSymbolRecord(b.symbolName),f=a.value.evaluate(a,b.styleValue),c.value[c.index]||a.error.runtimeError("Variable '"+c.name+ 67 "' has not been assigned."),a=c.value[c.index].content,a=document.getElementById(a),c={},c[b.styleName.content]=f.content,Object.assign(a.style,c)}return b.pc+1}},Show:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var c=a.getToken();a.next();a.addCommand({domain:"browser",keyword:"show",lino:b,symbol:c});return!0}a.addWarning("Unrecognised syntax in 'show'");return!1},run:function(a){var b=a[a.pc];a=a.getSymbolRecord(b.symbol);var c=document.getElementById(a.value[a.index].content); 68 switch(a.type){case "span":c.style.display="inline";break;default:c.style.display="block"}c.style.visibility="visible";return b.pc+1}},SPAN:{compile:function(a){a.compileVariable("browser","span",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Trace:{compile:function(a){var b=a.getLino();a.next();var c=[];if(a.isSymbol()){for(;a.isSymbol();)c.push(a.getToken()),a.next();var d="horizontal";if(a.tokenIs("horizontal")||a.tokenIs("vertical"))d=a.getToken(),a.next();a.addCommand({domain:"browser", 69 keyword:"trace",variant:"setup",lino:b,variables:c,alignment:d});return!0}a.addCommand({domain:"browser",keyword:"trace",variant:"run",lino:b});return!0},run:function(a){var b=a[a.pc];switch(b.variant){case "setup":console.log("Set up tracer");a.tracer={variables:b.variables,alignment:b.alignment};break;case "run":console.log("Run tracer"),a.tracer||(a.tracer={variables:[],alignment:"horizontal"}),a.tracing=!0,a.stop=!1}return a.pc+1}},UL:{compile:function(a){a.compileVariable("browser","ul",!1,"dom"); 70 return!0},run:function(a){return a[a.pc].pc+1}},getHandler:function(a){switch(a){case "a":return g.A;case "alert":return g.Alert;case "attach":return g.Attach;case "audioclip":return g.Audioclip;case "button":return g.BUTTON;case "create":return g.Create;case "div":return g.DIV;case "header":case "h1":case "h2":case "h3":case "h4":case "h5":case "h6":return g.Header;case "hide":return g.Hide;case "img":return g.IMG;case "input":return g.INPUT;case "li":return g.LI;case "location":return g.Location; 71 case "on":return g.On;case "p":return g.P;case "play":return g.Play;case "popup":return g.Popup;case "pre":return g.PRE;case "remove":return g.Remove;case "select":return g.SELECT;case "set":return g.Set;case "show":return g.Show;case "span":return g.SPAN;case "trace":return g.Trace;case "ul":return g.UL;default:return!1}},run:function(a){var b=a[a.pc],c=g.getHandler(b.keyword);c||a.error.runtimeError("Unknown keyword '"+b.keyword+"' in 'browser' package");return c.run(a)},value:{compile:function(a){var b= 72 a.getToken();if("property"===b){a.next();b=a.getValue();if(a.tokenIs("of")&&(a.next(),a.isSymbol())){var c=a.getSymbolRecord();a.next();switch(c.keyword){case "select":case "variable":return{domain:"browser",type:"property",property:b,symbol:c.name}}}return null}if("mobile"===b)return a.next(),{domain:"browser",type:"mobile"};if("br"===b)return a.next(),{domain:"browser",type:"br"};if("color"===b)return a.next(),{domain:"browser",type:"color",value:a.getValue()};a.tokenIs("the")&&a.next();b=a.getToken(); 73 return"content"===b?(a.next(),a.tokenIs("of")&&(a.next(),a.isSymbol())?(b=a.getSymbolRecord(),a.next(),{domain:"browser",type:"contentOf",symbol:b.name}):null):["width","height"].includes(b)&&(a.next(),a.tokenIs("of")&&(a.next(),a.isSymbol()&&(c=a.getSymbolRecord(),a.next(),"dom"===c.extra)))?{domain:"browser",type:"width"===b?"widthOf":"heightOf",symbol:c.name}:null},get:function(a,b){switch(b.type){case "symbol":b=a.getSymbolRecord(b.name);a=b.value[b.index].content;switch(b.keyword){case "input":case "select":return a= 74 document.getElementById(a),{type:"constant",numeric:!1,content:a.value}}break;case "property":var c=a.value.evaluate(a,b.property).content;b=a.getSymbolRecord(b.symbol);content=a.value.evaluate(a,b.value[b.index]).content;content=JSON.parse(content);content=a.value.decode(content[c],a.encoding);switch(b.keyword){case "select":document.getElementById(content);break;case "variable":return{type:"constant",numeric:!1,content:content}}break;case "mobile":return{domain:"browser",type:"boolean",content:"undefined"!== 75 typeof window.orientation||-1!==navigator.userAgent.indexOf("IEMobile")};case "br":return{type:"constant",numeric:!1,content:"<br />"};case "contentOf":return b=a.getSymbolRecord(b.symbol),a=b.value[b.index].content,a=document.getElementById(a),{type:"constant",numeric:!1,content:a.textContent};case "widthOf":return b=a.getSymbolRecord(b.symbol),a=b.value[b.index].content,a=document.getElementById(a),{type:"constant",numeric:!0,content:a.offsetWidth};case "heightOf":return b=a.getSymbolRecord(b.symbol), 76 a=b.value[b.index].content,a=document.getElementById(a),{type:"constant",numeric:!0,content:a.offsetHeight};case "color":for(a=a.value.evaluate(a,b.value).content.toString(16);6>a.length;)a="00"+a;return{type:"constant",numeric:!1,content:"#"+a}}}},condition:{compile:function(a){},test:function(a,b){}},setStyles:function(a,b){a=document.getElementById(a);b=b.split(";");b=$jscomp.makeIterator(b);for(var c=b.next();!c.done;c=b.next())c=c.value.split(":"),a.setAttribute(c[0],c[1])}};k.exports=g},{}], 77 4:[function(e,k,h){var g={Json:{compile:function(a){var b=a.getLino();a.getTokens();a.next();switch(a.getToken()){case "get":a.next();if(a.tokenIs("item")){a.next();var c=a.getValue();if(a.tokenIs("of")&&(a.next(),a.isSymbol())){var d=a.getToken();a.next();if(a.tokenIs("as")&&(a.next(),a.isSymbol())){var f=a.getSymbolRecord();if("variable"===f.keyword)return a.next(),a.addCommand({domain:"json",keyword:"json",lino:b,request:"getItem",target:f.name,item:c,source:d}),!0}}a.error.expectedError("of", 78 a.getToken())}else if(a.tokenIs("element")){a.next();c=a.getValue();if(a.tokenIs("of")&&(a.next(),a.isSymbol()&&(d=a.getToken(),a.next(),a.tokenIs("as")&&(a.next(),a.isSymbol()&&(f=a.getSymbolRecord(),"variable"===f.keyword)))))return a.next(),a.addCommand({domain:"json",keyword:"json",lino:b,request:"getElement",target:f.name,element:c,source:d}),!0;a.error.expectedError("of",a.getToken())}if(a.isSymbol()&&(c=a.getSymbolRecord(),"variable"===c.keyword&&(a.next(),a.tokenIs("from"))))return a.next(), 79 d=a.getValue(),a.addCommand({domain:"json",keyword:"json",lino:b,request:"get",target:c.name,value:d}),!0;break;case "set":a.next();if(a.tokenIs("encoding")){a.next();if(a.tokenIs("to"))return a.next(),c=a.getValue(),a.addCommand({domain:"json",keyword:"json",lino:b,request:"encoding",encoding:c}),!0;a.addWarning("Unknown encoding option");return!1}if(a.isSymbol()){c=a.getSymbolRecord();if("select"===c.keyword&&(a.next(),a.tokenIs("from")&&(a.next(),a.isSymbol()&&(d=a.getSymbolRecord(),"variable"=== 80 d.keyword))))return a.next(),f=null,a.tokenIs("as")&&(a.next(),f=a.getValue()),a.addCommand({domain:"json",keyword:"json",lino:b,request:"setList",target:c.name,source:d.name,display:f}),!0;break}case "shuffle":return a.next(),a.isSymbol()&&(c=a.getSymbolRecord(),"variable"===c.keyword)?(a.next(),a.addCommand({domain:"json",keyword:"json",lino:b,request:"shuffle",target:c.name}),!0):!1}a.addWarning("Unrecognised syntax in 'json'");return!1},run:function(a){var b=a[a.pc];switch(b.request){case "get":a.ajaxCommand= 81 b;var c=new XMLHttpRequest;c.onreadystatechange=function(){if(4===this.readyState&&200===this.status){var b=a.ajaxCommand,c=a.getSymbolRecord(b.target);c.value[c.index]={type:"constant",numeric:!1,content:this.responseText};a.run(a,b.pc+1)}};b=a.value.evaluate(a,b.value);c.open("GET",b.content,!0);c.send();return 0;case "getItem":var d=a.getSymbolRecord(b.source);d=JSON.parse(d.value[d.index].content)[a.getValue(b.item)];c=a.getSymbolRecord(b.target);c.value[c.index]={type:"constant",numeric:!1,content:"object"=== 82 typeof d?JSON.stringify(d):d};break;case "getElement":d=a.getSymbolRecord(b.source);d=JSON.parse(d.value[d.index].content)[a.getValue(b.element)];c=a.getSymbolRecord(b.target);c.value[c.index]={type:"constant",numeric:!1,content:"object"===typeof d?JSON.stringify(d):d};break;case "setList":d=a.getSymbolRecord(b.source);c=a.getSymbolRecord(b.target);var f=document.getElementById(c.value[c.index].content);f.options.length=0;var e=b.display?a.value.evaluate(a,b.display).content:null;JSON.parse(d.value[d.index].content).forEach(function(b){var c= 83 document.createElement("option");c.value=e?JSON.stringify(b):b;c.innerHTML=e?a.value.decode(b[e],a.encoding):b;f.appendChild(c)});f.selectedIndex=-1;break;case "encoding":a.encoding=a.getValue(b.encoding);break;case "shuffle":c=a.getSymbolRecord(b.target);d=JSON.parse(a.getValue(c.value[c.index]));for(var g=d.length-1;0<g;g--){var h=Math.floor(Math.random()*(g+1)),k=$jscomp.makeIterator([d[h],d[g]]);d[g]=k.next().value;d[h]=k.next().value}c.value[c.index]={type:"constant",numeric:!1,content:JSON.stringify(d)}}return b.pc+ 84 1}},getHandler:function(a){switch(a){case "json":return g.Json;default:return!1}},run:function(a){var b=a[a.pc],c=g.getHandler(b.keyword);c||a.error.runtimeError("Unknown keyword '"+b.keyword+"' in 'json' package");return c.run(a)},value:{compile:function(a){},get:function(a,b){}},condition:{compile:function(a){},test:function(a,b){}}};k.exports=g},{}],5:[function(e,k,h){var g={Attach:{compile:function(a){var b=a.getLino();a.getTokens();a.next();if(a.isSymbol()){var c=a.getProgram()[a.getSymbol().pc]; 85 switch(c.keyword){case "shape":case "svg":a.next();if(a.tokenIs("to")){a.next();var d=a.getValue();a.addCommand({domain:"svg",keyword:"attach",lino:b,type:c.keyword,symbol:c.name,cssId:d});return!0}break;default:compile.error.InappropriateVariableTypeError(c.keyword)}}a.addWarning("Unrecognised syntax in 'attach'");return!1},run:function(a){var b=a[a.pc],c=a.value.evaluate(a,b.cssId).content;document.getElementById(c)||a.error.noSuchElementError(c);a=a.getSymbolRecord(b.symbol);a.value[a.index]={type:"constant", 86 numeric:"false",content:c};return b.pc+1}},Circle:{compile:function(a){a.compileVariable("svg","circle",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Create:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getSymbolRecord();a.next();switch(c.keyword){case "svg":if(a.tokenIs("in")&&(a.next(),a.isSymbol())){var d=a.getToken();a.next();for(var f=null,e=!0;e;){var g=a.getToken();a.next();switch(g){case "style":f=a.getValue();break;default:a.prev(),e=!1}}f||(f={type:"constant", 87 numeric:!1,content:"width:100%;height:100%"});a.addCommand({domain:"svg",keyword:"create",lino:b,type:"svg",name:c.name,style:f,parent:d});return!0}break;case "group":if(a.tokenIs("in")&&(a.next(),a.isSymbol()))return f=a.getSymbolRecord(),["svg","group"].includes(f.keyword)||a.error.inappropriateTypeError(f.keyword),a.next(),a.addCommand({domain:"svg",keyword:"create",lino:b,type:"group",name:c.name,parent:f.name}),!0;break;case "circle":case "ellipse":case "line":case "rect":case "text":if(a.tokenIs("in")&& 88 (a.next(),a.isSymbol())){d=a.getSymbolRecord();["svg","group"].includes(d.keyword)||a.error.inappropriateTypeError(d.keyword);a.next();for(e=!0;e;){var h=a.getToken();a.next();switch(h){case "style":f=a.getValue();break;case "text":g=a.getValue();break;default:a.prev(),e=!1}}a.addCommand({domain:"svg",keyword:"create",lino:b,type:c.keyword,name:c.name,style:f,text:g,parent:d.name});return!0}}}return!1},run:function(a){var b=a[a.pc],c=a.getSymbolRecord(b.parent),d=a.getSymbolRecord(b.name);if("group"=== 89 b.type)d.parent=b.parent,d.x=0,d.y=0;else{if("group"===c.keyword){var f=c;var e=f.value[f.index];e.content||(e.content=[]);for(e.content.push({name:d.name,index:d.index});"group"===c.keyword;)c=a.getSymbolRecord(c.parent)}e=document.getElementById(c.value[c.index].content);c=document.createElementNS("http://www.w3.org/2000/svg",b.type);e.appendChild(c);e="ec-"+d.name+"-"+d.index;c.setAttribute("id",e);"text"===d.keyword&&(c.textContent=a.value.evaluate(a,b.text).content);d.value[d.index]={type:"constant", 90 numeric:!1,content:e};if(b.style){b=a.value.evaluate(a,b.style).content;a.domain.browser.setStyles(e,b);b=d.value[d.index];switch(d.keyword){case "circle":case "ellipse":b.x=c.getAttribute("cx");b.y=c.getAttribute("cy");break;case "line":b.x=c.getAttribute("x1");b.y=c.getAttribute("y1");b.x2=c.getAttribute("x2");b.y2=c.getAttribute("y2");break;case "rect":case "text":b.x=c.getAttribute("x"),b.y=c.getAttribute("y")}f&&(b.groupName=f.name,b.groupIndex=f.index)}}return a[a.pc].pc+1}},Ellipse:{compile:function(a){a.compileVariable("svg", 91 "ellipse",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Group:{compile:function(a){a.compileVariable("svg","group");return!0},run:function(a){return a[a.pc].pc+1}},Line:{compile:function(a){a.compileVariable("svg","line",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Move:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getSymbolRecord();a.next();if(a.tokenIs("to")){a.next();var d=a.getValue(),f=a.getValue();a.addCommand({domain:"svg",keyword:"move", 92 lino:b,type:"moveTo",name:c.name,x:d,y:f});return!0}}return!1},run:function(a){var b=a[a.pc],c=a.value.evaluate(a,b.x).content,d=a.value.evaluate(a,b.y).content;b=a.getSymbolRecord(b.name);switch(b.keyword){case "group":for(var f=$jscomp.makeIterator(b.value[b.index].content),e=f.next();!e.done;e=f.next()){var g=e.value;e=a.getSymbolRecord(g.name);g=e.value[g.index];var h=document.getElementById(g.content),k=parseInt(g.x)+c,p=parseInt(g.y)+d;switch(e.keyword){case "circle":case "ellipse":h.setAttribute("cx", 93 k);h.setAttribute("cy",p);break;case "line":h.setAttribute("x1",k);h.setAttribute("y1",p);h.setAttribute("x2",parseInt(g.x2)+c);h.setAttribute("y2",parseInt(g.y2)+d);break;case "rect":case "text":h.setAttribute("x",k),h.setAttribute("y",p)}}b.x=c;b.y=d;break;case "circle":case "ellipse":case "line":case "rect":case "text":e=f=0;g=b.value[b.index];g.groupName&&(e=a.getSymbolRecord(g.groupName),f=e.x,e=e.y);g=b.value[b.index];h=document.getElementById(b.value[b.index].content);switch(b.keyword){case "circle":case "ellipse":h.setAttribute("cx", 94 f+c);h.setAttribute("cy",e+d);break;case "line":h.setAttribute("x1",f+c);h.setAttribute("y1",e+d);b=parseInt(g.x2)-parseInt(g.x1);k=parseInt(g.y2)-parseInt(g.y1);h.setAttribute("x2",f+b+c);h.setAttribute("y2",e+k+d);break;case "rect":case "text":h.setAttribute("x",f+c),h.setAttribute("y",e+d)}g.x=c;g.y=d}return a[a.pc].pc+1}},On:{compile:function(a){var b=a.getLino();a.next();var c=a.getToken();switch(c){case "click":if(a.next(),a.isSymbol()){var d=a.getSymbolRecord();a.next();if("group"!==d.keyword)return!1; 95 a.addCommand({domain:"svg",keyword:"on",lino:b,action:c,symbol:d.name});b=a.getPc();a.addCommand({domain:"basic",keyword:"goto",goto:0});a.compileOne();a.getCommandAt(b).goto=a.getPc();return!0}}a.addWarning("Unrecognised syntax in 'on'");return!1},run:function(a){var b=a[a.pc],c=a.getSymbolRecord(b.symbol);switch(b.action){case "click":if("group"===c.keyword)for(var d=$jscomp.makeIterator(c.value),f=d.next();!f.done;f=d.next())if(f=f.value,f.content){f=$jscomp.makeIterator(f.content);for(var e=f.next();!e.done;e= 96 f.next()){e=e.value;var g=a.getSymbolRecord(e.name),h=g.value[e.index];h.content&&(h=document.getElementById(h.content),h.targetPc=b.pc+2,h.contentItem=g,h.contentIndex=e.index,h.onclick=function(b){b.target.blur();var d=b.target.contentItem;d.index=b.target.contentIndex;d=d.value[d.index];if(d.groupName){c.index=d.groupIndex;d=$jscomp.makeIterator(c.value[c.index].content);for(var f=d.next();!f.done;f=d.next())f=f.value,a.getSymbolRecord(f.name).index=f.index}try{a.run(a,b.target.targetPc)}catch(u){a.reportError(a.source, 97 u)}return!1})}}}return b.pc+1}},Rect:{compile:function(a){a.compileVariable("svg","rect",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Set:{compile:function(a){var b=a.getLino();a.next();var c=a.getToken();"the"===c&&(a.next(),c=a.getToken());if("text"===c&&(a.next(),a.tokenIs("of")&&(a.next(),a.isSymbol())))switch(c=a.getSymbolRecord(),c.keyword){case "text":if(a.next(),a.tokenIs("to")){a.next();var d=a.getValue();a.addCommand({domain:"svg",keyword:"set",lino:b,type:"setText",symbolName:c.name, 98 value:d});return!0}}return!1},run:function(a){var b=a[a.pc];switch(b.type){case "setText":var c=a.getSymbolRecord(b.symbolName);var d=document.getElementById(c.value[c.index].content);a=a.value.evaluate(a,b.value).content;switch(c.keyword){case "text":d.innerHTML=a}}return b.pc+1}},SVG:{compile:function(a){a.compileVariable("svg","svg");return!0},run:function(a){return a[a.pc].pc+1}},Text:{compile:function(a){a.compileVariable("svg","text",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}}, 99 getHandler:function(a){switch(a){case "attach":return g.Attach;case "circle":return g.Circle;case "create":return g.Create;case "ellipse":return g.Ellipse;case "group":return g.Group;case "line":return g.Line;case "move":return g.Move;case "on":return g.On;case "rect":return g.Rect;case "set":return g.Set;case "svg":return g.SVG;case "text":return g.Text;default:return!1}},run:function(a){var b=a[a.pc],c=g.getHandler(b.keyword);c||a.error.runtimeError("Unknown keyword '"+b.keyword+"' in 'svg' package"); 100 return c.run(a)},value:{compile:function(a){a.tokenIs("the")&&a.next();if(a.tokenIs("text")&&(a.next(),a.tokenIs("of")&&(a.next(),a.isSymbol()))){var b=a.getSymbolRecord();a.next();if("text"===b.keyword)return{domain:"svg",type:"text",name:b.name}}return null},get:function(a,b){switch(b.type){case "text":return a=a.getSymbolRecord(b.name),{type:"constant",numeric:!1,content:document.getElementById(a.value[a.index].content).innerHTML}}}},condition:{compile:function(a){},test:function(a,b){}}};k.exports= 101 g},{}],6:[function(e,k,h){k.exports=function(e,a,b){a=e.value.evaluate(e,a);b=e.value.evaluate(e,b);a.numeric!==b.numeric&&e.error.dataTypeMismatchError();e=a.content;b=b.content;return e>b?1:e<b?-1:0}},{}],7:[function(e,k,h){var g=Object.assign||function(a){for(var b=1;b<arguments.length;b++){var c=arguments[b],e;for(e in c)Object.prototype.hasOwnProperty.call(c,e)&&(a[e]=c[e])}return a},a=this,b={getTokens:function(){return a.tokens},addWarning:function(b){a.warnings.push(b)},warning:function(a){b.addWarning(a); 102 throw Error();},unrecognisedSymbol:function(a){b.addWarning("Unrecognised symbol '"+a+"'")},getWarnings:function(){return a.warnings},getIndex:function(){return a.index},next:function(b){a.index+=void 0===b?1:b},peek:function(){return a.tokens[a.index+1].token},getToken:function(){return a.index>=a.tokens.length?null:a.tokens[a.index]?a.tokens[a.index].token:null},nextToken:function(){b.next();return b.getToken()},skip:function(c){if(a.index>=a.tokens.length)return null;b.next();b.tokenIs(c)&&b.next()}, 103 prev:function(){a.index--},getLino:function(){return a.index>=a.tokens.length?0:a.tokens[a.index].lino},tokenIs:function(b){return a.index>=a.tokens.length?!1:b===a.tokens[a.index].token},getTarget:function(b){b=void 0===b?a.index:b;return a.tokens[b].token},getTargetPc:function(c){c=void 0===c?a.index:c;return a.symbols[b.getTarget(c)].pc},getCommandAt:function(b){return a.program[b]},isSymbol:function(){return b.getTarget()in a.symbols},getSymbol:function(){return a.symbols[b.getToken()]},getSymbolPc:function(){return b.getSymbol().pc}, 104 getSymbolRecord:function(){return a.program[b.getSymbolPc()]},getSymbols:function(){return a.symbols},getProgram:function(){return a.program},getPc:function(){return a.program.length},getValue:function(){return b.value.compile(b)},getCondition:function(){return b.condition.compile(b)},constant:function(a){return b.value.constant(a)},addCommand:function(b){a.program.push(g({pc:a.program.length},b))},addSymbol:function(b,d){a.symbols[b]={pc:d}},mark:function(){a.savedMark=a.index},rewind:function(){a.index= 105 a.savedMark},compileVariable:function(c,d,e,g){e=void 0===e?!1:e;g=void 0===g?null:g;b.next();var f=b.getLino(),h=b.getTokens()[b.getIndex()];a.symbols[h.token]&&b.error.duplicateSymbolError(h.token);var k=b.getPc();b.next();b.addSymbol(h.token,k);b.addCommand({domain:c,keyword:d,lino:f,isSymbol:!0,isValueHolder:e,name:h.token,elements:1,index:0,value:[{}],extra:g})},compileToken:function(){var a=b.getToken();if(a){var d=b.getIndex();b.mark();for(var e=$jscomp.makeIterator(Object.keys(b.domain)), 106 g=e.next();!g.done;g=e.next()){if((g=b.domain[g.value])&&(g=g.getHandler(a))&&g.compile(b))return;b.rewind()}console.log("No handler found");b.error.dontUnderstandError(a,d)}},compileOne:function(){var c=b.getToken();if(c){a.warnings=[];var d=a.program.length;c.endsWith(":")?(a.symbols[c.substring(0,c.length-1)]={pc:d},a.index++):b.compileToken()}},compileFromHere:function(c){for(;a.index<a.tokens.length;){var d=a.tokens[a.index].token;if("else"===d)return a.program;b.compileOne();if(-1<c.indexOf(d))break}}, 107 compile:function(c){a.tokens=c;a.index=0;a.program=[];a.symbols={};a.warnings=[];b.compileFromHere([]);b.addCommand({domain:"basic",keyword:"stop",lino:b.getLino(),next:0});return a.program}};k.exports=b},{}],8:[function(e,k,h){var g=Object.assign||function(a){for(var b=1;b<arguments.length;b++){var c=arguments[b],d;for(d in c)Object.prototype.hasOwnProperty.call(c,d)&&(a[d]=c[d])}return a};k.exports={compile:function(a){a.mark();for(var b=$jscomp.makeIterator(Object.keys(a.domain)),c=b.next();!c.done;c= 108 b.next()){if(c=a.domain[c.value].condition.compile(a))return g({domain:name},c);a.rewind()}},test:function(a,b){return a.domain[b.domain].condition.test(a,b)}}},{}],9:[function(e,k,h){var g=this,a=e("./Tokenise"),b=e("./Compile"),c=e("./Run"),d=e("./Value"),f=e("./Condition"),l=e("./Compare");h=e("../domain/Basic");var t=e("../domain/Browser"),n=e("../domain/Json");e=e("../domain/Svg");var m={domain:{basic:h,browser:t,json:n,svg:e},compileError:{dontUnderstandError:function(a){throw Error("I don't understand '"+ 109 a+"'");},duplicateSymbolError:function(a){throw Error("Symbol '"+a+"' is a duplicate");},inappropriateTypeError:function(a){throw Error("Inappropriate type '"+a+"'");},inappropriateVariableTypeError:function(a){throw Error("Inappropriate variable type '"+a+"'");},missingInputTypeError:function(){throw Error("Missing input type");},noSuchVariableError:function(a){throw Error("No such variable: "+a);},notAnIntegerError:function(a){throw Error("Value is not an integer: "+a);},undefinedValueError:function(a){throw Error("Undefined value: "+ 110 a);},unknownTypeError:function(a){throw Error("Unknown type: "+a);},unknownVariableError:function(a){throw Error("Unknown variable: "+a);},unrecognisedValueError:function(a){throw Error("I don't understand this value: "+a);},variableDoesNotHoldAValueError:function(a){throw Error("Variable '"+a+"' does not hold a value");},expectedError:function(a,b){throw Error("Expected '"+a+"' but saw '"+b+"'");}},runtimeError:{arrayIndexOutOfRangeError:function(a){throw Error("Array index out of range for "+a); 111 },cantDecodeValueError:function(){throw Error("Can't decode value");},dataTypeMismatchError:function(){throw Error("Data type mismatch");},nonNumericValueError:function(){throw Error("Non-numeric value");},noSuchElementError:function(a){throw Error("No such element: "+a);},runtimeError:function(a){throw Error(a);},undefinedValueError:function(a,b){g.errorPc=b;throw Error("Undefined value: "+a);},variableDoesNotHoldAValueError:function(a){throw Error("Variable '"+a+"' does not hold a value");}},setupTracer:function(){var a= 112 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")},reportError:function(a,c){var d=b.getProgram(),e=a.tokens;a=a.scriptLines;e=g.compiling?e[b.getIndex()].lino:d.pc.lino;d="";var f=e-5;for(f=0>f?0:f;f<e;f++){for(var h=""+f;4>h.length;)h=" "+ 113 h;d+=h+" "+a[f].line+"\n"}d+=c.message+"\n";c=b.getWarnings();if(c.length)for(d+="Warnings:\n",c=$jscomp.makeIterator(c),a=c.next();!a.done;a=c.next())d+=a.value+"\n";console.log(d);alert(d)},getSymbolRecord:function(a){a=g.program[g.program.symbols[a].pc];return a.alias?g.program[g.program.symbols[a.alias].pc]:a},evaluate:function(a){return d.evaluate(g.program,a)},getValue:function(a){return d.getValue(g.program,a)},compileScript:function(a,e){m.domain.ext=e;e=a.tokens;try{g.compiling=!0;var h= 114 Date.now();b.value=d;b.condition=f;b.domain=m.domain;b.error=m.compileError;var k=b.compile(e);g.program=k;var v=Date.now();console.log("Compiled "+e.length+" tokens in "+(v-h)+"ms");g.compiling=!1;k.source=a;k.run=c;k.value=d;k.evaluate=m.evaluate;k.getValue=m.getValue;k.condition=f;k.compare=l;k.domain=m.domain;k.getSymbolRecord=m.getSymbolRecord;k.error=m.runtimeError;k.reportError=m.reportError;k.symbols=b.getSymbols();k.encoding="none";k.popups=[];k.stack=[];k.queue=[0];m.setupTracer();console.log("Run the script"); 115 k.run(k,0)}catch(r){m.reportError(a,r)}},start:function(b,c){c=void 0===c?null:c;try{var d=Date.now(),e=a.tokenise(b),f=Date.now();console.log("Tokenised "+e.scriptLines.length+" lines in "+(f-d)+"ms");m.compileScript(e,c)}catch(r){console.log(r)}}};k.exports=m},{"../domain/Basic":2,"../domain/Browser":3,"../domain/Json":4,"../domain/Svg":5,"./Compare":6,"./Compile":7,"./Condition":8,"./Run":10,"./Tokenise":11,"./Value":12}],10:[function(e,k,h){var g=function(a,b){var c=function(a){var b=9999;a.forEach(function(a){a= 116 a.line;for(var c=0;c<a.length&&" "===a[c];)c++;0<c&&c<b&&(b=c)});return b},d=[];if(d.length)d.push(b);else for(d.push(b);0<d.length;)for(a.pc=d.shift(),b={};;){a.pc=a.domain[a[a.pc].domain].run(a);if(!a.pc)break;if(a.stop){a.tracing=!1;return}if(a.tracing){var e=a[a.pc],h=a.source.scriptLines,k=c(h),n=document.getElementById("easycoder-tracer");if(n){n.style.display="block";n.style.visibility="visible";var m="";if(a.tracer){a.tracer.variables.forEach(function(b,c,d){var e=a.getSymbolRecord(b);m=(e= 117 e.value[e.index])?m+(b+": "+e.content):m+(b+": undefined");switch(a.tracer.alignment){case "horizontal":c<d.length-1&&(m+=", ");break;case "vertical":m+="<br>"}});m+="<hr>";n="";for(var p=5;0<p;p--)e.lino&&(n+='<input type="text" name="'+p+'" value="'+h[e.lino-p].line.substr(k)+'"style=width:100%;border:none;enabled="false">'),n+="<br>";e=document.getElementById("easycoder-tracer-content");e.innerHTML=m+n;e.style.display="block";b.run=document.getElementById("easycoder-run-button");b.step=document.getElementById("easycoder-step-button"); 118 b.run.onclick=function(b){return function(c){b.run.blur();a.tracing=!1;document.getElementById("easycoder-tracer-content").style.display="none";try{g(a,a.resume)}catch(q){c="Error in run handler: "+q.message,console.log(c),alert(c)}}}(b);b.step.onclick=function(b){return function(c){console.log("step");b.step.blur();a.tracing=!0;document.getElementById("easycoder-tracer-content").style.display="block";try{g(a,a.resume)}catch(q){c="Error in step handler: "+q.message,console.log(c),alert(c)}}}(b);a.resume= 119 a.pc;a.pc=0}}break}b={run:b.run,step:b.step}}};k.exports=g},{}],11:[function(e,k,h){var g={markComments:function(a){var b=a.list,c=void 0===a.index?0:a.index,d=void 0===a.inComment?!1:a.inComment,e=void 0===a.newList?[]:a.newList;if(c>=b.length)return e;var h=b[c];a=h.lino;h=h.token;var k={list:b,index:c+1,inComment:!1,newList:e.concat({lino:a,index:c,token:h})};e={list:b,index:c+1,inComment:!0,newList:e.concat({lino:a,index:c,comment:!0,token:h})};return d&&0<c&&a===b[c-1].lino?g.markComments(e): 120 "!"===h.charAt(0)?g.markComments(e):g.markComments(k)},markSpacesInStrings:function(a){var b=a.line,c=void 0===a.inComment?!1:a.inComment;a=void 0===a.inQuote?!1:a.inQuote;var d=b.charAt(0);d=a&&" "===d?"\\s":d;if(1===b.length)return d;b=b.substring(1);return"!"!==d||a?"{"!==d||c?"}"===d&&a?d+g.markSpacesInStrings({line:b,inComment:c,inQuote:!1}):d+g.markSpacesInStrings({line:b,inComment:c,inQuote:a}):d+g.markSpacesInStrings({line:b,inComment:c,inQuote:!0}):d+g.markSpacesInStrings({line:b,inComment:!0, 121 inQuote:!1})},tokenise:function(a){a=a.split("\n").map(function(a){return a.length?g.markSpacesInStrings({line:a}):""}).map(function(a,b){return{lino:b+1,line:a}});var b=a.map(function(a){return a.line.trim().split(/\s+/).map(function(b,c){return{lino:a.lino,index:c,token:b}})});b=[].concat.apply([],b).filter(function(a){return a.token}).map(function(a){return{lino:a.lino,index:a.index,token:a.token.split("\\s").join(" ")}});b=g.markComments({list:b}).filter(function(a){return!a.comment});return{scriptLines:a, 122 tokens:b}}};k.exports=g},{}],12:[function(e,k,h){var g={getItem:function(a){var b=a.getToken();if(!b)return null;if("{"===b.charAt(0))return a.next(),{type:"constant",numeric:!1,content:b.substring(1,b.length-1)};if(b[0].match(/[0-9\-]/)){var c=eval(b);if(Number.isInteger(c))return a.next(),{type:"constant",numeric:!0,content:c};a.error.notAnIntegerError(b)}a.mark();b=$jscomp.makeIterator(Object.keys(a.domain));for(c=b.next();!c.done;c=b.next())if(c=a.domain[c.value].value.compile(a))return c;return null}, 123 compile:function(a){var b=a.getToken(),c=a.value.getItem(a);c||a.error.undefinedValueError(b);if("cat"===a.getToken()){for(b={type:"cat",numeric:!1,parts:[c]};a.tokenIs("cat");)a.next(),b.parts.push(a.value.getItem(a));return b}return c},doValue:function(a,b){if("cat"===b.type)return{type:"constant",numeric:!1,content:b.parts.reduce(function(b,c){return b+g.doValue(a,c).content},"")};switch(b.type){case "constant":return b;case "symbol":var c=a.getSymbolRecord(b.name);return c.isValueHolder?c.value[c.index]? 124 c.value[c.index]:null:a.domain[c.domain].value.get(a,b);case "boolean":return b}return a.domain[b.domain].value.get(a,b)},constant:function(a){return{type:"constant",numeric:"false",content:a}},evaluate:function(a,b){if(!b)return{type:"constant",numeric:!1,content:""};if(b=g.doValue(a,b))return b;a.error.cantDecodeValueError()},getValue:function(a,b){return g.evaluate(a,b).content},decode:function(a,b){switch(b){case "url":return decodeURIComponent(a.replace(/\+/g," "));default:return a}}};k.exports= 125 g},{}]},{},[1]); -
easycoder/trunk/easycoder.js
r1885298 r1949051 1 1 (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ 2 var _this = this; 3 4 const EasyCoder_Tokenise = require('./easycoder/Tokenise'); 5 const EasyCoder_Compiler = require('./easycoder/Compile'); 6 const EasyCoder_Run = require('./easycoder/Run'); 7 const EasyCoder_Value = require('./easycoder/Value'); 8 const EasyCoder_Condition = require('./easycoder/Condition'); 9 const EasyCoder_Compare = require('./easycoder/Compare'); 10 const EasyCoder_Basic = require('./domain/Basic'); 11 const EasyCoder_Browser = require('./domain/Browser'); 12 const EasyCoder_Json = require('./domain/Json'); 13 const EasyCoder_Svg = require('./domain/Svg'); 14 15 const EasyCoder = { 16 17 domain: { 18 basic: EasyCoder_Basic, 19 browser: EasyCoder_Browser, 20 json: EasyCoder_Json, 21 svg: EasyCoder_Svg 22 }, 23 24 compileError: { 25 dontUnderstandError: name => { 26 throw Error('I don\'t understand \'' + name + '\''); 27 }, 28 duplicateSymbolError: name => { 29 throw Error('Symbol \'' + name + '\' is a duplicate'); 30 }, 31 inappropriateTypeError: name => { 32 throw Error('Inappropriate type \'' + name + '\''); 33 }, 34 inappropriateVariableTypeError: name => { 35 throw Error('Inappropriate variable type \'' + name + '\''); 36 }, 37 noSuchVariableError: name => { 38 throw Error('No such variable: ' + name); 39 }, 40 notAnIntegerError: name => { 41 throw Error('Value is not an integer: ' + name); 42 }, 43 undefinedValueError: name => { 44 throw Error('Undefined value: ' + name); 45 }, 46 unknownTypeError: name => { 47 throw Error('Unknown type: ' + name); 48 }, 49 unknownVariableError: name => { 50 throw Error('Unknown variable: ' + name); 51 }, 52 unrecognisedValueError: name => { 53 throw Error('I don\'t understand this value: ' + name); 54 }, 55 variableDoesNotHoldAValueError: name => { 56 throw Error('Variable \'' + name + '\' does not hold a value'); 57 } 58 }, 59 60 runtimeError: { 61 arrayIndexOutOfRangeError: name => { 62 throw Error('Array index out of range for ' + name); 63 }, 64 cantDecodeValueError: () => { 65 throw Error('Can\'t decode value'); 66 }, 67 dataTypeMismatchError: () => { 68 throw Error('Data type mismatch'); 69 }, 70 nonNumericValueError: () => { 71 throw Error('Non-numeric value'); 72 }, 73 noSuchElementError: name => { 74 throw Error('No such element: ' + name); 75 }, 76 runtimeError: message => { 77 throw Error(message); 78 }, 79 undefinedValueError: (name, pc) => { 80 _this.errorPc = pc; 81 throw Error('Undefined value: ' + name); 82 }, 83 variableDoesNotHoldAValueError: name => { 84 throw Error('Variable \'' + name + '\' does not hold a value'); 85 } 86 }, 87 88 setupTracer: () => { 89 const tracer = document.getElementById('easycoder-tracer'); 90 if (tracer) { 91 tracer.innerHTML = '<div><input id="easycoder-run-button" type="button" value="Run" />' + '<input id="easycoder-step-button" type="button" value="Step" />' + '<div id="easycoder-tracer-content" style="border:1px solid black;padding:4px";width:100%>' + '</div>'; 92 tracer.style.display = 'none'; 93 // } else { 94 // console.log('No tracer element'); 95 } 96 }, 97 98 reportError: (source, err) => { 99 const compiler = EasyCoder_Compiler; 100 const program = compiler.getProgram(); 101 const { tokens, scriptLines } = source; 102 const lino = _this.compiling ? tokens[compiler.getIndex()].lino : program.pc.lino; 103 var errString = ''; 104 let start = lino - 5; 105 start = start < 0 ? 0 : start; 106 for (var n = start; n < lino; n++) { 107 let nn = '' + n; 108 while (nn.length < 4) { 109 nn = ' ' + nn; 110 } 111 errString += nn + ' ' + scriptLines[n].line + '\n'; 112 } 113 errString += err.message + '\n'; 114 const warnings = EasyCoder_Compiler.getWarnings(); 115 if (warnings.length) { 116 errString += 'Warnings:\n'; 117 for (const warning of warnings) { 118 errString += warning + '\n'; 119 } 120 } 121 console.log(errString); 122 alert(errString); 123 }, 124 125 getSymbolRecord: (program, name) => { 126 const target = program[program.symbols[name].pc]; 127 if (target.alias) { 128 return program[program.symbols[target.alias].pc]; 129 } 130 return target; 131 }, 132 133 compileScript: source => { 134 const { tokens } = source; 135 try { 136 // console.log('Compile script: '); 137 _this.compiling = true; 138 const startCompile = Date.now(); 139 const compiler = EasyCoder_Compiler; 140 compiler.value = EasyCoder_Value; 141 compiler.condition = EasyCoder_Condition; 142 compiler.domain = EasyCoder.domain; 143 compiler.error = EasyCoder.compileError; 144 const program = EasyCoder_Compiler.compile(tokens); 145 const finishCompile = Date.now(); 146 console.log('Compiled ' + tokens.length + ' tokens in ' + (finishCompile - startCompile) + 'ms'); 147 // console.log('Program: ' + JSON.stringify(program, null, 2)); 148 _this.compiling = false; 149 150 program.source = source; 151 program.run = EasyCoder_Run; 152 program.value = EasyCoder_Value; 153 program.condition = EasyCoder_Condition; 154 program.compare = EasyCoder_Compare; 155 program.domain = EasyCoder.domain; 156 program.getSymbolRecord = EasyCoder.getSymbolRecord; 157 program.error = EasyCoder.runtimeError; 158 program.reportError = EasyCoder.reportError; 159 program.symbols = compiler.getSymbols(); 160 program.encoding = 'none'; 161 program.popups = []; 162 program.stack = []; 163 program.queue = [0]; 164 EasyCoder.setupTracer(); 165 console.log('Run the script'); 166 program.run(program, 0); 167 // console.log('Program: '+ JSON.stringify(program, null, 2)); 168 } catch (err) { 169 EasyCoder.reportError(source, err); 170 } 171 }, 172 173 start: script => { 174 // console.log('Tokenise script: '); 175 try { 176 const startTokenise = Date.now(); 177 const source = EasyCoder_Tokenise.tokenise(script); 178 const finishTokenise = Date.now(); 179 console.log('Tokenised ' + source.scriptLines.length + ' lines in ' + (finishTokenise - startTokenise) + 'ms'); 180 // console.log('Source: ' + JSON.stringify(source, null, 2)); 181 EasyCoder.compileScript(source); 182 } catch (err) { 183 console.log(err); 184 } 185 } 186 }; 187 188 console.log('Starting EasyCoder...'); 2 // WordPress version of EasyCoder 3 4 const EasyCoder = require('./easycoder/Main'); 5 6 console.log('Starting up EasyCoder...'); 189 7 window.onload = function () { 190 8 // console.log("Page is ready"); … … 196 14 } 197 15 }; 198 },{"./ domain/Basic":2,"./domain/Browser":3,"./domain/Json":4,"./domain/Svg":5,"./easycoder/Compare":6,"./easycoder/Compile":7,"./easycoder/Condition":8,"./easycoder/Run":9,"./easycoder/Tokenise":10,"./easycoder/Value":11}],2:[function(require,module,exports){16 },{"./easycoder/Main":9}],2:[function(require,module,exports){ 199 17 var _this = this; 200 18 … … 274 92 const value1 = command.value1; 275 93 const value2 = command.value2; 276 const target = program.getSymbolRecord( program,command.target);94 const target = program.getSymbolRecord(command.target); 277 95 if (target.isValueHolder) { 278 96 const value = target.value[target.index]; 279 97 if (value2) { 280 const result = program. value.evaluate(program, value2).content + program.value.evaluate(program, value1).content;98 const result = program.getValue(value2) + program.getValue(value1); 281 99 target.value[target.index] = { 282 100 type: 'constant', … … 288 106 program.error.nonNumericValueError(); 289 107 } 290 const result = value.content + program. value.evaluate(program, value1).content;108 const result = value.content + program.getValue(value1); 291 109 target.value[target.index] = { 292 110 type: 'constant', … … 333 151 const aliasPc = program.symbols[command.alias].pc; 334 152 const aliasRecord = program[aliasPc]; 335 const symbolRecord = program.getSymbolRecord( program,command.symbol);153 const symbolRecord = program.getSymbolRecord(command.symbol); 336 154 program[aliasPc] = { 337 155 pc: aliasRecord.pc, … … 381 199 const command = program[program.pc]; 382 200 const value = command.value; 383 const symbol = program.getSymbolRecord( program,command.symbol);201 const symbol = program.getSymbolRecord(command.symbol); 384 202 if (symbol.isValueHolder) { 385 203 const handler = program.domain[symbol.domain]; … … 443 261 return true; 444 262 } 445 program.error.NoSuchVariableError(compiler.getToken());263 compiler.error.NoSuchVariableError(compiler.getToken()); 446 264 }, 447 265 … … 454 272 break; 455 273 case 'symbol': 456 console.log('Symbol: ' + JSON.stringify(program.getSymbolRecord( program,command.name), null, 2));274 console.log('Symbol: ' + JSON.stringify(program.getSymbolRecord(command.name), null, 2)); 457 275 break; 458 276 default: … … 528 346 const value1 = command.value1; 529 347 const value2 = command.value2; 530 const target = program.getSymbolRecord( program,command.target);348 const target = program.getSymbolRecord(command.target); 531 349 if (target.isValueHolder) { 532 350 const value = target.value[target.index]; 533 351 if (value1) { 534 const result = program. value.evaluate(program, value1).content / program.value.evaluate(program, value2).content;352 const result = program.getValue(value1) / program.getValue(value2); 535 353 target.value[target.index] = { 536 354 type: 'constant', … … 542 360 program.error.nonNumericValueError(); 543 361 } 544 const result = value.content / program. value.evaluate(program, value2).content;362 const result = value.content / program.getValue(value2); 545 363 target.value[target.index] = { 546 364 type: 'constant', … … 589 407 try { 590 408 if (typeof EasyCoder_extension === 'function') { 591 const request = program. value.evaluate(program, command.request).content;592 const data = program. value.evaluate(program, command.data).content;409 const request = program.getValue(command.request); 410 const data = program.getValue(command.data); 593 411 EasyCoder_extension(program, request, data); 594 412 } else { … … 790 608 run: program => { 791 609 const command = program[program.pc]; 792 const symbol = program.getSymbolRecord( program,command.symbol);793 symbol.index = program. value.evaluate(program, command.value).content;610 const symbol = program.getSymbolRecord(command.symbol); 611 symbol.index = program.getValue(command.value); 794 612 if (symbol.index >= symbol.elements) { 795 613 program.error.arrayIndexOutOfRangeError(symbol.name); … … 859 677 const value1 = command.value1; 860 678 const value2 = command.value2; 861 const target = program.getSymbolRecord( program,command.target);679 const target = program.getSymbolRecord(command.target); 862 680 if (target.isValueHolder) { 863 681 const value = target.value[target.index]; 864 682 if (value1) { 865 const result = program. value.evaluate(program, value1).content * program.value.evaluate(program, value2).content;683 const result = program.getValue(value1) * program.getValue(value2); 866 684 target.value[target.index] = { 867 685 type: 'constant', … … 873 691 program.error.nonNumericValueError(); 874 692 } 875 const result = value.content * program. value.evaluate(program, value2).content;693 const result = value.content * program.getValue(value2); 876 694 target.value[target.index] = { 877 695 type: 'constant', … … 910 728 const command = program[program.pc]; 911 729 const value = command.value; 912 const symbol = program.getSymbolRecord( program,command.symbol);730 const symbol = program.getSymbolRecord(command.symbol); 913 731 if (symbol.isValueHolder) { 914 732 symbol.value[symbol.index] = { … … 941 759 run: program => { 942 760 const command = program[program.pc]; 943 const value = program. value.evaluate(program, command.value).content;761 const value = program.getValue(command.value); 944 762 console.log('-> ' + value); 945 return program[program.pc].pc + 1;763 return command.pc + 1; 946 764 } 947 765 }, … … 978 796 const command = program[program.pc]; 979 797 const value = command.value; 980 const target = program.getSymbolRecord( program,command.target);798 const target = program.getSymbolRecord(command.target); 981 799 if (!target.isValueHolder) { 982 800 program.error.variableDoesNotHoldAValueError(target.name); 983 801 } 984 target.value[target.index] = program. value.evaluate(program,value);802 target.value[target.index] = program.evaluate(value); 985 803 return command.pc + 1; 986 804 } … … 1086 904 switch (command.type) { 1087 905 case 'setBoolean': 1088 const target = program.getSymbolRecord( program,command.target);906 const target = program.getSymbolRecord(command.target); 1089 907 if (target.isValueHolder) { 1090 908 target.value[target.index] = { … … 1098 916 break; 1099 917 case 'setElements': 1100 const symbol = program.getSymbolRecord( program,command.symbol);1101 symbol.elements = program. value.evaluate(program, command.value).content;918 const symbol = program.getSymbolRecord(command.symbol); 919 symbol.elements = program.getValue(command.value); 1102 920 symbol.index = 0; 1103 921 symbol.value = []; … … 1107 925 break; 1108 926 case 'setArray': 1109 const targetRecord = program.getSymbolRecord( program,command.target);927 const targetRecord = program.getSymbolRecord(command.target); 1110 928 targetRecord.elements = command.value.length; 1111 929 targetRecord.value = command.value; … … 1210 1028 const value1 = command.value1; 1211 1029 const value2 = command.value2; 1212 const target = program.getSymbolRecord( program,command.target);1030 const target = program.getSymbolRecord(command.target); 1213 1031 if (target.isValueHolder) { 1214 1032 const value = target.value[target.index]; 1215 1033 if (value2) { 1216 const result = program. value.evaluate(program, value2).content - program.value.evaluate(program, value1).content;1034 const result = program.getValue(value2) - program.getValue(value1); 1217 1035 target.value[target.index] = { 1218 1036 type: 'constant', … … 1224 1042 program.error.nonNumericValueError(); 1225 1043 } 1226 const result = program. value.evaluate(program, value).content - program.value.evaluate(program, value1).content;1044 const result = program.getValue(value) - program.getValue(value1); 1227 1045 target.value[target.index] = { 1228 1046 type: 'constant', … … 1326 1144 run: program => { 1327 1145 const command = program[program.pc]; 1328 const value = program. value.evaluate(program, command.value).content;1146 const value = program.getValue(command.value); 1329 1147 setTimeout(function () { 1330 1148 program.run(program, command.pc + 1); … … 1339 1157 const lino = compiler.getLino(); 1340 1158 compiler.next(); 1341 const condition = compiler. condition.compile(compiler);1159 const condition = compiler.getCondition(); 1342 1160 const pc = compiler.getPc(); 1343 1161 compiler.addCommand({ … … 1506 1324 }; 1507 1325 } 1326 if (token === 'cos') { 1327 compiler.next(); 1328 const angle_c = compiler.getValue(); 1329 compiler.skip('radius'); 1330 const radius_c = compiler.getValue(); 1331 return { 1332 domain: 'basic', 1333 type: 'cos', 1334 angle_c, 1335 radius_c 1336 }; 1337 } 1338 if (token === 'sin') { 1339 compiler.next(); 1340 const angle_s = compiler.getValue(); 1341 compiler.skip('radius'); 1342 const radius_s = compiler.getValue(); 1343 return { 1344 domain: 'basic', 1345 type: 'sin', 1346 angle_s, 1347 radius_s 1348 }; 1349 } 1350 if (token === 'tan') { 1351 compiler.next(); 1352 const angle_t = compiler.getValue(); 1353 compiler.skip('radius'); 1354 const radius_t = compiler.getValue(); 1355 return { 1356 domain: 'basic', 1357 type: 'tan', 1358 angle_t, 1359 radius_t 1360 }; 1361 } 1508 1362 if (token === 'empty') { 1509 1363 compiler.next(); … … 1516 1370 compiler.next(); 1517 1371 } 1518 token = compiler.getToken(); 1519 if (token === 'index') { 1520 compiler.next(); 1521 if (compiler.tokenIs('of')) { 1372 switch (compiler.getToken()) { 1373 case 'index': 1522 1374 compiler.next(); 1523 if (compiler.isSymbol()) { 1524 const name = compiler.getToken(); 1375 if (compiler.tokenIs('of')) { 1525 1376 compiler.next(); 1377 if (compiler.isSymbol()) { 1378 const name = compiler.getToken(); 1379 compiler.next(); 1380 return { 1381 domain: 'basic', 1382 type: 'index', 1383 name 1384 }; 1385 } 1386 } 1387 break; 1388 case 'value': 1389 compiler.next(); 1390 if (compiler.tokenIs('of')) { 1391 compiler.next(); 1392 const value = compiler.getValue(); 1526 1393 return { 1527 1394 domain: 'basic', 1528 type: ' index',1529 name1395 type: 'valueOf', 1396 value 1530 1397 }; 1531 1398 } 1532 } 1533 } else if (token === 'value') { 1534 compiler.next(); 1535 if (compiler.tokenIs('of')) { 1399 break; 1400 case 'length': 1536 1401 compiler.next(); 1537 const value = compiler.getValue(); 1538 return { 1539 domain: 'basic', 1540 type: 'valueOf', 1541 value 1542 }; 1543 } 1544 } 1402 if (compiler.tokenIs('of')) { 1403 compiler.next(); 1404 const value = compiler.getValue(); 1405 return { 1406 domain: 'basic', 1407 type: 'lengthOf', 1408 value 1409 }; 1410 } 1411 break; 1412 case 'left': 1413 compiler.next(); 1414 const leftCount = compiler.getValue(); 1415 if (compiler.tokenIs("of")) { 1416 compiler.next(); 1417 const leftValue = compiler.getValue(); 1418 return { 1419 domain: 'basic', 1420 type: 'left', 1421 count: leftCount, 1422 value: leftValue 1423 }; 1424 } 1425 break; 1426 case 'right': 1427 compiler.next(); 1428 const rightCount = compiler.getValue(); 1429 if (compiler.tokenIs("of")) { 1430 compiler.next(); 1431 const rightValue = compiler.getValue(); 1432 return { 1433 domain: 'basic', 1434 type: 'right', 1435 count: rightCount, 1436 value: rightValue 1437 }; 1438 } 1439 break; 1440 }; 1545 1441 return null; 1546 1442 }, … … 1558 1454 type: 'constant', 1559 1455 numeric: true, 1560 content: program.getSymbolRecord( program,value.name).index1456 content: program.getSymbolRecord(value.name).index 1561 1457 }; 1562 1458 case 'random': 1563 const range = program. value.evaluate(program,value.range);1459 const range = program.evaluate(value.range); 1564 1460 return { 1565 1461 type: 'constant', … … 1567 1463 content: Math.floor(Math.random() * range.content) 1568 1464 }; 1569 case 'valueOf': 1570 const parsed = program.value.evaluate(program, value.value); 1465 case 'cos': 1466 const angle_c = program.getValue(value.angle_c); 1467 const radius_c = program.getValue(value.radius_c); 1571 1468 return { 1572 1469 type: 'constant', 1573 1470 numeric: true, 1574 content: parseInt(parsed.content) 1471 content: parseInt(Math.cos(parseFloat(angle_c) * 0.01745329) * radius_c, 10) 1472 }; 1473 case 'sin': 1474 const angle_s = program.getValue(value.angle_s); 1475 const radius_s = program.getValue(value.radius_s); 1476 return { 1477 type: 'constant', 1478 numeric: true, 1479 content: parseInt(Math.sin(parseFloat(angle_s) * 0.01745329) * radius_s, 10) 1480 }; 1481 case 'tan': 1482 const angle_t = program.getValue(value.angle_t); 1483 const radius_t = program.getValue(value.radius_t); 1484 return { 1485 type: 'constant', 1486 numeric: true, 1487 content: parseInt(Math.tan(parseFloat(angle_t) * 0.01745329) * radius_t, 10) 1488 }; 1489 case 'valueOf': 1490 return { 1491 type: 'constant', 1492 numeric: true, 1493 content: program.getValue(value.value) 1494 }; 1495 case 'lengthOf': 1496 return { 1497 type: 'constant', 1498 numeric: true, 1499 content: program.getValue(value.value).length 1500 }; 1501 case 'left': 1502 const lv = program.getValue(value.value); 1503 return { 1504 type: 'constant', 1505 numeric: false, 1506 content: program.getValue(value.value).substr(0, program.getValue(value.count)) 1575 1507 }; 1576 1508 case 'modulo': 1577 const symbolRecord = program.getSymbolRecord( program,value.name);1578 const modval = program. value.evaluate(program,value.value);1509 const symbolRecord = program.getSymbolRecord(value.name); 1510 const modval = program.evaluate(value.value); 1579 1511 return { 1580 1512 type: 'constant', … … 1671 1603 switch (condition.type) { 1672 1604 case 'boolean': 1673 return program. value.evaluate(program, condition.value).content;1605 return program.getValue(condition.value); 1674 1606 case 'is': 1675 1607 comparison = program.compare(program, condition.value1, condition.value2); … … 1682 1614 return condition.negate ? comparison >= 0 : comparison < 0; 1683 1615 case 'not': 1684 return !program. value.evaluate(program, condition.value).content;1616 return !program.getValue(condition.value); 1685 1617 } 1686 1618 ; … … 1748 1680 case 'select': 1749 1681 case 'span': 1682 case 'pre': 1750 1683 case 'popup': 1751 1684 compiler.next(); … … 1780 1713 program.error.noSuchElementError(cssId); 1781 1714 } 1782 const target = program.getSymbolRecord( program,command.symbol);1715 const target = program.getSymbolRecord(command.symbol); 1783 1716 target.value[target.index] = { 1784 1717 type: 'constant', … … 1833 1766 const target = symbolRecord.name; 1834 1767 compiler.next(); 1835 if (symbolRecord.keyword === 'audioclip') { 1836 if (compiler.tokenIs('from')) { 1837 compiler.next(); 1838 } 1839 const value = compiler.getValue(); 1840 compiler.addCommand({ 1841 domain: 'browser', 1842 keyword: 'create', 1843 lino, 1844 target, 1845 value 1846 }); 1847 return true; 1768 switch (symbolRecord.keyword) { 1769 case 'audioclip': 1770 if (compiler.tokenIs('from')) { 1771 compiler.next(); 1772 } 1773 const value = compiler.getValue(); 1774 compiler.addCommand({ 1775 domain: 'browser', 1776 keyword: 'create', 1777 type: 'audioclip', 1778 name: symbolRecord.name, 1779 lino, 1780 target, 1781 value 1782 }); 1783 return true; 1784 case 'div': 1785 case 'p': 1786 case 'h1': 1787 case 'h2': 1788 case 'h3': 1789 case 'h4': 1790 case 'h5': 1791 case 'h6': 1792 case 'span': 1793 case 'button': 1794 case 'input': 1795 case 'pre': 1796 var inputType = ''; 1797 if (symbolRecord.keyword === 'input') { 1798 if (compiler.tokenIs('type')) { 1799 compiler.next(); 1800 inputType = compiler.getToken(); 1801 compiler.next(); 1802 } else { 1803 compiler.error.missingInputTypeError(); 1804 } 1805 } 1806 if (compiler.tokenIs('in')) { 1807 compiler.next(); 1808 if (compiler.isSymbol()) { 1809 const parentRecord = compiler.getSymbolRecord(); 1810 if (parentRecord.extra !== 'dom') { 1811 compiler.error.inappropriateTypeError(parentRecord.keyword); 1812 } 1813 compiler.next(); 1814 var className = ''; 1815 var style = ''; 1816 var text = ''; 1817 var flag = true; 1818 while (flag) { 1819 const token = compiler.getToken(); 1820 if (!token) { 1821 break; 1822 } 1823 compiler.next(); 1824 switch (token) { 1825 case 'class': 1826 className = compiler.getValue(); 1827 break; 1828 case 'style': 1829 style = compiler.getValue(); 1830 break; 1831 case 'text': 1832 text = compiler.getValue(); 1833 break; 1834 default: 1835 compiler.prev(); 1836 flag = false; 1837 break; 1838 } 1839 } 1840 compiler.addCommand({ 1841 domain: 'browser', 1842 keyword: 'create', 1843 lino, 1844 type: symbolRecord.keyword, 1845 name: symbolRecord.name, 1846 inputType, 1847 className, 1848 style, 1849 text, 1850 parent: parentRecord.name 1851 }); 1852 return true; 1853 } 1854 } 1855 break; 1848 1856 } 1849 1857 } … … 1853 1861 run: program => { 1854 1862 const command = program[program.pc]; 1855 const targetRecord = program.getSymbolRecord(program, command.target); 1856 targetRecord.value[targetRecord.index] = command.value; 1863 const targetRecord = program.getSymbolRecord(command.name); 1864 switch (command.type) { 1865 case 'audioclip': 1866 targetRecord.value[targetRecord.index] = command.value; 1867 break; 1868 default: 1869 const parentRecord = program.getSymbolRecord(command.parent); 1870 const container = document.getElementById(parentRecord.value[parentRecord.index].content); 1871 const element = document.createElement(command.type); 1872 element.id = "easycoder-" + targetRecord.name + "-" + targetRecord.index; 1873 targetRecord.value[targetRecord.index] = { 1874 type: 'constant', 1875 numeric: false, 1876 content: element.id 1877 }; 1878 container.appendChild(element); 1879 if (command.inputType) { 1880 element.setAttribute('type', command.inputType); 1881 } 1882 if (command.className) { 1883 element.className = command.className; 1884 } 1885 const styles = program.value.evaluate(program, command.style).content; 1886 for (const item of styles.split(';')) { 1887 const style = item.split(':'); 1888 element.style[style[0]] = style[1]; 1889 }; 1890 if (command.text) { 1891 element.textContent = program.value.evaluate(program, command.text).content; 1892 } 1893 break; 1894 } 1857 1895 return program[program.pc].pc + 1; 1858 1896 } … … 1906 1944 run: program => { 1907 1945 const command = program[program.pc]; 1908 const symbol = program.getSymbolRecord( program,command.symbol);1946 const symbol = program.getSymbolRecord(command.symbol); 1909 1947 const target = document.getElementById(symbol.value[symbol.index].content); 1910 1948 target.style.visibility = 'hidden'; … … 2004 2042 // Add the action 2005 2043 compiler.compileOne(); 2044 // Add a 'stop' 2045 compiler.addCommand({ 2046 domain: 'basic', 2047 keyword: 'stop', 2048 lino, 2049 next: 0 2050 }); 2006 2051 // Fixup the 'goto' 2007 2052 compiler.getCommandAt(goto).goto = compiler.getPc(); … … 2015 2060 run: program => { 2016 2061 const command = program[program.pc]; 2017 const targetItem = program.getSymbolRecord( program,command.symbol);2062 const targetItem = program.getSymbolRecord(command.symbol); 2018 2063 switch (command.action) { 2019 2064 case 'change': … … 2098 2143 run: program => { 2099 2144 const command = program[program.pc]; 2100 const targetRecord = program.getSymbolRecord( program,command.target);2145 const targetRecord = program.getSymbolRecord(command.target); 2101 2146 const url = program.value.evaluate(program, targetRecord.value[targetRecord.index]).content; 2102 2147 new Audio(url).play(); … … 2109 2154 compile: compiler => { 2110 2155 const item = compiler.compileVariable('browser', 'popup'); 2156 return true; 2157 }, 2158 2159 run: program => { 2160 return program[program.pc].pc + 1; 2161 } 2162 }, 2163 2164 PRE: { 2165 2166 compile: compiler => { 2167 const item = compiler.compileVariable('browser', 'pre', false, 'dom'); 2111 2168 return true; 2112 2169 }, … … 2140 2197 run: program => { 2141 2198 const command = program[program.pc]; 2142 const symbol = program.getSymbolRecord( program,command.symbol);2199 const symbol = program.getSymbolRecord(command.symbol); 2143 2200 const target = document.getElementById(symbol.value[symbol.index].content); 2144 2201 target.style.display = 'none'; … … 2323 2380 switch (command.type) { 2324 2381 case 'setContentVar': 2325 const sourceVar = program.getSymbolRecord( program,command.source);2326 targetVar = program.getSymbolRecord( program,command.target);2382 const sourceVar = program.getSymbolRecord(command.source); 2383 targetVar = program.getSymbolRecord(command.target); 2327 2384 const source = document.getElementById(sourceVar.value[sourceVar.index].content); 2328 2385 target = document.getElementById(targetVar.value[targetVar.index].content); … … 2335 2392 value = '' + value; 2336 2393 } 2337 targetVar = program.getSymbolRecord( program,command.target);2394 targetVar = program.getSymbolRecord(command.target); 2338 2395 cssId = targetVar.value[targetVar.index].content; 2339 2396 target = document.getElementById(cssId); … … 2341 2398 break; 2342 2399 case 'setText': 2343 symbol = program.getSymbolRecord( program,command.symbolName);2400 symbol = program.getSymbolRecord(command.symbolName); 2344 2401 target = document.getElementById(symbol.value[symbol.index].content); 2345 2402 value = program.value.evaluate(program, command.value).content; … … 2356 2413 break; 2357 2414 case 'setAttribute': 2358 symbol = program.getSymbolRecord( program,command.symbolName);2415 symbol = program.getSymbolRecord(command.symbolName); 2359 2416 var attributeValue; 2360 2417 switch (command.attributeValue.type) { … … 2363 2420 break; 2364 2421 case 'symbol': 2365 const symbol = program.getSymbolRecord( program,command.attributeValue.name);2422 const symbol = program.getSymbolRecord(command.attributeValue.name); 2366 2423 attributeValue = symbol.value[symbol.index].content; 2367 2424 break; … … 2372 2429 break; 2373 2430 case 'setStyle': 2374 symbol = program.getSymbolRecord( program,command.symbolName);2431 symbol = program.getSymbolRecord(command.symbolName); 2375 2432 const styleValue = program.value.evaluate(program, command.styleValue); 2376 // switch (command.styleValue.type) {2377 // case 'constant':2378 // styleValue = command.styleValue.content;2379 // break;2380 // case 'symbol':2381 // const symbol = program.getSymbolRecord(program, command.styleValue.name);2382 // styleValue = symbol.value[symbol.index].content;2383 // break;2384 // case 'color':2385 // switch (command.styleValue.value.type) {2386 // case 'constant':2387 // styleValue = command.styleValue.value.content;2388 // break;2389 // case 'symbol':2390 // const symbol = program.getSymbolRecord(program, command.styleValue.value.name);2391 // styleValue = symbol.value[symbol.index].content;2392 // break;2393 // }2394 // let hex = styleValue.toString(16);2395 // while (hex.length < 6) {2396 // hex = '00' + hex;2397 // }2398 // styleValue = '#' + hex;2399 // break;2400 // }2401 2433 if (!symbol.value[symbol.index]) { 2402 2434 program.error.runtimeError('Variable \'' + symbol.name + '\' has not been assigned.'); … … 2438 2470 run: program => { 2439 2471 const command = program[program.pc]; 2440 const symbol = program.getSymbolRecord( program,command.symbol);2472 const symbol = program.getSymbolRecord(command.symbol); 2441 2473 const target = document.getElementById(symbol.value[symbol.index].content); 2442 2474 switch (symbol.type) { … … 2580 2612 case 'popup': 2581 2613 return EasyCoder_Browser.Popup; 2614 case 'pre': 2615 return EasyCoder_Browser.PRE; 2582 2616 case 'remove': 2583 2617 return EasyCoder_Browser.Remove; … … 2671 2705 domain: 'browser', 2672 2706 type: 'contentOf', 2673 pc: symbol.pc2707 symbol: symbol.name 2674 2708 }; 2675 2709 } … … 2703 2737 switch (value.type) { 2704 2738 case 'symbol': 2705 symbolRecord = program.getSymbolRecord( program,value.name);2739 symbolRecord = program.getSymbolRecord(value.name); 2706 2740 element = symbolRecord.value[symbolRecord.index].content; 2707 2741 switch (symbolRecord.keyword) { … … 2720 2754 case 'property': 2721 2755 const property = program.value.evaluate(program, value.property).content; 2722 symbolRecord = program.getSymbolRecord( program,value.symbol);2756 symbolRecord = program.getSymbolRecord(value.symbol); 2723 2757 content = program.value.evaluate(program, symbolRecord.value[symbolRecord.index]).content; 2724 2758 content = JSON.parse(content); … … 2749 2783 }; 2750 2784 case 'contentOf': 2751 // Fetch the current value from the DOM. 2785 symbolRecord = program.getSymbolRecord(value.symbol); 2786 element = symbolRecord.value[symbolRecord.index].content; 2787 target = document.getElementById(element); 2788 return { 2789 type: 'constant', 2790 numeric: false, 2791 content: target.textContent 2792 }; 2752 2793 break; 2753 2794 case 'widthOf': 2754 symbolRecord = program.getSymbolRecord( program,value.symbol);2795 symbolRecord = program.getSymbolRecord(value.symbol); 2755 2796 element = symbolRecord.value[symbolRecord.index].content; 2756 2797 target = document.getElementById(element); … … 2761 2802 }; 2762 2803 case 'heightOf': 2763 symbolRecord = program.getSymbolRecord( program,value.symbol);2804 symbolRecord = program.getSymbolRecord(value.symbol); 2764 2805 element = symbolRecord.value[symbolRecord.index].content; 2765 2806 target = document.getElementById(element); … … 2817 2858 case 'get': 2818 2859 compiler.next(); 2860 if (compiler.tokenIs('item')) { 2861 compiler.next(); 2862 const item = compiler.getValue(); 2863 if (compiler.tokenIs('of')) { 2864 compiler.next(); 2865 if (compiler.isSymbol()) { 2866 const source = compiler.getToken(); 2867 compiler.next(); 2868 if (compiler.tokenIs("as")) { 2869 compiler.next(); 2870 if (compiler.isSymbol()) { 2871 const targetRecord = compiler.getSymbolRecord(); 2872 if (targetRecord.keyword === 'variable') { 2873 compiler.next(); 2874 compiler.addCommand({ 2875 domain: 'json', 2876 keyword: 'json', 2877 lino, 2878 request: 'getItem', 2879 target: targetRecord.name, 2880 item, 2881 source 2882 }); 2883 return true; 2884 } 2885 } 2886 } 2887 } 2888 } 2889 compiler.error.expectedError('of', compiler.getToken()); 2890 } else if (compiler.tokenIs('element')) { 2891 compiler.next(); 2892 const element = compiler.getValue(); 2893 if (compiler.tokenIs('of')) { 2894 compiler.next(); 2895 if (compiler.isSymbol()) { 2896 const source = compiler.getToken(); 2897 compiler.next(); 2898 if (compiler.tokenIs("as")) { 2899 compiler.next(); 2900 if (compiler.isSymbol()) { 2901 const targetRecord = compiler.getSymbolRecord(); 2902 if (targetRecord.keyword === 'variable') { 2903 compiler.next(); 2904 compiler.addCommand({ 2905 domain: 'json', 2906 keyword: 'json', 2907 lino, 2908 request: 'getElement', 2909 target: targetRecord.name, 2910 element, 2911 source 2912 }); 2913 return true; 2914 } 2915 } 2916 } 2917 } 2918 } 2919 compiler.error.expectedError('of', compiler.getToken()); 2920 } 2819 2921 if (compiler.isSymbol()) { 2820 2922 const targetRecord = compiler.getSymbolRecord(); … … 2833 2935 }); 2834 2936 return true; 2835 } else if (compiler.tokenIs('as')) {2836 compiler.next();2837 if (compiler.tokenIs('item')) {2838 compiler.next();2839 const item = compiler.getValue();2840 if (compiler.tokenIs('of')) {2841 compiler.next();2842 if (compiler.isSymbol()) {2843 const source = compiler.getToken();2844 compiler.next();2845 compiler.addCommand({2846 domain: 'json',2847 keyword: 'json',2848 lino,2849 request: 'getItem',2850 target: targetRecord.name,2851 item,2852 source2853 });2854 }2855 }2856 return true;2857 }2858 2937 } 2859 2938 } … … 2910 2989 break; 2911 2990 } 2991 case 'shuffle': 2992 compiler.next(); 2993 if (compiler.isSymbol()) { 2994 const targetRecord = compiler.getSymbolRecord(); 2995 if (targetRecord.keyword === 'variable') { 2996 compiler.next(); 2997 compiler.addCommand({ 2998 domain: 'json', 2999 keyword: 'json', 3000 lino, 3001 request: 'shuffle', 3002 target: targetRecord.name 3003 }); 3004 return true; 3005 } 3006 } 3007 return false; 2912 3008 } 2913 3009 compiler.addWarning('Unrecognised syntax in \'json\''); … … 2926 3022 if (this.readyState === 4 && this.status === 200) { 2927 3023 const command = program.ajaxCommand; 2928 const targetRecord = program.getSymbolRecord( program,command.target);3024 const targetRecord = program.getSymbolRecord(command.target); 2929 3025 targetRecord.value[targetRecord.index] = { 2930 3026 type: 'constant', … … 2940 3036 return 0; 2941 3037 case 'getItem': 2942 sourceRecord = program.getSymbolRecord( program,command.source);2943 const data = JSON.parse(sourceRecord.value[sourceRecord.index].content);2944 const item = data[command.item.content];2945 targetRecord = program.getSymbolRecord( program,command.target);3038 sourceRecord = program.getSymbolRecord(command.source); 3039 const itemData = JSON.parse(sourceRecord.value[sourceRecord.index].content); 3040 const itemContent = itemData[program.getValue(command.item)]; 3041 targetRecord = program.getSymbolRecord(command.target); 2946 3042 targetRecord.value[targetRecord.index] = { 2947 3043 type: 'constant', 2948 3044 numeric: false, 2949 content: item 3045 content: typeof itemContent === "object" ? JSON.stringify(itemContent) : itemContent 3046 }; 3047 break; 3048 case 'getElement': 3049 sourceRecord = program.getSymbolRecord(command.source); 3050 const elementData = JSON.parse(sourceRecord.value[sourceRecord.index].content); 3051 const elementContent = elementData[program.getValue(command.element)]; 3052 targetRecord = program.getSymbolRecord(command.target); 3053 targetRecord.value[targetRecord.index] = { 3054 type: 'constant', 3055 numeric: false, 3056 content: typeof elementContent === "object" ? JSON.stringify(elementContent) : elementContent 2950 3057 }; 2951 3058 break; 2952 3059 case 'setList': 2953 3060 // we assume the source to be a JSON array 2954 sourceRecord = program.getSymbolRecord( program,command.source);2955 targetRecord = program.getSymbolRecord( program,command.target);3061 sourceRecord = program.getSymbolRecord(command.source); 3062 targetRecord = program.getSymbolRecord(command.target); 2956 3063 const target = document.getElementById(targetRecord.value[targetRecord.index].content); 2957 3064 target.options.length = 0; … … 2967 3074 break; 2968 3075 case 'encoding': 2969 program.encoding = program. value.evaluate(program, command.encoding).content;3076 program.encoding = program.getValue(command.encoding); 2970 3077 break; 3078 case 'shuffle': 3079 targetRecord = program.getSymbolRecord(command.target); 3080 var a = JSON.parse(program.getValue(targetRecord.value[targetRecord.index])); 3081 for (let i = a.length - 1; i > 0; i--) { 3082 const j = Math.floor(Math.random() * (i + 1)); 3083 [a[i], a[j]] = [a[j], a[i]]; 3084 } 3085 targetRecord.value[targetRecord.index] = { 3086 type: 'constant', 3087 numeric: false, 3088 content: JSON.stringify(a) 3089 }; 2971 3090 } 2972 3091 return command.pc + 1; … … 3053 3172 program.error.noSuchElementError(cssId); 3054 3173 } 3055 const target = program.getSymbolRecord( program,command.symbol);3174 const target = program.getSymbolRecord(command.symbol); 3056 3175 target.value[target.index] = { 3057 3176 type: 'constant', … … 3200 3319 const ns = "http://www.w3.org/2000/svg"; 3201 3320 const command = program[program.pc]; 3202 var parentRecord = program.getSymbolRecord( program,command.parent);3321 var parentRecord = program.getSymbolRecord(command.parent); 3203 3322 var group; 3204 const symbolRecord = program.getSymbolRecord( program,command.name);3323 const symbolRecord = program.getSymbolRecord(command.name); 3205 3324 if (command.type === 'group') { 3206 3325 symbolRecord.parent = command.parent; … … 3221 3340 // Find the real parent 3222 3341 while (parentRecord.keyword === 'group') { 3223 parentRecord = program.getSymbolRecord(p rogram, parentRecord.parent);3342 parentRecord = program.getSymbolRecord(parentRecord.parent); 3224 3343 } 3225 3344 } … … 3339 3458 const newX = program.value.evaluate(program, command.x).content; 3340 3459 const newY = program.value.evaluate(program, command.y).content; 3341 const symbolRecord = program.getSymbolRecord( program,command.name);3460 const symbolRecord = program.getSymbolRecord(command.name); 3342 3461 switch (symbolRecord.keyword) { 3343 3462 case 'group': 3344 3463 for (const item of symbolRecord.value[symbolRecord.index].content) { 3345 const itemRecord = program.getSymbolRecord( program,item.name);3464 const itemRecord = program.getSymbolRecord(item.name); 3346 3465 const value = itemRecord.value[item.index]; 3347 3466 const element = document.getElementById(value.content); … … 3379 3498 const symRec = symbolRecord.value[symbolRecord.index]; 3380 3499 if (symRec.groupName) { 3381 const parentRecord = program.getSymbolRecord( program,symRec.groupName);3500 const parentRecord = program.getSymbolRecord(symRec.groupName); 3382 3501 px = parentRecord.x; 3383 3502 py = parentRecord.y; … … 3455 3574 run: program => { 3456 3575 const command = program[program.pc]; 3457 const targetItem = program.getSymbolRecord( program,command.symbol);3576 const targetItem = program.getSymbolRecord(command.symbol); 3458 3577 switch (command.action) { 3459 3578 case 'click': … … 3463 3582 if (groupValue.content) { 3464 3583 for (const value of groupValue.content) { 3465 const contentItem = program.getSymbolRecord( program,value.name);3584 const contentItem = program.getSymbolRecord(value.name); 3466 3585 const contentValue = contentItem.value[value.index]; 3467 3586 if (contentValue.content) { … … 3480 3599 const group = targetItem.value[targetItem.index]; 3481 3600 for (const gc of group.content) { 3482 const gi = program.getSymbolRecord( program,gc.name);3601 const gi = program.getSymbolRecord(gc.name); 3483 3602 gi.index = gc.index; 3484 3603 const groupItem = gi.value[gi.index]; … … 3570 3689 switch (command.type) { 3571 3690 case 'setText': 3572 symbol = program.getSymbolRecord( program,command.symbolName);3691 symbol = program.getSymbolRecord(command.symbolName); 3573 3692 target = document.getElementById(symbol.value[symbol.index].content); 3574 3693 value = program.value.evaluate(program, command.value).content; … … 3681 3800 switch (value.type) { 3682 3801 case 'text': 3683 const symbolRecord = program.getSymbolRecord( program,value.name);3802 const symbolRecord = program.getSymbolRecord(value.name); 3684 3803 // console.log('symbolRecord: ' + JSON.stringify(symbolRecord.value[symbolRecord.index], null, 2)); 3685 3804 const element = document.getElementById(symbolRecord.value[symbolRecord.index].content); … … 3770 3889 }, 3771 3890 3891 nextToken: () => { 3892 EasyCoder_Compiler.next(); 3893 return EasyCoder_Compiler.getToken(); 3894 }, 3895 3896 skip: token => { 3897 if (_this.index >= _this.tokens.length) { 3898 return null; 3899 } 3900 EasyCoder_Compiler.next(); 3901 if (EasyCoder_Compiler.tokenIs(token)) { 3902 EasyCoder_Compiler.next(); 3903 } 3904 }, 3905 3772 3906 prev: () => { 3773 3907 _this.index--; … … 3830 3964 getValue: () => { 3831 3965 return EasyCoder_Compiler.value.compile(EasyCoder_Compiler); 3966 }, 3967 3968 getCondition: () => { 3969 return EasyCoder_Compiler.condition.compile(EasyCoder_Compiler); 3970 }, 3971 3972 constant: content => { 3973 return EasyCoder_Compiler.value.constant(content); 3832 3974 }, 3833 3975 … … 3884 4026 // console.log('Try domain ' + domainName + ' for token ' + token); 3885 4027 const domain = EasyCoder_Compiler.domain[domainName]; 3886 const handler = domain.getHandler(token); 3887 if (handler) { 3888 if (handler.compile(EasyCoder_Compiler)) { 3889 return; 4028 if (domain) { 4029 const handler = domain.getHandler(token); 4030 if (handler) { 4031 if (handler.compile(EasyCoder_Compiler)) { 4032 return; 4033 } 3890 4034 } 3891 4035 } 3892 4036 EasyCoder_Compiler.rewind(); 3893 4037 } 4038 console.log('No handler found'); 3894 4039 EasyCoder_Compiler.error.dontUnderstandError(token, index); 3895 4040 }, … … 3975 4120 module.exports = EasyCoder_Condition; 3976 4121 },{}],9:[function(require,module,exports){ 4122 var _this = this; 4123 4124 const EasyCoder_Tokenise = require('./Tokenise'); 4125 const EasyCoder_Compiler = require('./Compile'); 4126 const EasyCoder_Run = require('./Run'); 4127 const EasyCoder_Value = require('./Value'); 4128 const EasyCoder_Condition = require('./Condition'); 4129 const EasyCoder_Compare = require('./Compare'); 4130 const EasyCoder_Basic = require('../domain/Basic'); 4131 const EasyCoder_Browser = require('../domain/Browser'); 4132 const EasyCoder_Json = require('../domain/Json'); 4133 const EasyCoder_Svg = require('../domain/Svg'); 4134 4135 const EasyCoder = { 4136 4137 domain: { 4138 basic: EasyCoder_Basic, 4139 browser: EasyCoder_Browser, 4140 json: EasyCoder_Json, 4141 svg: EasyCoder_Svg 4142 }, 4143 4144 compileError: { 4145 dontUnderstandError: name => { 4146 throw Error('I don\'t understand \'' + name + '\''); 4147 }, 4148 duplicateSymbolError: name => { 4149 throw Error('Symbol \'' + name + '\' is a duplicate'); 4150 }, 4151 inappropriateTypeError: name => { 4152 throw Error('Inappropriate type \'' + name + '\''); 4153 }, 4154 inappropriateVariableTypeError: name => { 4155 throw Error('Inappropriate variable type \'' + name + '\''); 4156 }, 4157 missingInputTypeError: () => { 4158 throw Error('Missing input type'); 4159 }, 4160 noSuchVariableError: name => { 4161 throw Error('No such variable: ' + name); 4162 }, 4163 notAnIntegerError: name => { 4164 throw Error('Value is not an integer: ' + name); 4165 }, 4166 undefinedValueError: name => { 4167 throw Error('Undefined value: ' + name); 4168 }, 4169 unknownTypeError: name => { 4170 throw Error('Unknown type: ' + name); 4171 }, 4172 unknownVariableError: name => { 4173 throw Error('Unknown variable: ' + name); 4174 }, 4175 unrecognisedValueError: name => { 4176 throw Error('I don\'t understand this value: ' + name); 4177 }, 4178 variableDoesNotHoldAValueError: name => { 4179 throw Error('Variable \'' + name + '\' does not hold a value'); 4180 }, 4181 expectedError: (expected, actual) => { 4182 throw Error('Expected \'' + expected + '\' but saw \'' + actual + '\''); 4183 } 4184 }, 4185 4186 runtimeError: { 4187 arrayIndexOutOfRangeError: name => { 4188 throw Error('Array index out of range for ' + name); 4189 }, 4190 cantDecodeValueError: () => { 4191 throw Error('Can\'t decode value'); 4192 }, 4193 dataTypeMismatchError: () => { 4194 throw Error('Data type mismatch'); 4195 }, 4196 nonNumericValueError: () => { 4197 throw Error('Non-numeric value'); 4198 }, 4199 noSuchElementError: name => { 4200 throw Error('No such element: ' + name); 4201 }, 4202 runtimeError: message => { 4203 throw Error(message); 4204 }, 4205 undefinedValueError: (name, pc) => { 4206 _this.errorPc = pc; 4207 throw Error('Undefined value: ' + name); 4208 }, 4209 variableDoesNotHoldAValueError: name => { 4210 throw Error('Variable \'' + name + '\' does not hold a value'); 4211 } 4212 }, 4213 4214 setupTracer: () => { 4215 const tracer = document.getElementById('easycoder-tracer'); 4216 if (tracer) { 4217 tracer.innerHTML = '<div><input id="easycoder-run-button" type="button" value="Run" />' + '<input id="easycoder-step-button" type="button" value="Step" />' + '<div id="easycoder-tracer-content" style="border:1px solid black;padding:4px";width:100%>' + '</div>'; 4218 tracer.style.display = 'none'; 4219 // } else { 4220 // console.log('No tracer element'); 4221 } 4222 }, 4223 4224 reportError: (source, err) => { 4225 const compiler = EasyCoder_Compiler; 4226 const program = compiler.getProgram(); 4227 const { tokens, scriptLines } = source; 4228 const lino = _this.compiling ? tokens[compiler.getIndex()].lino : program.pc.lino; 4229 var errString = ''; 4230 let start = lino - 5; 4231 start = start < 0 ? 0 : start; 4232 for (var n = start; n < lino; n++) { 4233 let nn = '' + n; 4234 while (nn.length < 4) { 4235 nn = ' ' + nn; 4236 } 4237 errString += nn + ' ' + scriptLines[n].line + '\n'; 4238 } 4239 errString += err.message + '\n'; 4240 const warnings = EasyCoder_Compiler.getWarnings(); 4241 if (warnings.length) { 4242 errString += 'Warnings:\n'; 4243 for (const warning of warnings) { 4244 errString += warning + '\n'; 4245 } 4246 } 4247 console.log(errString); 4248 alert(errString); 4249 }, 4250 4251 getSymbolRecord: name => { 4252 const target = _this.program[_this.program.symbols[name].pc]; 4253 if (target.alias) { 4254 return _this.program[_this.program.symbols[target.alias].pc]; 4255 } 4256 return target; 4257 }, 4258 4259 evaluate: value => { 4260 return EasyCoder_Value.evaluate(_this.program, value); 4261 }, 4262 4263 getValue: value => { 4264 return EasyCoder_Value.getValue(_this.program, value); 4265 }, 4266 4267 compileScript: (source, extension) => { 4268 EasyCoder.domain.ext = extension; 4269 const { tokens } = source; 4270 try { 4271 // console.log('Compile script: '); 4272 _this.compiling = true; 4273 const startCompile = Date.now(); 4274 const compiler = EasyCoder_Compiler; 4275 compiler.value = EasyCoder_Value; 4276 compiler.condition = EasyCoder_Condition; 4277 compiler.domain = EasyCoder.domain; 4278 compiler.error = EasyCoder.compileError; 4279 const program = EasyCoder_Compiler.compile(tokens); 4280 _this.program = program; 4281 const finishCompile = Date.now(); 4282 console.log('Compiled ' + tokens.length + ' tokens in ' + (finishCompile - startCompile) + 'ms'); 4283 // console.log('Program: ' + JSON.stringify(program, null, 2)); 4284 _this.compiling = false; 4285 4286 program.source = source; 4287 program.run = EasyCoder_Run; 4288 program.value = EasyCoder_Value; 4289 program.evaluate = EasyCoder.evaluate; 4290 program.getValue = EasyCoder.getValue; 4291 program.condition = EasyCoder_Condition; 4292 program.compare = EasyCoder_Compare; 4293 program.domain = EasyCoder.domain; 4294 program.getSymbolRecord = EasyCoder.getSymbolRecord; 4295 program.error = EasyCoder.runtimeError; 4296 program.reportError = EasyCoder.reportError; 4297 program.symbols = compiler.getSymbols(); 4298 program.encoding = 'none'; 4299 program.popups = []; 4300 program.stack = []; 4301 program.queue = [0]; 4302 EasyCoder.setupTracer(); 4303 console.log('Run the script'); 4304 program.run(program, 0); 4305 // console.log('Program: '+ JSON.stringify(program, null, 2)); 4306 } catch (err) { 4307 EasyCoder.reportError(source, err); 4308 } 4309 }, 4310 4311 start: (script, extension = null) => { 4312 // console.log('Tokenise script: '); 4313 try { 4314 const startTokenise = Date.now(); 4315 const source = EasyCoder_Tokenise.tokenise(script); 4316 const finishTokenise = Date.now(); 4317 console.log('Tokenised ' + source.scriptLines.length + ' lines in ' + (finishTokenise - startTokenise) + 'ms'); 4318 // console.log('Source: ' + JSON.stringify(source, null, 2)); 4319 EasyCoder.compileScript(source, extension); 4320 } catch (err) { 4321 console.log(err); 4322 } 4323 } 4324 }; 4325 4326 module.exports = EasyCoder; 4327 },{"../domain/Basic":2,"../domain/Browser":3,"../domain/Json":4,"../domain/Svg":5,"./Compare":6,"./Compile":7,"./Condition":8,"./Run":10,"./Tokenise":11,"./Value":12}],10:[function(require,module,exports){ 3977 4328 const EasyCoder_Run = (program, pc) => { 3978 4329 … … 4005 4356 program.pc = queue.shift(); 4006 4357 while (true) { 4007 // console.log('Run ' + program.pc + ' ' + program[program.pc].domain + ':' + program[program.pc].keyword);4008 4358 const domain = program[program.pc].domain; 4359 // console.log('Run ' + program.pc + ' ' + domain + ':' + program[program.pc].keyword); 4009 4360 const handler = program.domain[domain]; 4010 4361 program.pc = handler.run(program); … … 4027 4378 if (program.tracer) { 4028 4379 program.tracer.variables.forEach(function (name, index, array) { 4029 const symbol = program.getSymbolRecord( program,name);4380 const symbol = program.getSymbolRecord(name); 4030 4381 const value = symbol.value[symbol.index]; 4031 4382 if (value) { … … 4099 4450 4100 4451 module.exports = EasyCoder_Run; 4101 },{}],1 0:[function(require,module,exports){4452 },{}],11:[function(require,module,exports){ 4102 4453 const EasyCoder_Tokenise = { 4103 4454 … … 4219 4570 4220 4571 module.exports = EasyCoder_Tokenise; 4221 },{}],1 1:[function(require,module,exports){4572 },{}],12:[function(require,module,exports){ 4222 4573 const EasyCoder_Value = { 4223 4574 … … 4308 4659 return value; 4309 4660 case 'symbol': 4310 const symbol = program.getSymbolRecord( program,value.name);4661 const symbol = program.getSymbolRecord(value.name); 4311 4662 if (symbol.isValueHolder) { 4312 4663 const symbolValue = symbol.value[symbol.index]; … … 4331 4682 }, 4332 4683 4684 constant: content => { 4685 return { 4686 type: 'constant', 4687 numeric: 'false', 4688 content 4689 }; 4690 }, 4691 4333 4692 // runtime 4334 4693 4335 4694 evaluate: (program, value) => { 4695 if (!value) { 4696 return { 4697 type: 'constant', 4698 numeric: false, 4699 content: '' 4700 }; 4701 } 4336 4702 const result = EasyCoder_Value.doValue(program, value); 4337 4703 if (result) { … … 4339 4705 } 4340 4706 program.error.cantDecodeValueError(); 4707 }, 4708 4709 getValue: (program, value) => { 4710 return EasyCoder_Value.evaluate(program, value).content; 4341 4711 }, 4342 4712 -
easycoder/trunk/easycoder.php
r1885298 r1949051 4 4 * Plugin URI: https://easycoder.software 5 5 * Description: Control the appearance and behavior of your posts and pages by embedding simple English-like scripts, without the need to learn JavaScript. 6 * Version: 1. 4.06 * Version: 1.5.0 7 7 * Author: EasyCoder Software 8 8 */ … … 10 10 // The EasyCoder library 11 11 function easycoder_enqueue_script() { 12 wp_enqueue_script('easycoder_script', plugin_dir_url( __FILE__ ) . 'easycoder-min.js', array(), '1. 4.0');12 wp_enqueue_script('easycoder_script', plugin_dir_url( __FILE__ ) . 'easycoder-min.js', array(), '1.5.0'); 13 13 } 14 14 -
easycoder/trunk/readme.txt
r1885298 r1949051 45 45 == Changelog == 46 46 47 = 1.5.0 = 48 * Added sin, cos & tan trig functions; left and right substring operators; json shuffle. 49 47 50 = 1.4.0 = 48 51 * Added alias variables.
Note: See TracChangeset
for help on using the changeset viewer.