summaryrefslogtreecommitdiffstats
path: root/static/repl.js
diff options
context:
space:
mode:
Diffstat (limited to 'static/repl.js')
-rw-r--r--static/repl.js105
1 files changed, 105 insertions, 0 deletions
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);
+ });
+ }
+ };
+});