diff options
Diffstat (limited to 'theme/javascript')
-rw-r--r-- | theme/javascript/core/exercise.js | 2 | ||||
-rw-r--r-- | theme/javascript/execute/javascript.js | 7 | ||||
-rw-r--r-- | theme/javascript/utils/execute.js | 29 |
3 files changed, 26 insertions, 12 deletions
diff --git a/theme/javascript/core/exercise.js b/theme/javascript/core/exercise.js index 4163730..db278b8 100644 --- a/theme/javascript/core/exercise.js +++ b/theme/javascript/core/exercise.js @@ -20,7 +20,7 @@ define([ analytic.track("exercise.submit"); - execute(editor.getValue(), codeValidation, function(err, result) { + execute("javascript", editor.getValue(), codeValidation, function(err, result) { $exercise.toggleClass("return-error", err != null); $exercise.toggleClass("return-success", err == null); if (err) $exercise.find(".alert-danger").text(err.message || err); diff --git a/theme/javascript/execute/javascript.js b/theme/javascript/execute/javascript.js new file mode 100644 index 0000000..d967038 --- /dev/null +++ b/theme/javascript/execute/javascript.js @@ -0,0 +1,7 @@ +define(function() { + return { + id: "javascript", + assertCode: "function assert(condition, message) { \nif (!condition) { \n throw message || \"Assertion failed\"; \n } \n }\n", + REPL: JSREPL + }; +});
\ No newline at end of file diff --git a/theme/javascript/utils/execute.js b/theme/javascript/utils/execute.js index 61354b8..76033f6 100644 --- a/theme/javascript/utils/execute.js +++ b/theme/javascript/utils/execute.js @@ -1,5 +1,12 @@ -define(function(){ - var evalJS = function(code, callback) { +define([ + "execute/javascript" +], function(javascript) { + var LANGUAGES = { + "javascript": javascript + }; + + + var evalJS = function(lang, code, callback) { var ready = false; var finished = false; @@ -11,7 +18,7 @@ define(function(){ return callback.apply(null, arguments); }; - var jsrepl; + var repl; // Handles all our events var eventHandler = function(data, eventType) { @@ -42,14 +49,14 @@ define(function(){ // We're good to get results and stuff back now ready = true; // Eval our code now that the runtime is ready - jsrepl.eval(code); + repl.eval(code); break; default: console.log('Unhandled event =', eventType, 'data =', data); } }; - jsrepl = new JSREPL({ + repl = new lang.REPL({ input: eventHandler, output: eventHandler, result: eventHandler, @@ -61,16 +68,16 @@ define(function(){ } }); - jsrepl.loadLanguage('javascript', eventHandler); + repl.loadLanguage(lang.id, eventHandler); }; + var execute = function(lang, solution, validation, callback) { + // Check language is supported + if (!LANGUAGES[lang]) return callback(new Error("Language '"+lang+"' not available for execution")); - var ass = "function assert(condition, message) { \nif (!condition) { \n throw message || \"Assertion failed\"; \n } \n }\n"; - - var execute = function(solution, validation, callback) { // Validate with validation code - var code = [solution, ass, validation].join(";\n"); - evalJS(code, function(err, res) { + var code = [solution, LANGUAGES[lang].assertCode, validation].join(";\n"); + evalJS(LANGUAGES[lang], code, function(err, res) { if(err) return callback(err); if (res.type == "error") callback(new Error(res.value)); |