mirror of
https://github.com/GitbookIO/gitbook.git
synced 2026-09-20 17:43:24 +00:00
Remove exercises execution
This commit is contained in:
@@ -1,63 +0,0 @@
|
||||
define([
|
||||
"jQuery",
|
||||
"ace/ace",
|
||||
"ace/theme-tomorrow",
|
||||
"ace/mode-javascript",
|
||||
"utils/execute",
|
||||
"core/events",
|
||||
"core/state"
|
||||
], function($, _ace, _aceTheme, _aceMode, execute, events, state){
|
||||
|
||||
// Bind an exercise
|
||||
var prepareExercise = function($exercise) {
|
||||
var codeSolution = $exercise.find(".code-solution").text();
|
||||
var codeValidation = $exercise.find(".code-validation").text();
|
||||
var codeContext = $exercise.find(".code-context").text();
|
||||
|
||||
var editor = ace.edit($exercise.find(".editor").get(0));
|
||||
editor.setTheme("ace/theme/tomorrow");
|
||||
editor.getSession().setUseWorker(false);
|
||||
editor.getSession().setMode("ace/mode/javascript");
|
||||
|
||||
editor.commands.addCommand({
|
||||
name: "submit",
|
||||
bindKey: "Ctrl-Return|Cmd-Return",
|
||||
exec: function() {
|
||||
$exercise.find(".action-submit").click();
|
||||
}
|
||||
});
|
||||
|
||||
// Submit: test code
|
||||
$exercise.find(".action-submit").click(function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
events.trigger("exercise.submit", {type: "code"});
|
||||
|
||||
execute("javascript", editor.getValue(), codeValidation, codeContext, 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);
|
||||
});
|
||||
});
|
||||
|
||||
// Set solution
|
||||
$exercise.find(".action-solution").click(function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
editor.setValue(codeSolution);
|
||||
editor.gotoLine(0);
|
||||
});
|
||||
};
|
||||
|
||||
// Prepare all exercise
|
||||
var init = function() {
|
||||
state.$book.find("section.exercise").each(function() {
|
||||
prepareExercise($(this));
|
||||
});
|
||||
};
|
||||
|
||||
return {
|
||||
init: init,
|
||||
prepare: prepareExercise
|
||||
};
|
||||
});
|
||||
@@ -4,11 +4,10 @@ define([
|
||||
"core/events",
|
||||
"core/state",
|
||||
"core/progress",
|
||||
"core/exercise",
|
||||
"core/quiz",
|
||||
"core/loading",
|
||||
"core/search"
|
||||
], function($, URL, events, state, progress, exercises, quiz, loading, search) {
|
||||
], function($, URL, events, state, progress, quiz, loading, search) {
|
||||
var prev, next;
|
||||
|
||||
var usePushState = (typeof history.pushState !== "undefined");
|
||||
@@ -76,8 +75,7 @@ define([
|
||||
var preparePage = function() {
|
||||
var $pageWrapper = $(".book-body .page-wrapper");
|
||||
|
||||
// Bind exercises/quiz
|
||||
exercises.init();
|
||||
// Bind quiz
|
||||
quiz.init();
|
||||
|
||||
// Show progress
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
define([
|
||||
"jQuery",
|
||||
"utils/execute",
|
||||
"core/events",
|
||||
"core/state"
|
||||
], function($, execute, events, state){
|
||||
], function($, events, state){
|
||||
// Bind an exercise
|
||||
var prepareQuiz = function($quiz) {
|
||||
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
define(function() {
|
||||
return {
|
||||
id: "javascript",
|
||||
assertCode: "function assert(condition, message) { \nif (!condition) { \n throw message || \"Assertion failed\"; \n } \n }\n",
|
||||
REPL: JSREPL,
|
||||
sep: ";\n",
|
||||
};
|
||||
});
|
||||
@@ -48,6 +48,7 @@ define([
|
||||
|
||||
return {
|
||||
start: start,
|
||||
events: events
|
||||
events: events,
|
||||
state: state
|
||||
};
|
||||
});
|
||||
|
||||
@@ -1,97 +0,0 @@
|
||||
define([
|
||||
"execute/javascript"
|
||||
], function(javascript) {
|
||||
var LANGUAGES = {
|
||||
"javascript": javascript
|
||||
};
|
||||
|
||||
|
||||
var evalJS = function(lang, code, callback) {
|
||||
var ready = false;
|
||||
var finished = false;
|
||||
|
||||
var finish = function() {
|
||||
if(finished) {
|
||||
return console.error('Already finished');
|
||||
}
|
||||
finished = true;
|
||||
return callback.apply(null, arguments);
|
||||
};
|
||||
|
||||
var repl;
|
||||
|
||||
// Handles all our events
|
||||
var eventHandler = function(data, eventType) {
|
||||
console.log([eventType, data]);
|
||||
switch(eventType) {
|
||||
case 'progress':
|
||||
// Update UI loading bar
|
||||
break;
|
||||
case 'timeout':
|
||||
finish(new Error(data));
|
||||
break;
|
||||
case 'result':
|
||||
finish(null, {
|
||||
value: data,
|
||||
type: 'result'
|
||||
});
|
||||
break;
|
||||
case 'error':
|
||||
if(ready) {
|
||||
return finish(null, {
|
||||
value: data,
|
||||
type: 'error'
|
||||
});
|
||||
}
|
||||
return finish(new Error(data));
|
||||
break
|
||||
case 'ready':
|
||||
// We're good to get results and stuff back now
|
||||
ready = true;
|
||||
// Eval our code now that the runtime is ready
|
||||
repl.eval(code);
|
||||
break;
|
||||
default:
|
||||
console.log('Unhandled event =', eventType, 'data =', data);
|
||||
}
|
||||
};
|
||||
|
||||
repl = new lang.REPL({
|
||||
input: eventHandler,
|
||||
output: eventHandler,
|
||||
result: eventHandler,
|
||||
error: eventHandler,
|
||||
progress: eventHandler,
|
||||
timeout: {
|
||||
time: 30000,
|
||||
callback: eventHandler
|
||||
}
|
||||
});
|
||||
|
||||
repl.loadLanguage(lang.id, eventHandler);
|
||||
};
|
||||
|
||||
var execute = function(lang, solution, validation, context, callback) {
|
||||
// Language data
|
||||
var langd = LANGUAGES[lang];
|
||||
|
||||
// Check language is supported
|
||||
if (!langd) return callback(new Error("Language '"+lang+"' not available for execution"));
|
||||
|
||||
// Validate with validation code
|
||||
var code = [
|
||||
context,
|
||||
solution,
|
||||
langd.assertCode,
|
||||
validation,
|
||||
].join(langd.sep);
|
||||
evalJS(langd, code, function(err, res) {
|
||||
if(err) return callback(err);
|
||||
|
||||
if (res.type == "error") callback(new Error(res.value));
|
||||
else callback(null, res.value);
|
||||
});
|
||||
};
|
||||
|
||||
return execute;
|
||||
});
|
||||
Reference in New Issue
Block a user