-
Notifications
You must be signed in to change notification settings - Fork 0
/
state.js
117 lines (100 loc) · 4.81 KB
/
state.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
Numbas.queueScript('base',[],function() {});
Numbas.queueScript('go',['jme','localisation','jme-variables','marking'],function() {
function show_state(state) {
return JSON.stringify(state);
}
var marking = Numbas.marking;
function go(studentAnswer, notes, settings) {
console.clear();
var output = document.querySelector('#output tbody');
var summary = document.getElementById('summary');
Array.prototype.forEach.call(document.querySelectorAll('.clear'),function(b) {
b.innerHTML = '';
});
var script = new marking.MarkingScript(notes);
var result = script.evaluate(Numbas.jme.builtinScope,studentAnswer,settings);
for(var x in result.states) {
var tr = document.createElement('tr');
var state = '<ul>'+result.states[x].map(s => '<li>'+JSON.stringify(s)+'</li>').join(' ')+'</ul>';
var value = result.values[x];
var display_value = value ? Numbas.jme.display.treeToJME({tok:value}) : '-';
tr.innerHTML = '<td class="description">'+(script.notes[x].description||x)+'</td><td>'+state+'</td>'+'<td>'+display_value+'</td>';
output.appendChild(tr);
}
var feedback = marking.finalise_state(result.states['mark'] || []);
summary.querySelector('#valid').innerHTML = feedback.valid ? 'Yes' : 'No';
summary.querySelector('#credit').innerHTML = feedback.credit;
summary.querySelector('#messages').innerHTML = feedback.messages.length ? feedback.messages.map(x => '<li>'+x+'</li>').join(' ') : 'none';
summary.querySelector('#warnings').innerHTML = feedback.warnings.length ? feedback.warnings.map(x => '<li>'+x+'</li>').join(' ') : 'none';
return result.states;
}
var algorithm_input = document.getElementById('algorithm');
var answer_input = document.getElementById('answer');
var settings_input = document.getElementById('settings');
var originals = {
answer: answer_input.value,
algorithm: algorithm_input.value,
settings: settings_input.value
};
if(localStorage.algorithm) {
algorithm_input.value = localStorage.algorithm;
}
if(localStorage.answer) {
answer_input.value = localStorage.answer;
}
if(localStorage.settings) {
settings_input.value = localStorage.settings;
}
function update() {
localStorage.answer = answer_input.value;
localStorage.algorithm = algorithm_input.value;
localStorage.settings = settings_input.value;
var error_box = document.getElementById('error');
error_box.innerHTML = '';
error_box.classList.remove('has-error');
try {
go(answer_input.value, algorithm_input.value, settings_input.value);
} catch(e) {
console.log(e.stack);
error_box.classList.add('has-error');
error_box.innerHTML = e.message;
}
}
algorithm_input.addEventListener('input',update);
answer_input.addEventListener('input',update);
settings_input.addEventListener('input',update);
update();
document.getElementById('reset').addEventListener('click',function() {
if(confirm("Reset the answer, settings, and marking algorithm fields?")) {
answer_input.value = originals.answer;
algorithm_input.value = originals.algorithm;
settings_input.value = originals.settings;
update();
}
});
var currentAlgo = null;
var currentAlgoName = null;
for(var name in algorithms) {
var li = document.createElement('li');
var id = 'algorithm-option-'+name;
li.innerHTML = '<label for="'+id+'">'+name+'</label> <input id="'+id+'" type="radio" name="algorithm" value="'+name+'">';
document.querySelector('#algorithm-picker ul#algorithms').appendChild(li);
}
document.getElementById('algorithms').addEventListener('change',function() {
var name = document.querySelector('input[name="algorithm"]:checked').value;
var algo = algorithms[name];
var diff = currentAlgo===null || (algorithm_input.value != currentAlgo.script || answer_input.value != currentAlgo.student_answer || settings_input.value != currentAlgo.settings);
if(diff) {
if(!confirm('Change to the '+name+' algorithm, and lose your changes?')) {
document.querySelector('input[name="algorithm"][value="'+currentAlgoName+'"]').checked = true;
return;
}
}
currentAlgo = algo;
currentAlgoName = name;
algorithm_input.value = algo.script;
answer_input.value = algo.student_answer;
settings_input.value = algo.settings;
update();
});
});