@pie-element/math-templated 5.3.4-next.3 → 6.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +0 -11
- package/configure/CHANGELOG.md +0 -11
- package/configure/lib/defaults.js +5 -6
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/design.js +451 -562
- package/configure/lib/design.js.map +1 -1
- package/configure/lib/index.js +129 -202
- package/configure/lib/index.js.map +1 -1
- package/configure/lib/markupUtils.js +18 -33
- package/configure/lib/markupUtils.js.map +1 -1
- package/configure/lib/response.js +342 -405
- package/configure/lib/response.js.map +1 -1
- package/configure/lib/utils.js +5 -5
- package/configure/lib/utils.js.map +1 -1
- package/configure/package.json +11 -8
- package/controller/CHANGELOG.md +0 -11
- package/controller/lib/defaults.js +2 -3
- package/controller/lib/defaults.js.map +1 -1
- package/controller/lib/index.js +151 -247
- package/controller/lib/index.js.map +1 -1
- package/controller/package.json +3 -3
- package/lib/index.js +58 -99
- package/lib/index.js.map +1 -1
- package/lib/main.js +601 -717
- package/lib/main.js.map +1 -1
- package/lib/print.js +39 -81
- package/lib/print.js.map +1 -1
- package/package.json +14 -15
- package/module/configure.js +0 -1
- package/module/controller.js +0 -4849
- package/module/demo.js +0 -67
- package/module/element.js +0 -1
- package/module/index.html +0 -21
- package/module/manifest.json +0 -26
- package/module/print-demo.js +0 -105
- package/module/print.html +0 -18
- package/module/print.js +0 -1
package/controller/lib/index.js
CHANGED
|
@@ -1,99 +1,50 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
-
|
|
7
4
|
Object.defineProperty(exports, "__esModule", {
|
|
8
5
|
value: true
|
|
9
6
|
});
|
|
10
7
|
exports.validate = exports.prepareVal = exports.outcome = exports.normalizeSession = exports.model = exports.getPartialScore = exports.getCorrectness = exports.createDefaultModel = exports.createCorrectResponseSession = void 0;
|
|
11
|
-
|
|
12
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
13
|
-
|
|
14
|
-
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
15
|
-
|
|
16
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
17
|
-
|
|
18
8
|
var _debug = _interopRequireDefault(require("debug"));
|
|
19
|
-
|
|
20
9
|
var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
|
|
21
|
-
|
|
22
10
|
var _translator = _interopRequireDefault(require("@pie-lib/translator"));
|
|
23
|
-
|
|
24
11
|
var mv = _interopRequireWildcard(require("@pie-framework/math-validation"));
|
|
25
|
-
|
|
26
12
|
var _defaults = _interopRequireDefault(require("./defaults"));
|
|
27
|
-
|
|
28
13
|
var _controllerUtils = require("@pie-lib/controller-utils");
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
var getFeedback = function getFeedback(value) {
|
|
48
|
-
return value ? 'correct' : 'incorrect';
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
var getContent = function getContent(html) {
|
|
52
|
-
return (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
var getIsAnswerCorrect = function getIsAnswerCorrect(correctResponse, answerItem) {
|
|
56
|
-
var answerCorrect = false;
|
|
57
|
-
|
|
58
|
-
var opts = _objectSpread({
|
|
59
|
-
mode: correctResponse.validation || _defaults["default"].validationDefault
|
|
60
|
-
}, correctResponse.validation === 'literal' && {
|
|
61
|
-
literal: {
|
|
62
|
-
allowTrailingZeros: correctResponse.allowTrailingZeros || false,
|
|
63
|
-
ignoreOrder: correctResponse.ignoreOrder || false
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
|
|
14
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
15
|
+
const {
|
|
16
|
+
translator
|
|
17
|
+
} = _translator.default;
|
|
18
|
+
const log = (0, _debug.default)('@pie-element:math-templated:controller');
|
|
19
|
+
const getFeedback = value => value ? 'correct' : 'incorrect';
|
|
20
|
+
const getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
|
|
21
|
+
const getIsAnswerCorrect = (correctResponse, answerItem) => {
|
|
22
|
+
let answerCorrect = false;
|
|
23
|
+
const opts = {
|
|
24
|
+
mode: correctResponse.validation || _defaults.default.validationDefault,
|
|
25
|
+
...(correctResponse.validation === 'literal' && {
|
|
26
|
+
literal: {
|
|
27
|
+
allowTrailingZeros: correctResponse.allowTrailingZeros || false,
|
|
28
|
+
ignoreOrder: correctResponse.ignoreOrder || false
|
|
29
|
+
}
|
|
30
|
+
})
|
|
31
|
+
};
|
|
67
32
|
if (!answerCorrect) {
|
|
68
|
-
|
|
69
|
-
|
|
33
|
+
const acceptedValues = [correctResponse.answer, ...Object.values(correctResponse.alternates || {})];
|
|
70
34
|
try {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
try {
|
|
75
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
76
|
-
var value = _step.value;
|
|
77
|
-
answerCorrect = mv.latexEqual(answerItem.value, value, opts);
|
|
78
|
-
if (answerCorrect) break;
|
|
79
|
-
}
|
|
80
|
-
} catch (err) {
|
|
81
|
-
_iterator.e(err);
|
|
82
|
-
} finally {
|
|
83
|
-
_iterator.f();
|
|
35
|
+
for (const value of acceptedValues) {
|
|
36
|
+
answerCorrect = mv.latexEqual(answerItem.value, value, opts);
|
|
37
|
+
if (answerCorrect) break;
|
|
84
38
|
}
|
|
85
39
|
} catch (e) {
|
|
86
40
|
log('Parse failure when evaluating math', e, correctResponse, answerItem);
|
|
87
41
|
answerCorrect = false;
|
|
88
42
|
}
|
|
89
43
|
}
|
|
90
|
-
|
|
91
44
|
return answerCorrect;
|
|
92
45
|
};
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
var correctResponses = question.responses;
|
|
96
|
-
|
|
46
|
+
const getResponseCorrectness = (question, sessionResponse) => {
|
|
47
|
+
const correctResponses = question.responses;
|
|
97
48
|
if (!sessionResponse) {
|
|
98
49
|
return {
|
|
99
50
|
correctness: 'unanswered',
|
|
@@ -101,21 +52,21 @@ var getResponseCorrectness = function getResponseCorrectness(question, sessionRe
|
|
|
101
52
|
correct: false
|
|
102
53
|
};
|
|
103
54
|
} else {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
Object.keys(correctResponses).forEach(
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
55
|
+
let correctAnswers = 0;
|
|
56
|
+
let score = 0;
|
|
57
|
+
const correctResponsesCount = Object.keys(correctResponses || {}).length;
|
|
58
|
+
Object.keys(correctResponses).forEach(responseId => {
|
|
59
|
+
const answerItem = sessionResponse['r' + responseId];
|
|
60
|
+
const correctResponse = correctResponses[responseId] || {};
|
|
61
|
+
const answerCorrect = getIsAnswerCorrect(correctResponse, answerItem);
|
|
112
62
|
if (answerCorrect) {
|
|
113
63
|
correctAnswers++;
|
|
114
64
|
}
|
|
115
65
|
});
|
|
116
|
-
|
|
117
|
-
// dichotomous scoring: for credit to be awarded, a correct answer must be entered for every response area
|
|
66
|
+
const fullyCorrect = correctAnswers === correctResponsesCount;
|
|
118
67
|
|
|
68
|
+
// partial credit scoring: each correct answer is worth 1 / total answers point
|
|
69
|
+
// dichotomous scoring: for credit to be awarded, a correct answer must be entered for every response area
|
|
119
70
|
score = Number((correctAnswers / Object.keys(correctResponses).length).toFixed(2));
|
|
120
71
|
return {
|
|
121
72
|
correctness: getFeedback(fullyCorrect),
|
|
@@ -124,121 +75,102 @@ var getResponseCorrectness = function getResponseCorrectness(question, sessionRe
|
|
|
124
75
|
};
|
|
125
76
|
}
|
|
126
77
|
};
|
|
127
|
-
|
|
128
|
-
var getCorrectness = function getCorrectness(question, env, session) {
|
|
78
|
+
const getCorrectness = (question, env, session) => {
|
|
129
79
|
if (env.mode === 'evaluate') {
|
|
130
80
|
return getResponseCorrectness(question, session && session.answers);
|
|
131
81
|
}
|
|
132
82
|
};
|
|
133
|
-
|
|
134
83
|
exports.getCorrectness = getCorrectness;
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
if (!session || (0, _isEmpty["default"])(session)) {
|
|
84
|
+
const getPartialScore = (question, session) => {
|
|
85
|
+
if (!session || (0, _isEmpty.default)(session)) {
|
|
138
86
|
return 0;
|
|
139
87
|
}
|
|
140
|
-
|
|
141
88
|
return 1;
|
|
142
89
|
};
|
|
143
|
-
|
|
144
90
|
exports.getPartialScore = getPartialScore;
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
resolve({
|
|
168
|
-
score: partialScoringEnabled ? score : score === 1 ? 1 : 0
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
});
|
|
172
|
-
};
|
|
173
|
-
|
|
91
|
+
const outcome = (question, session, env) => new Promise(resolve => {
|
|
92
|
+
if (!session || (0, _isEmpty.default)(session)) {
|
|
93
|
+
resolve({
|
|
94
|
+
score: 0,
|
|
95
|
+
empty: true
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
const partialScoringEnabled = _controllerUtils.partialScoring.enabled(question, env);
|
|
99
|
+
session = normalizeSession(session);
|
|
100
|
+
if (env.mode !== 'evaluate') {
|
|
101
|
+
resolve({
|
|
102
|
+
score: undefined,
|
|
103
|
+
completed: undefined
|
|
104
|
+
});
|
|
105
|
+
} else {
|
|
106
|
+
const correctness = getCorrectness(question, env, session, true);
|
|
107
|
+
const score = correctness.score;
|
|
108
|
+
resolve({
|
|
109
|
+
score: partialScoringEnabled ? score : score === 1 ? 1 : 0
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
});
|
|
174
113
|
exports.outcome = outcome;
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
114
|
+
const createDefaultModel = (model = {}) => {
|
|
115
|
+
const {
|
|
116
|
+
validationDefault,
|
|
117
|
+
allowTrailingZerosDefault,
|
|
118
|
+
ignoreOrderDefault,
|
|
119
|
+
responses = {}
|
|
120
|
+
} = model;
|
|
121
|
+
const updatedResponses = Object.keys(responses).reduce((acc, responseId) => {
|
|
122
|
+
const correctResponse = responses[responseId];
|
|
123
|
+
acc[responseId] = {
|
|
124
|
+
...correctResponse,
|
|
186
125
|
validation: correctResponse.validation || validationDefault,
|
|
187
126
|
allowTrailingZeros: correctResponse.allowTrailingZeros || allowTrailingZerosDefault,
|
|
188
127
|
ignoreOrder: correctResponse.ignoreOrder || ignoreOrderDefault
|
|
189
|
-
}
|
|
128
|
+
};
|
|
190
129
|
return acc;
|
|
191
130
|
}, {});
|
|
192
|
-
return
|
|
131
|
+
return {
|
|
132
|
+
..._defaults.default.model,
|
|
133
|
+
...model,
|
|
193
134
|
responses: updatedResponses
|
|
194
|
-
}
|
|
135
|
+
};
|
|
195
136
|
};
|
|
196
|
-
|
|
197
137
|
exports.createDefaultModel = createDefaultModel;
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
};
|
|
202
|
-
|
|
138
|
+
const normalizeSession = s => ({
|
|
139
|
+
...s
|
|
140
|
+
});
|
|
203
141
|
exports.normalizeSession = normalizeSession;
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
return (html || '').replace(/<\/?[^>]+(>|$)/g, '');
|
|
207
|
-
};
|
|
208
|
-
|
|
209
|
-
var prepareVal = function prepareVal(html) {
|
|
210
|
-
return getTextFromHTML(html).trim();
|
|
211
|
-
};
|
|
212
|
-
|
|
142
|
+
const getTextFromHTML = html => (html || '').replace(/<\/?[^>]+(>|$)/g, '');
|
|
143
|
+
const prepareVal = html => getTextFromHTML(html).trim();
|
|
213
144
|
exports.prepareVal = prepareVal;
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
return new Promise(function (resolve) {
|
|
145
|
+
const model = (question, session, env) => {
|
|
146
|
+
return new Promise(resolve => {
|
|
217
147
|
session = session || {};
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
148
|
+
const normalizedQuestion = createDefaultModel(question);
|
|
149
|
+
const correctness = getCorrectness(normalizedQuestion, env, session);
|
|
150
|
+
const {
|
|
151
|
+
responses,
|
|
152
|
+
language
|
|
153
|
+
} = normalizedQuestion;
|
|
154
|
+
let {
|
|
155
|
+
note
|
|
156
|
+
} = normalizedQuestion;
|
|
157
|
+
let showNote = false;
|
|
158
|
+
|
|
159
|
+
// check if there is at least one alternate response or if the validation for at least one response is not literal
|
|
160
|
+
Object.keys(responses).forEach(responseId => {
|
|
161
|
+
const correctResponse = responses[responseId] || {};
|
|
228
162
|
if (correctResponse.alternates && Object.keys(correctResponse.alternates).length > 0) {
|
|
229
163
|
showNote = true;
|
|
230
164
|
} else if (correctResponse.validation !== 'literal') {
|
|
231
165
|
showNote = true;
|
|
232
166
|
}
|
|
233
167
|
});
|
|
234
|
-
|
|
235
168
|
if (!note) {
|
|
236
169
|
note = translator.t('mathInline.primaryCorrectWithAlternates', {
|
|
237
170
|
lng: language
|
|
238
171
|
});
|
|
239
172
|
}
|
|
240
|
-
|
|
241
|
-
var out = {
|
|
173
|
+
const out = {
|
|
242
174
|
prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,
|
|
243
175
|
markup: normalizedQuestion.markup,
|
|
244
176
|
responses: env.mode === 'gather' ? null : normalizedQuestion.responses,
|
|
@@ -247,25 +179,21 @@ var model = function model(question, session, env) {
|
|
|
247
179
|
customKeys: normalizedQuestion.customKeys,
|
|
248
180
|
disabled: env.mode !== 'gather',
|
|
249
181
|
view: env.mode === 'view',
|
|
250
|
-
correctness
|
|
251
|
-
env
|
|
182
|
+
correctness,
|
|
183
|
+
env,
|
|
252
184
|
extraCSSRules: normalizedQuestion.extraCSSRules
|
|
253
185
|
};
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
var feedback = {};
|
|
260
|
-
|
|
186
|
+
const {
|
|
187
|
+
answers = {}
|
|
188
|
+
} = session || {};
|
|
189
|
+
let feedback = {};
|
|
261
190
|
if (env.mode === 'evaluate') {
|
|
262
|
-
Object.keys(responses).forEach(
|
|
263
|
-
|
|
264
|
-
|
|
191
|
+
Object.keys(responses).forEach(responseId => {
|
|
192
|
+
const answerItem = answers['r' + responseId];
|
|
193
|
+
const correctResponse = responses[responseId];
|
|
265
194
|
feedback[responseId] = getIsAnswerCorrect(correctResponse, answerItem);
|
|
266
195
|
});
|
|
267
196
|
}
|
|
268
|
-
|
|
269
197
|
if (env.mode === 'evaluate') {
|
|
270
198
|
out.correctResponse = {};
|
|
271
199
|
out.showNote = showNote;
|
|
@@ -275,7 +203,6 @@ var model = function model(question, session, env) {
|
|
|
275
203
|
out.responses = {};
|
|
276
204
|
out.showNote = false;
|
|
277
205
|
}
|
|
278
|
-
|
|
279
206
|
if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
|
|
280
207
|
out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;
|
|
281
208
|
out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;
|
|
@@ -283,103 +210,80 @@ var model = function model(question, session, env) {
|
|
|
283
210
|
out.rationale = null;
|
|
284
211
|
out.teacherInstructions = null;
|
|
285
212
|
}
|
|
286
|
-
|
|
287
213
|
log('out: ', out);
|
|
288
214
|
resolve(out);
|
|
289
215
|
});
|
|
290
216
|
};
|
|
291
|
-
|
|
292
217
|
exports.model = model;
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
}
|
|
310
|
-
});
|
|
311
|
-
};
|
|
312
|
-
|
|
218
|
+
const createCorrectResponseSession = (question, env) => new Promise(resolve => {
|
|
219
|
+
if (env.mode !== 'evaluate' && env.role === 'instructor') {
|
|
220
|
+
const correctResponse = Object.keys(question.responses).reduce((acc, responseId) => {
|
|
221
|
+
acc['r' + responseId] = {
|
|
222
|
+
value: question.responses[responseId].answer
|
|
223
|
+
};
|
|
224
|
+
return acc;
|
|
225
|
+
}, {});
|
|
226
|
+
resolve({
|
|
227
|
+
id: '1',
|
|
228
|
+
answers: correctResponse
|
|
229
|
+
});
|
|
230
|
+
} else {
|
|
231
|
+
resolve(null);
|
|
232
|
+
}
|
|
233
|
+
});
|
|
313
234
|
exports.createCorrectResponseSession = createCorrectResponseSession;
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
if ((_config$field = config[field]) !== null && _config$field !== void 0 && _config$field.required && !getContent(model[field])) {
|
|
235
|
+
const validate = (model = {}, config = {}) => {
|
|
236
|
+
const {
|
|
237
|
+
responses,
|
|
238
|
+
markup
|
|
239
|
+
} = model;
|
|
240
|
+
const {
|
|
241
|
+
maxResponseAreas
|
|
242
|
+
} = config;
|
|
243
|
+
const responsesErrors = {};
|
|
244
|
+
const errors = {};
|
|
245
|
+
['teacherInstructions', 'prompt', 'rationale'].forEach(field => {
|
|
246
|
+
if (config[field]?.required && !getContent(model[field])) {
|
|
327
247
|
errors[field] = 'This field is required.';
|
|
328
248
|
}
|
|
329
249
|
});
|
|
330
|
-
Object.entries(responses || {}).forEach(
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
var alternatesErrors = {};
|
|
338
|
-
var responseError = {};
|
|
339
|
-
|
|
250
|
+
Object.entries(responses || {}).forEach(([key, response], index) => {
|
|
251
|
+
const {
|
|
252
|
+
answer
|
|
253
|
+
} = response;
|
|
254
|
+
const reversedAlternates = [...Object.entries(response.alternates || {})].reverse();
|
|
255
|
+
const alternatesErrors = {};
|
|
256
|
+
const responseError = {};
|
|
340
257
|
if (answer === '') {
|
|
341
258
|
responseError.answer = 'Content should not be empty.';
|
|
342
259
|
}
|
|
343
|
-
|
|
344
|
-
reversedAlternates.forEach(function (_ref4, index) {
|
|
345
|
-
var _ref5 = (0, _slicedToArray2["default"])(_ref4, 2),
|
|
346
|
-
key = _ref5[0],
|
|
347
|
-
value = _ref5[1];
|
|
348
|
-
|
|
260
|
+
reversedAlternates.forEach(([key, value], index) => {
|
|
349
261
|
if (value === '') {
|
|
350
262
|
alternatesErrors[key] = 'Content should not be empty.';
|
|
351
263
|
} else {
|
|
352
|
-
|
|
353
|
-
var _ref7 = (0, _slicedToArray2["default"])(_ref6, 2),
|
|
354
|
-
val = _ref7[1];
|
|
355
|
-
|
|
356
|
-
return val === value;
|
|
357
|
-
});
|
|
358
|
-
|
|
264
|
+
const identicalAnswer = answer === value || reversedAlternates.slice(index + 1).some(([, val]) => val === value);
|
|
359
265
|
if (identicalAnswer) {
|
|
360
266
|
alternatesErrors[key] = 'Content should be unique.';
|
|
361
267
|
}
|
|
362
268
|
}
|
|
363
269
|
});
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
270
|
+
if (!(0, _isEmpty.default)(responseError) || !(0, _isEmpty.default)(alternatesErrors)) {
|
|
271
|
+
responsesErrors[index] = {
|
|
272
|
+
...responseError,
|
|
273
|
+
...alternatesErrors
|
|
274
|
+
};
|
|
367
275
|
}
|
|
368
276
|
});
|
|
369
|
-
|
|
370
|
-
|
|
277
|
+
const nbOfResponseAreas = (markup.match(/\{\{(\d+)\}\}/g) || []).length;
|
|
371
278
|
if (nbOfResponseAreas > maxResponseAreas) {
|
|
372
|
-
errors.responseAreas =
|
|
279
|
+
errors.responseAreas = `No more than ${maxResponseAreas} response areas should be defined.`;
|
|
373
280
|
} else if (nbOfResponseAreas < 1) {
|
|
374
281
|
errors.responseAreas = 'There should be at least 1 response area defined.';
|
|
375
282
|
}
|
|
376
|
-
|
|
377
|
-
if (!(0, _isEmpty["default"])(responsesErrors)) {
|
|
283
|
+
if (!(0, _isEmpty.default)(responsesErrors)) {
|
|
378
284
|
errors.responses = responsesErrors;
|
|
379
285
|
}
|
|
380
|
-
|
|
381
286
|
return errors;
|
|
382
287
|
};
|
|
383
|
-
|
|
384
288
|
exports.validate = validate;
|
|
385
289
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":["translator","Translator","log","getFeedback","value","getContent","html","replace","getIsAnswerCorrect","correctResponse","answerItem","answerCorrect","opts","mode","validation","defaults","validationDefault","literal","allowTrailingZeros","ignoreOrder","acceptedValues","answer","Object","values","alternates","mv","latexEqual","e","getResponseCorrectness","question","sessionResponse","correctResponses","responses","correctness","score","correct","correctAnswers","correctResponsesCount","keys","length","forEach","responseId","fullyCorrect","Number","toFixed","getCorrectness","env","session","answers","getPartialScore","outcome","Promise","resolve","empty","partialScoringEnabled","partialScoring","enabled","normalizeSession","undefined","completed","createDefaultModel","model","allowTrailingZerosDefault","ignoreOrderDefault","updatedResponses","reduce","acc","s","getTextFromHTML","prepareVal","trim","normalizedQuestion","language","note","showNote","t","lng","out","prompt","promptEnabled","markup","equationEditor","customKeys","disabled","view","extraCSSRules","feedback","role","rationale","rationaleEnabled","teacherInstructions","teacherInstructionsEnabled","createCorrectResponseSession","id","validate","config","maxResponseAreas","responsesErrors","errors","field","required","entries","index","key","response","reversedAlternates","reverse","alternatesErrors","responseError","identicalAnswer","slice","some","val","nbOfResponseAreas","match","responseAreas"],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport Translator from '@pie-lib/translator';\nimport * as mv from '@pie-framework/math-validation';\n\nimport defaults from './defaults';\nimport { partialScoring } from '@pie-lib/controller-utils';\n\nconst { translator } = Translator;\nconst log = debug('@pie-element:math-templated:controller');\n\nconst getFeedback = (value) => (value ? 'correct' : 'incorrect');\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nconst getIsAnswerCorrect = (correctResponse, answerItem) => {\n let answerCorrect = false;\n\n const opts = {\n mode: correctResponse.validation || defaults.validationDefault,\n ...(correctResponse.validation === 'literal' && {\n literal: {\n allowTrailingZeros: correctResponse.allowTrailingZeros || false,\n ignoreOrder: correctResponse.ignoreOrder || false,\n },\n }),\n };\n\n if (!answerCorrect) {\n const acceptedValues = [correctResponse.answer, ...Object.values(correctResponse.alternates || {})];\n\n try {\n for (const value of acceptedValues) {\n answerCorrect = mv.latexEqual(answerItem.value, value, opts);\n if (answerCorrect) break;\n }\n } catch (e) {\n log('Parse failure when evaluating math', e, correctResponse, answerItem);\n answerCorrect = false;\n }\n }\n\n return answerCorrect;\n};\n\nconst getResponseCorrectness = (question, sessionResponse) => {\n const correctResponses = question.responses;\n\n if (!sessionResponse) {\n return {\n correctness: 'unanswered',\n score: 0,\n correct: false,\n };\n } else {\n let correctAnswers = 0;\n let score = 0;\n const correctResponsesCount = Object.keys(correctResponses || {}).length;\n\n Object.keys(correctResponses).forEach((responseId) => {\n const answerItem = sessionResponse['r' + responseId];\n const correctResponse = correctResponses[responseId] || {};\n\n const answerCorrect = getIsAnswerCorrect(correctResponse, answerItem);\n if (answerCorrect) {\n correctAnswers++;\n }\n });\n\n const fullyCorrect = correctAnswers === correctResponsesCount;\n\n // partial credit scoring: each correct answer is worth 1 / total answers point\n // dichotomous scoring: for credit to be awarded, a correct answer must be entered for every response area\n score = Number((correctAnswers / Object.keys(correctResponses).length).toFixed(2));\n\n return {\n correctness: getFeedback(fullyCorrect),\n score: correctAnswers > 0 ? score : 0,\n correct: fullyCorrect,\n };\n }\n};\n\nexport const getCorrectness = (question, env, session) => {\n if (env.mode === 'evaluate') {\n return getResponseCorrectness(question, session && session.answers);\n }\n};\n\nexport const getPartialScore = (question, session) => {\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n return 1;\n};\n\nexport const outcome = (question, session, env) =>\n new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n const partialScoringEnabled = partialScoring.enabled(question, env);\n session = normalizeSession(session);\n\n if (env.mode !== 'evaluate') {\n resolve({ score: undefined, completed: undefined });\n } else {\n const correctness = getCorrectness(question, env, session, true);\n const score = correctness.score;\n\n resolve({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0 });\n }\n });\n\nexport const createDefaultModel = (model = {}) => {\n const { validationDefault, allowTrailingZerosDefault, ignoreOrderDefault, responses = {} } = model;\n\n const updatedResponses = Object.keys(responses).reduce((acc, responseId) => {\n const correctResponse = responses[responseId];\n\n acc[responseId] = {\n ...correctResponse,\n validation: correctResponse.validation || validationDefault,\n allowTrailingZeros: correctResponse.allowTrailingZeros || allowTrailingZerosDefault,\n ignoreOrder: correctResponse.ignoreOrder || ignoreOrderDefault,\n };\n\n return acc;\n }, {});\n\n return {\n ...defaults.model,\n ...model,\n responses: updatedResponses,\n };\n};\n\nexport const normalizeSession = (s) => ({ ...s });\n\nconst getTextFromHTML = (html) => (html || '').replace(/<\\/?[^>]+(>|$)/g, '');\n\nexport const prepareVal = (html) => getTextFromHTML(html).trim();\n\nexport const model = (question, session, env) => {\n return new Promise((resolve) => {\n session = session || {};\n const normalizedQuestion = createDefaultModel(question);\n const correctness = getCorrectness(normalizedQuestion, env, session);\n const { responses, language } = normalizedQuestion;\n let { note } = normalizedQuestion;\n let showNote = false;\n\n // check if there is at least one alternate response or if the validation for at least one response is not literal\n Object.keys(responses).forEach((responseId) => {\n const correctResponse = responses[responseId] || {};\n if (correctResponse.alternates && Object.keys(correctResponse.alternates).length > 0) {\n showNote = true;\n } else if (correctResponse.validation !== 'literal') {\n showNote = true;\n }\n });\n\n if (!note) {\n note = translator.t('mathInline.primaryCorrectWithAlternates', { lng: language });\n }\n\n const out = {\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n markup: normalizedQuestion.markup,\n responses: env.mode === 'gather' ? null : normalizedQuestion.responses,\n language: normalizedQuestion.language,\n equationEditor: normalizedQuestion.equationEditor,\n customKeys: normalizedQuestion.customKeys,\n disabled: env.mode !== 'gather',\n view: env.mode === 'view',\n correctness,\n env,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n\n const { answers = {} } = session || {};\n let feedback = {};\n\n if (env.mode === 'evaluate') {\n Object.keys(responses).forEach((responseId) => {\n const answerItem = answers['r' + responseId];\n const correctResponse = responses[responseId];\n feedback[responseId] = getIsAnswerCorrect(correctResponse, answerItem);\n });\n }\n\n if (env.mode === 'evaluate') {\n out.correctResponse = {};\n out.showNote = showNote;\n out.note = note;\n out.feedback = feedback;\n } else {\n out.responses = {};\n out.showNote = false;\n }\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n log('out: ', out);\n resolve(out);\n });\n};\n\nexport const createCorrectResponseSession = (question, env) =>\n new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const correctResponse = Object.keys(question.responses).reduce((acc, responseId) => {\n acc['r' + responseId] = { value: question.responses[responseId].answer };\n return acc;\n }, {});\n\n resolve({ id: '1', answers: correctResponse });\n } else {\n resolve(null);\n }\n });\n\nexport const validate = (model = {}, config = {}) => {\n const { responses, markup } = model;\n const { maxResponseAreas } = config;\n const responsesErrors = {};\n const errors = {};\n\n ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n Object.entries(responses || {}).forEach(([key, response], index) => {\n const { answer } = response;\n const reversedAlternates = [...Object.entries(response.alternates || {})].reverse();\n const alternatesErrors = {};\n const responseError = {};\n\n if (answer === '') {\n responseError.answer = 'Content should not be empty.';\n }\n\n reversedAlternates.forEach(([key, value], index) => {\n if (value === '') {\n alternatesErrors[key] = 'Content should not be empty.';\n } else {\n const identicalAnswer =\n answer === value || reversedAlternates.slice(index + 1).some(([, val]) => val === value);\n\n if (identicalAnswer) {\n alternatesErrors[key] = 'Content should be unique.';\n }\n }\n });\n\n if (!isEmpty(responseError) || !isEmpty(alternatesErrors)) {\n responsesErrors[index] = { ...responseError, ...alternatesErrors };\n }\n });\n\n const nbOfResponseAreas = (markup.match(/\\{\\{(\\d+)\\}\\}/g) || []).length;\n\n if (nbOfResponseAreas > maxResponseAreas) {\n errors.responseAreas = `No more than ${maxResponseAreas} response areas should be defined.`;\n } else if (nbOfResponseAreas < 1) {\n errors.responseAreas = 'There should be at least 1 response area defined.';\n }\n\n if (!isEmpty(responsesErrors)) {\n errors.responses = responsesErrors;\n }\n\n return errors;\n};\n"],"file":"index.js"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_debug","_interopRequireDefault","require","_isEmpty","_translator","mv","_interopRequireWildcard","_defaults","_controllerUtils","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","translator","Translator","log","debug","getFeedback","value","getContent","html","replace","getIsAnswerCorrect","correctResponse","answerItem","answerCorrect","opts","mode","validation","defaults","validationDefault","literal","allowTrailingZeros","ignoreOrder","acceptedValues","answer","values","alternates","latexEqual","getResponseCorrectness","question","sessionResponse","correctResponses","responses","correctness","score","correct","correctAnswers","correctResponsesCount","keys","length","forEach","responseId","fullyCorrect","Number","toFixed","getCorrectness","env","session","answers","exports","getPartialScore","isEmpty","outcome","Promise","resolve","empty","partialScoringEnabled","partialScoring","enabled","normalizeSession","undefined","completed","createDefaultModel","model","allowTrailingZerosDefault","ignoreOrderDefault","updatedResponses","reduce","acc","s","getTextFromHTML","prepareVal","trim","normalizedQuestion","language","note","showNote","lng","out","prompt","promptEnabled","markup","equationEditor","customKeys","disabled","view","extraCSSRules","feedback","role","rationale","rationaleEnabled","teacherInstructions","teacherInstructionsEnabled","createCorrectResponseSession","id","validate","config","maxResponseAreas","responsesErrors","errors","field","required","entries","key","response","index","reversedAlternates","reverse","alternatesErrors","responseError","identicalAnswer","slice","some","val","nbOfResponseAreas","match","responseAreas"],"sources":["../src/index.js"],"sourcesContent":["import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport Translator from '@pie-lib/translator';\nimport * as mv from '@pie-framework/math-validation';\n\nimport defaults from './defaults';\nimport { partialScoring } from '@pie-lib/controller-utils';\n\nconst { translator } = Translator;\nconst log = debug('@pie-element:math-templated:controller');\n\nconst getFeedback = (value) => (value ? 'correct' : 'incorrect');\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nconst getIsAnswerCorrect = (correctResponse, answerItem) => {\n let answerCorrect = false;\n\n const opts = {\n mode: correctResponse.validation || defaults.validationDefault,\n ...(correctResponse.validation === 'literal' && {\n literal: {\n allowTrailingZeros: correctResponse.allowTrailingZeros || false,\n ignoreOrder: correctResponse.ignoreOrder || false,\n },\n }),\n };\n\n if (!answerCorrect) {\n const acceptedValues = [correctResponse.answer, ...Object.values(correctResponse.alternates || {})];\n\n try {\n for (const value of acceptedValues) {\n answerCorrect = mv.latexEqual(answerItem.value, value, opts);\n if (answerCorrect) break;\n }\n } catch (e) {\n log('Parse failure when evaluating math', e, correctResponse, answerItem);\n answerCorrect = false;\n }\n }\n\n return answerCorrect;\n};\n\nconst getResponseCorrectness = (question, sessionResponse) => {\n const correctResponses = question.responses;\n\n if (!sessionResponse) {\n return {\n correctness: 'unanswered',\n score: 0,\n correct: false,\n };\n } else {\n let correctAnswers = 0;\n let score = 0;\n const correctResponsesCount = Object.keys(correctResponses || {}).length;\n\n Object.keys(correctResponses).forEach((responseId) => {\n const answerItem = sessionResponse['r' + responseId];\n const correctResponse = correctResponses[responseId] || {};\n\n const answerCorrect = getIsAnswerCorrect(correctResponse, answerItem);\n if (answerCorrect) {\n correctAnswers++;\n }\n });\n\n const fullyCorrect = correctAnswers === correctResponsesCount;\n\n // partial credit scoring: each correct answer is worth 1 / total answers point\n // dichotomous scoring: for credit to be awarded, a correct answer must be entered for every response area\n score = Number((correctAnswers / Object.keys(correctResponses).length).toFixed(2));\n\n return {\n correctness: getFeedback(fullyCorrect),\n score: correctAnswers > 0 ? score : 0,\n correct: fullyCorrect,\n };\n }\n};\n\nexport const getCorrectness = (question, env, session) => {\n if (env.mode === 'evaluate') {\n return getResponseCorrectness(question, session && session.answers);\n }\n};\n\nexport const getPartialScore = (question, session) => {\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n return 1;\n};\n\nexport const outcome = (question, session, env) =>\n new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n const partialScoringEnabled = partialScoring.enabled(question, env);\n session = normalizeSession(session);\n\n if (env.mode !== 'evaluate') {\n resolve({ score: undefined, completed: undefined });\n } else {\n const correctness = getCorrectness(question, env, session, true);\n const score = correctness.score;\n\n resolve({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0 });\n }\n });\n\nexport const createDefaultModel = (model = {}) => {\n const { validationDefault, allowTrailingZerosDefault, ignoreOrderDefault, responses = {} } = model;\n\n const updatedResponses = Object.keys(responses).reduce((acc, responseId) => {\n const correctResponse = responses[responseId];\n\n acc[responseId] = {\n ...correctResponse,\n validation: correctResponse.validation || validationDefault,\n allowTrailingZeros: correctResponse.allowTrailingZeros || allowTrailingZerosDefault,\n ignoreOrder: correctResponse.ignoreOrder || ignoreOrderDefault,\n };\n\n return acc;\n }, {});\n\n return {\n ...defaults.model,\n ...model,\n responses: updatedResponses,\n };\n};\n\nexport const normalizeSession = (s) => ({ ...s });\n\nconst getTextFromHTML = (html) => (html || '').replace(/<\\/?[^>]+(>|$)/g, '');\n\nexport const prepareVal = (html) => getTextFromHTML(html).trim();\n\nexport const model = (question, session, env) => {\n return new Promise((resolve) => {\n session = session || {};\n const normalizedQuestion = createDefaultModel(question);\n const correctness = getCorrectness(normalizedQuestion, env, session);\n const { responses, language } = normalizedQuestion;\n let { note } = normalizedQuestion;\n let showNote = false;\n\n // check if there is at least one alternate response or if the validation for at least one response is not literal\n Object.keys(responses).forEach((responseId) => {\n const correctResponse = responses[responseId] || {};\n if (correctResponse.alternates && Object.keys(correctResponse.alternates).length > 0) {\n showNote = true;\n } else if (correctResponse.validation !== 'literal') {\n showNote = true;\n }\n });\n\n if (!note) {\n note = translator.t('mathInline.primaryCorrectWithAlternates', { lng: language });\n }\n\n const out = {\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n markup: normalizedQuestion.markup,\n responses: env.mode === 'gather' ? null : normalizedQuestion.responses,\n language: normalizedQuestion.language,\n equationEditor: normalizedQuestion.equationEditor,\n customKeys: normalizedQuestion.customKeys,\n disabled: env.mode !== 'gather',\n view: env.mode === 'view',\n correctness,\n env,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n\n const { answers = {} } = session || {};\n let feedback = {};\n\n if (env.mode === 'evaluate') {\n Object.keys(responses).forEach((responseId) => {\n const answerItem = answers['r' + responseId];\n const correctResponse = responses[responseId];\n feedback[responseId] = getIsAnswerCorrect(correctResponse, answerItem);\n });\n }\n\n if (env.mode === 'evaluate') {\n out.correctResponse = {};\n out.showNote = showNote;\n out.note = note;\n out.feedback = feedback;\n } else {\n out.responses = {};\n out.showNote = false;\n }\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n log('out: ', out);\n resolve(out);\n });\n};\n\nexport const createCorrectResponseSession = (question, env) =>\n new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const correctResponse = Object.keys(question.responses).reduce((acc, responseId) => {\n acc['r' + responseId] = { value: question.responses[responseId].answer };\n return acc;\n }, {});\n\n resolve({ id: '1', answers: correctResponse });\n } else {\n resolve(null);\n }\n });\n\nexport const validate = (model = {}, config = {}) => {\n const { responses, markup } = model;\n const { maxResponseAreas } = config;\n const responsesErrors = {};\n const errors = {};\n\n ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n Object.entries(responses || {}).forEach(([key, response], index) => {\n const { answer } = response;\n const reversedAlternates = [...Object.entries(response.alternates || {})].reverse();\n const alternatesErrors = {};\n const responseError = {};\n\n if (answer === '') {\n responseError.answer = 'Content should not be empty.';\n }\n\n reversedAlternates.forEach(([key, value], index) => {\n if (value === '') {\n alternatesErrors[key] = 'Content should not be empty.';\n } else {\n const identicalAnswer =\n answer === value || reversedAlternates.slice(index + 1).some(([, val]) => val === value);\n\n if (identicalAnswer) {\n alternatesErrors[key] = 'Content should be unique.';\n }\n }\n });\n\n if (!isEmpty(responseError) || !isEmpty(alternatesErrors)) {\n responsesErrors[index] = { ...responseError, ...alternatesErrors };\n }\n });\n\n const nbOfResponseAreas = (markup.match(/\\{\\{(\\d+)\\}\\}/g) || []).length;\n\n if (nbOfResponseAreas > maxResponseAreas) {\n errors.responseAreas = `No more than ${maxResponseAreas} response areas should be defined.`;\n } else if (nbOfResponseAreas < 1) {\n errors.responseAreas = 'There should be at least 1 response area defined.';\n }\n\n if (!isEmpty(responsesErrors)) {\n errors.responses = responsesErrors;\n }\n\n return errors;\n};\n"],"mappings":"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","ignoreList":[]}
|