-
Notifications
You must be signed in to change notification settings - Fork 24
/
exercise.js
121 lines (106 loc) · 3.44 KB
/
exercise.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
(function() {
'use strict';
var CodeMirror = require("codemirror");
require("codemirror/addon/comment/comment.js");
require("./codemirror-ql-mode.js");
var debounce = require('debounce');
var createDocsRepl = require('./components/docs-repl.js');
var classie = require('desandro-classie');
var docsRepl = document.getElementsByClassName("docs-repl");
var exerciseAnswer = htmlDecode(document.getElementsByClassName("exercise-answer")[0].innerHTML);
var exerciseRegex = new RegExp(htmlDecode(document.getElementsByClassName("exercise-regex")[0].innerHTML).trim());
var answer = null;
var firstRun = true;
[].forEach.call(docsRepl, function(elm){
var notifTimeout;
var exercise = createDocsRepl({
elm: elm,
onload: function() {
exercise.query(exerciseAnswer);
},
onSuccessData: function(data){
if(answer === null) {
if( data.query === exerciseAnswer ) {
answer = processAnswer(escapeHTML(data.resultText));
exercise.updateMap();
}
return;
}
// (sample query code)
if(firstRun) {
firstRun = false;
classie.add(editorCover, "hide");
classie.remove(runBtn, "disabled");
classie.remove(resetBtn, "disabled");
// firstRun should not produce errors
return;
}
if (data.resultType) {
var result = processAnswer(escapeHTML(data.resultText));
if(isCorrectAnswer(result)){
var winBar = document.getElementsByClassName("exercise-action-bar-inner winner-bar")[0];
classie.add(winBar, "show");
} else {
var notif = document.getElementsByClassName("exercise-fail-msg")[0];
classie.add(notif, "show");
if(notifTimeout) window.clearTimeout(notifTimeout);
notifTimeout = window.setTimeout(function(){
classie.remove(notif, "show");
}, 4500);
}
}
},
opts: {
lineNumbers: true,
theme: "base16-light",
mode: "ql+mustache"
}
});
var initValue = exercise.getValue();
var editorCover = elm.getElementsByClassName('editor-cover')[0];
var runBtn = elm.getElementsByClassName('exercise-action-run')[0];
var resetBtn = elm.getElementsByClassName('exercise-action-reset')[0];
classie.add(runBtn, "disabled");
classie.add(resetBtn, "disabled");
runBtn.onclick = function(){
if(classie.has(runBtn, 'disabled')) return;
exercise.updateMap();
};
resetBtn.onclick = function(){
if(classie.has(runBtn, 'disabled')) return;
exercise.setValue(initValue);
};
function isCorrectAnswer(result) {
if(result === answer) {
if (exerciseRegex) {
return exerciseRegex.test(exercise.getValue());
}
return true;
}
return false;
}
});
})();
function processAnswer(str){
//remove osm_base timestamp
str = str.replace(/^.*osm_base.*$/mg, "");
//remove newlines
str = str.replace(/(\r\n|\n|\r)/gm,"");
return str;
}
var entityMap = {
"&": "&",
"<": "<",
">": ">",
"'": '''
};
function escapeHTML(string) {
return String(string).replace(/[&<>']/g, function (s) {
return entityMap[s];
});
}
function htmlDecode(input){
var e = document.createElement('div');
e.innerHTML = input;
return e.childNodes.length === 0 ? "" : e.childNodes[0].nodeValue;
}