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