summaryrefslogtreecommitdiffstats
path: root/theme/javascript
diff options
context:
space:
mode:
Diffstat (limited to 'theme/javascript')
-rw-r--r--theme/javascript/core/exercise.js2
-rw-r--r--theme/javascript/execute/javascript.js7
-rw-r--r--theme/javascript/utils/execute.js29
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));