From ef8cdd36436ef1bd1303886a101c8ee60c6f9721 Mon Sep 17 00:00:00 2001 From: ben Date: Tue, 18 Sep 2018 10:28:07 +0200 Subject: Initial public commit --- static/repl.js | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 static/repl.js (limited to 'static/repl.js') diff --git a/static/repl.js b/static/repl.js new file mode 100644 index 0000000..391e4ea --- /dev/null +++ b/static/repl.js @@ -0,0 +1,105 @@ +$(function () { + var repl = new CodeMirrorREPL('interactive', { + mode: "python", + theme: "solarized dark" + }), + compilableLines = [], + //finds lines starting with "print" + re = new RegExp("\\s*print"), + //finds import statements + importre = new RegExp("\\s*import"), + //finds multuline string constants + mls = new RegExp("'''"), + //finds defining statements + defre = new RegExp("def.*|class.*"), + //test for empty line. + emptyline = new RegExp("^\\s*$"), + //a regex to check if a line is an assignment + //this regex checks whether or not a line starts with + //an identifier followed with some whitspace and then an = and then some more white space. + //it also checks if the identifier is a tuple. + assignment = /^((\s*\(\s*(\s*((\s*((\s*[_a-zA-Z]\w*\s*)|(\s*\(\s*(\s*[_a-zA-Z]\w*\s*,)*\s*[_a-zA-Z]\w*\s*\)\s*))\s*)|(\s*\(\s*(\s*((\s*[_a-zA-Z]\w*\s*)|(\s*\(\s*(\s*[_a-zA-Z]\w*\s*,)*\s*[_a-zA-Z]\w*\s*\)\s*))\s*,)*\s*((\s*[_a-zA-Z]\w*\s*)|(\s*\(\s*(\s*[_a-zA-Z]\w*\s*,)*\s*[_a-zA-Z]\w*\s*\)\s*))\s*\)\s*))\s*,)*\s*((\s*((\s*[_a-zA-Z]\w*\s*)|(\s*\(\s*(\s*[_a-zA-Z]\w*\s*,)*\s*[_a-zA-Z]\w*\s*\)\s*))\s*)|(\s*\(\s*(\s*((\s*[_a-zA-Z]\w*\s*)|(\s*\(\s*(\s*[_a-zA-Z]\w*\s*,)*\s*[_a-zA-Z]\w*\s*\)\s*))\s*,)*\s*((\s*[_a-zA-Z]\w*\s*)|(\s*\(\s*(\s*[_a-zA-Z]\w*\s*,)*\s*[_a-zA-Z]\w*\s*\)\s*))\s*\)\s*))\s*\)\s*)|(\s*\s*(\s*((\s*((\s*[_a-zA-Z]\w*\s*)|(\s*\(\s*(\s*[_a-zA-Z]\w*\s*,)*\s*[_a-zA-Z]\w*\s*\)\s*))\s*)|(\s*\(\s*(\s*((\s*[_a-zA-Z]\w*\s*)|(\s*\(\s*(\s*[_a-zA-Z]\w*\s*,)*\s*[_a-zA-Z]\w*\s*\)\s*))\s*,)*\s*((\s*[_a-zA-Z]\w*\s*)|(\s*\(\s*(\s*[_a-zA-Z]\w*\s*,)*\s*[_a-zA-Z]\w*\s*\)\s*))\s*\)\s*))\s*,)*\s*((\s*((\s*[_a-zA-Z]\w*\s*)|(\s*\(\s*(\s*[_a-zA-Z]\w*\s*,)*\s*[_a-zA-Z]\w*\s*\)\s*))\s*)|(\s*\(\s*(\s*((\s*[_a-zA-Z]\w*\s*)|(\s*\(\s*(\s*[_a-zA-Z]\w*\s*,)*\s*[_a-zA-Z]\w*\s*\)\s*))\s*,)*\s*((\s*[_a-zA-Z]\w*\s*)|(\s*\(\s*(\s*[_a-zA-Z]\w*\s*,)*\s*[_a-zA-Z]\w*\s*\)\s*))\s*\)\s*))\s*\s*))=/; + + repl.print("Connection as "+ localStorage.getItem("user") +" granted"); + repl.print("Python 2.6.7 (default, " + new Date("2017-04-13T18:24:12") + ")"); + + repl.isBalanced = function (code) { + var lines = code.split('\n'), + depth = 0, + mlsopened = false, + l; + + for (l = 0; l < lines.length; l = l + 1) { + if (lines[l].match(/'''/) !== null && lines[l].match(/'''/).length === 1) { + mlsopened = !mlsopened; + } + if (!mlsopened && lines[l].substr(lines[l].length - 1) === ":") { + depth = depth + 1; + } + if (!mlsopened && lines[l] === "" && depth > 0) { + depth = 0 ; + } + } + return depth === 0 && !mlsopened; + }; + + //Loop + repl.eval = function (code) { + Sk.configure({ + output: function(str) { + //strip out line-feeds + if (str.replace(/\n/g, "") !== "") { + repl.print(str); + } + }, + read: function (x) { + if (Sk.builtinFiles === undefined || Sk.builtinFiles["files"][x] === undefined) { + throw "File not found: '" + x + "'"; + } + return Sk.builtinFiles["files"][x]; + }, + retainglobals: true + }); + + //split lines on linefeed + var lines = code.split('\n'), index = -1, line = 0; + + //it's a onliner + if (lines.length === 1) { + //if it's a statement that should be printed (not containing an = or def or class or an empty line) + if (!assignment.test(lines[0]) && !defre.test(lines[0]) && !importre.test(lines[0]) && lines[0].length > 0) { + //if it doesn't contain print make sure it doesn't print None + if (!re.test(lines[0])) { + //remove the statement + //evaluate it if nessecary + lines.push("evaluationresult = " + lines.pop()); + //print the result if not None + lines.push("if not evaluationresult == None: print repr(evaluationresult)"); + } + } + } + + try { + //Evaluate + if (!lines || /^\s*$/.test(lines)) { + return; + } + else { + Sk.importMainWithBody("repl", false, lines.join('\n')); + } + } catch (err) { + repl.print(err); + + //find the line number + if ((index = err.toString().indexOf("on line")) !== -1) { + index = parseInt(err.toString().substr(index + 8), 10); + } + + //print the accumulated code with a ">" before the broken line. + //Don't add the last statement to the accumulated code + lines.forEach(function (str) { + repl.print(++line + (index === line ? ">" : " ") + ": " + str); + }); + } + }; +}); -- cgit v1.2.3