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