@pie-element/math-inline 11.0.5-esm.0 → 11.1.0-next.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 +70 -0
- package/configure/CHANGELOG.md +69 -0
- package/configure/lib/configure.js +162 -240
- package/configure/lib/configure.js.map +1 -1
- package/configure/lib/defaults.js +8 -8
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/general-config-block.js +447 -564
- package/configure/lib/general-config-block.js.map +1 -1
- package/configure/lib/index.js +111 -176
- package/configure/lib/index.js.map +1 -1
- package/configure/lib/response.js +330 -388
- package/configure/lib/response.js.map +1 -1
- package/configure/lib/utils.js +15 -30
- package/configure/lib/utils.js.map +1 -1
- package/configure/package.json +14 -12
- package/controller/CHANGELOG.md +49 -0
- package/controller/lib/defaults.js +5 -8
- package/controller/lib/defaults.js.map +1 -1
- package/controller/lib/index.js +189 -278
- package/controller/lib/index.js.map +1 -1
- package/controller/lib/utils.js +1 -2
- package/controller/lib/utils.js.map +1 -1
- package/controller/package.json +7 -7
- package/lib/index.js +72 -125
- package/lib/index.js.map +1 -1
- package/lib/main.js +784 -889
- package/lib/main.js.map +1 -1
- package/lib/print.js +43 -84
- package/lib/print.js.map +1 -1
- package/lib/simple-question-block.js +125 -162
- package/lib/simple-question-block.js.map +1 -1
- package/lib/utils.js +1 -2
- package/lib/utils.js.map +1 -1
- package/module/configure.js +1 -1
- package/module/controller.js +2319 -2930
- package/module/element.js +1 -1
- package/module/index.html +1 -1
- package/module/manifest.json +7 -3
- package/module/print.html +1 -1
- package/module/print.js +1 -1
- package/package.json +21 -33
- package/esm/configure.css +0 -847
- package/esm/configure.js +0 -1769
- package/esm/configure.js.map +0 -1
- package/esm/controller.css +0 -847
- package/esm/controller.js +0 -416
- package/esm/controller.js.map +0 -1
- package/esm/element.css +0 -847
- package/esm/element.js +0 -1476
- package/esm/element.js.map +0 -1
- package/esm/print.css +0 -847
- package/esm/print.js +0 -1288
- package/esm/print.js.map +0 -1
package/esm/controller.js
DELETED
|
@@ -1,416 +0,0 @@
|
|
|
1
|
-
import debug from 'debug';
|
|
2
|
-
import isEmpty from 'lodash/isEmpty';
|
|
3
|
-
import { getActualFeedbackForCorrectness } from '@pie-lib/feedback';
|
|
4
|
-
import Translator from '@pie-lib/translator';
|
|
5
|
-
import * as mv from '@pie-framework/math-validation';
|
|
6
|
-
|
|
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
|
-
}
|
|
18
|
-
|
|
19
|
-
return target;
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
return _extends.apply(this, arguments);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function _objectWithoutPropertiesLoose(source, excluded) {
|
|
26
|
-
if (source == null) return {};
|
|
27
|
-
var target = {};
|
|
28
|
-
var sourceKeys = Object.keys(source);
|
|
29
|
-
var key, i;
|
|
30
|
-
|
|
31
|
-
for (i = 0; i < sourceKeys.length; i++) {
|
|
32
|
-
key = sourceKeys[i];
|
|
33
|
-
if (excluded.indexOf(key) >= 0) continue;
|
|
34
|
-
target[key] = source[key];
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
return target;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const ResponseTypes = {
|
|
41
|
-
advanced: 'Advanced Multi',
|
|
42
|
-
simple: 'Simple'
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
var defaults = {
|
|
46
|
-
allowTrailingZerosDefault: false,
|
|
47
|
-
customKeys: [],
|
|
48
|
-
equationEditor: '8',
|
|
49
|
-
expression: '',
|
|
50
|
-
feedback: {
|
|
51
|
-
correct: {
|
|
52
|
-
default: 'Correct',
|
|
53
|
-
type: 'none'
|
|
54
|
-
},
|
|
55
|
-
incorrect: {
|
|
56
|
-
default: 'Incorrect',
|
|
57
|
-
type: 'none'
|
|
58
|
-
},
|
|
59
|
-
partial: {
|
|
60
|
-
default: 'Nearly',
|
|
61
|
-
type: 'none'
|
|
62
|
-
}
|
|
63
|
-
},
|
|
64
|
-
feedbackEnabled: false,
|
|
65
|
-
ignoreOrderDefault: false,
|
|
66
|
-
partialScoring: true,
|
|
67
|
-
prompt: '',
|
|
68
|
-
promptEnabled: true,
|
|
69
|
-
rationale: '',
|
|
70
|
-
rationaleEnabled: true,
|
|
71
|
-
responseType: ResponseTypes.advanced,
|
|
72
|
-
responses: [],
|
|
73
|
-
scoringType: 'auto',
|
|
74
|
-
studentInstructionsEnabled: true,
|
|
75
|
-
teacherInstructions: '',
|
|
76
|
-
teacherInstructionsEnabled: true,
|
|
77
|
-
toolbarEditorPosition: 'bottom',
|
|
78
|
-
validationDefault: 'literal'
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
const _excluded = ["extraCSSRules", "responses", "language"];
|
|
82
|
-
const {
|
|
83
|
-
translator
|
|
84
|
-
} = Translator;
|
|
85
|
-
const log = debug('@pie-element:math-inline:controller');
|
|
86
|
-
|
|
87
|
-
const getResponseCorrectness = (model, answerItem, isOutcome) => {
|
|
88
|
-
const correctResponses = model.responses;
|
|
89
|
-
const isAdvanced = model.responseType === ResponseTypes.advanced;
|
|
90
|
-
|
|
91
|
-
if (!answerItem) {
|
|
92
|
-
return {
|
|
93
|
-
correctness: 'unanswered',
|
|
94
|
-
score: isOutcome ? 0 : '0%',
|
|
95
|
-
correct: false
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
const isAnswerCorrect = getIsAnswerCorrect(isAdvanced ? correctResponses : correctResponses.slice(0, 1), answerItem);
|
|
100
|
-
const correctnessObject = {
|
|
101
|
-
correctness: 'incorrect',
|
|
102
|
-
score: isOutcome ? 0 : '0%',
|
|
103
|
-
correct: false
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
if (isAnswerCorrect) {
|
|
107
|
-
correctnessObject.correctness = 'correct';
|
|
108
|
-
correctnessObject.score = isOutcome ? 1 : '100%';
|
|
109
|
-
correctnessObject.correct = true;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
return correctnessObject;
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
function getIsAnswerCorrect(correctResponseItems, answerItem) {
|
|
116
|
-
let answerCorrect = false;
|
|
117
|
-
(correctResponseItems || []).forEach(correctResponse => {
|
|
118
|
-
if (answerCorrect) return;
|
|
119
|
-
const opts = {
|
|
120
|
-
mode: correctResponse.validation || defaults.validationDefault
|
|
121
|
-
};
|
|
122
|
-
|
|
123
|
-
if (opts.mode === 'literal') {
|
|
124
|
-
opts.literal = {
|
|
125
|
-
allowTrailingZeros: correctResponse.allowTrailingZeros || false,
|
|
126
|
-
ignoreOrder: correctResponse.ignoreOrder || false
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
const acceptedValues = [correctResponse.answer].concat(Object.keys(correctResponse.alternates || {}).map(alternateId => correctResponse.alternates[alternateId]));
|
|
131
|
-
|
|
132
|
-
for (let i = 0; i < acceptedValues.length; i++) {
|
|
133
|
-
try {
|
|
134
|
-
if (mv.latexEqual(answerItem, acceptedValues[i], opts)) {
|
|
135
|
-
answerCorrect = true;
|
|
136
|
-
break;
|
|
137
|
-
}
|
|
138
|
-
} catch (e) {
|
|
139
|
-
log('Parse failure when evaluating math', acceptedValues[i], answerItem, e);
|
|
140
|
-
continue;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
});
|
|
144
|
-
return answerCorrect;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
const getCorrectness = (question, env, session, isOutcome) => {
|
|
148
|
-
if (env.mode === 'evaluate') {
|
|
149
|
-
return getResponseCorrectness(question, question.responseType === ResponseTypes.advanced ? session && session.completeAnswer || '' : session && session.response, isOutcome);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
return undefined;
|
|
153
|
-
};
|
|
154
|
-
|
|
155
|
-
function createDefaultModel(model = {}) {
|
|
156
|
-
return new Promise(resolve => {
|
|
157
|
-
resolve({
|
|
158
|
-
config: _extends({}, defaults, model)
|
|
159
|
-
});
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
const outcome = (question, session, env) => {
|
|
163
|
-
return new Promise(resolve => {
|
|
164
|
-
if (env.mode !== 'evaluate') {
|
|
165
|
-
resolve({
|
|
166
|
-
score: undefined,
|
|
167
|
-
completed: undefined
|
|
168
|
-
});
|
|
169
|
-
} else {
|
|
170
|
-
if (!session || isEmpty(session)) {
|
|
171
|
-
resolve({
|
|
172
|
-
score: 0,
|
|
173
|
-
empty: true
|
|
174
|
-
});
|
|
175
|
-
} else {
|
|
176
|
-
const correctness = getCorrectness(question, env, session, true);
|
|
177
|
-
resolve({
|
|
178
|
-
score: correctness.score
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
});
|
|
183
|
-
};
|
|
184
|
-
const normalize = question => {
|
|
185
|
-
// making sure that defaults are set
|
|
186
|
-
if (!isEmpty(question.responses)) {
|
|
187
|
-
question.responses = question.responses.map(correctResponse => _extends({}, correctResponse, {
|
|
188
|
-
validation: correctResponse.validation || question.validationDefault,
|
|
189
|
-
allowTrailingZeros: correctResponse.allowTrailingZeros || question.allowTrailingZerosDefault,
|
|
190
|
-
ignoreOrder: correctResponse.ignoreOrder || question.ignoreOrderDefault
|
|
191
|
-
}));
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
return _extends({}, defaults, question);
|
|
195
|
-
};
|
|
196
|
-
const model = (question, session, env) => new Promise(resolve => {
|
|
197
|
-
var _config$responses;
|
|
198
|
-
|
|
199
|
-
const normalizedQuestion = normalize(question);
|
|
200
|
-
const correctness = getCorrectness(normalizedQuestion, env, session);
|
|
201
|
-
|
|
202
|
-
const {
|
|
203
|
-
extraCSSRules,
|
|
204
|
-
responses,
|
|
205
|
-
language
|
|
206
|
-
} = normalizedQuestion,
|
|
207
|
-
config = _objectWithoutPropertiesLoose(normalizedQuestion, _excluded);
|
|
208
|
-
|
|
209
|
-
config.responses = config.responseType === ResponseTypes.simple ? responses.slice(0, 1) : responses;
|
|
210
|
-
const feedback = env.mode === 'evaluate' && normalizedQuestion.feedbackEnabled ? getActualFeedbackForCorrectness(correctness == null ? void 0 : correctness.correctness, normalizedQuestion.feedback) : undefined;
|
|
211
|
-
const out = {
|
|
212
|
-
extraCSSRules,
|
|
213
|
-
config,
|
|
214
|
-
correctness,
|
|
215
|
-
feedback,
|
|
216
|
-
disabled: env.mode !== 'gather',
|
|
217
|
-
view: env.mode === 'view'
|
|
218
|
-
};
|
|
219
|
-
const note = normalizedQuestion.note || translator.t('mathInline.primaryCorrectWithAlternates', {
|
|
220
|
-
lng: language
|
|
221
|
-
});
|
|
222
|
-
const showNote = (config == null ? void 0 : (_config$responses = config.responses) == null ? void 0 : _config$responses.length) > 1 || ((config == null ? void 0 : config.responses) || []).some(response => response.validation === 'symbolic' || Object.keys(response.alternates || {}).length > 0);
|
|
223
|
-
|
|
224
|
-
if (env.mode === 'evaluate') {
|
|
225
|
-
out.correctResponse = {};
|
|
226
|
-
out.config.showNote = showNote;
|
|
227
|
-
out.config.note = note;
|
|
228
|
-
} else {
|
|
229
|
-
out.config.responses = [];
|
|
230
|
-
out.config.showNote = false;
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
|
|
234
|
-
out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;
|
|
235
|
-
out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;
|
|
236
|
-
} else {
|
|
237
|
-
out.rationale = null;
|
|
238
|
-
out.teacherInstructions = null;
|
|
239
|
-
out.config.rationale = null;
|
|
240
|
-
out.config.teacherInstructions = null;
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
out.config.env = env;
|
|
244
|
-
out.config.prompt = normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null;
|
|
245
|
-
out.language = language;
|
|
246
|
-
log('out: ', out);
|
|
247
|
-
resolve(out);
|
|
248
|
-
});
|
|
249
|
-
|
|
250
|
-
const escape = string => string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
const simpleSessionResponse = question => new Promise(resolve => {
|
|
254
|
-
const {
|
|
255
|
-
responses,
|
|
256
|
-
id
|
|
257
|
-
} = question;
|
|
258
|
-
const {
|
|
259
|
-
answer
|
|
260
|
-
} = responses && responses.length ? responses[0] : {};
|
|
261
|
-
resolve({
|
|
262
|
-
id,
|
|
263
|
-
response: answer || '',
|
|
264
|
-
completeAnswer: answer || ''
|
|
265
|
-
});
|
|
266
|
-
}); // use this for items like E672793
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
const removeTrailingEscape = str => str.endsWith('\\') ? str.slice(0, -1) : str;
|
|
270
|
-
|
|
271
|
-
const advancedSessionResponse = question => new Promise(resolve => {
|
|
272
|
-
const {
|
|
273
|
-
responses,
|
|
274
|
-
id
|
|
275
|
-
} = question;
|
|
276
|
-
const {
|
|
277
|
-
answer
|
|
278
|
-
} = responses && responses.length ? responses[0] : {};
|
|
279
|
-
|
|
280
|
-
if (!answer) {
|
|
281
|
-
resolve({
|
|
282
|
-
id,
|
|
283
|
-
answers: {},
|
|
284
|
-
completeAnswer: ''
|
|
285
|
-
});
|
|
286
|
-
return;
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
try {
|
|
290
|
-
const e = question.expression;
|
|
291
|
-
const RESPONSE_TOKEN = /\\{\\{\s*response\s*\\}\\}/g;
|
|
292
|
-
const o = escape(e).split(RESPONSE_TOKEN);
|
|
293
|
-
const to = o.map(t => t === '' ? t : t.replace(/\s+/g, () => '\\s*'));
|
|
294
|
-
const tt = to.join('(.*)');
|
|
295
|
-
const m = answer.match(new RegExp(tt));
|
|
296
|
-
const count = o.length - 1;
|
|
297
|
-
|
|
298
|
-
if (!m) {
|
|
299
|
-
resolve({
|
|
300
|
-
id,
|
|
301
|
-
answers: {},
|
|
302
|
-
completeAnswer: answer
|
|
303
|
-
}); // eslint-disable-next-line no-console
|
|
304
|
-
|
|
305
|
-
console.log(`can not find match: ${o} in ${answer}`);
|
|
306
|
-
return;
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
m.shift();
|
|
310
|
-
const answers = {};
|
|
311
|
-
|
|
312
|
-
for (var i = 0; i < count; i++) {
|
|
313
|
-
answers[`r${i + 1}`] = {
|
|
314
|
-
value: removeTrailingEscape(m[i].trim())
|
|
315
|
-
};
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
resolve({
|
|
319
|
-
id,
|
|
320
|
-
answers,
|
|
321
|
-
completeAnswer: answer
|
|
322
|
-
});
|
|
323
|
-
} catch (e) {
|
|
324
|
-
resolve({
|
|
325
|
-
id,
|
|
326
|
-
answers: {},
|
|
327
|
-
completeAnswer: answer
|
|
328
|
-
}); // eslint-disable-next-line no-console
|
|
329
|
-
|
|
330
|
-
console.error(e.toString());
|
|
331
|
-
}
|
|
332
|
-
});
|
|
333
|
-
|
|
334
|
-
const createCorrectResponseSession = (question, env) => {
|
|
335
|
-
if (env.mode === 'evaluate' || env.role !== 'instructor') {
|
|
336
|
-
// eslint-disable-next-line no-console
|
|
337
|
-
console.error('can not create correct response session if mode is evaluate or role is not instructor');
|
|
338
|
-
return Promise.resolve(null);
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
if ((question.responseType || '').toLowerCase() === 'simple') {
|
|
342
|
-
return simpleSessionResponse(question);
|
|
343
|
-
} else {
|
|
344
|
-
return advancedSessionResponse(question);
|
|
345
|
-
}
|
|
346
|
-
}; // remove all html tags
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
const getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
|
|
350
|
-
|
|
351
|
-
const validate = (model = {}, config = {}) => {
|
|
352
|
-
const {
|
|
353
|
-
expression = '',
|
|
354
|
-
responses,
|
|
355
|
-
responseType
|
|
356
|
-
} = model;
|
|
357
|
-
const {
|
|
358
|
-
maxResponseAreas
|
|
359
|
-
} = config;
|
|
360
|
-
const responsesErrors = {};
|
|
361
|
-
const errors = {};
|
|
362
|
-
['teacherInstructions', 'prompt', 'rationale'].forEach(field => {
|
|
363
|
-
var _config$field;
|
|
364
|
-
|
|
365
|
-
if ((_config$field = config[field]) != null && _config$field.required && !getContent(model[field])) {
|
|
366
|
-
errors[field] = 'This field is required.';
|
|
367
|
-
}
|
|
368
|
-
});
|
|
369
|
-
(responses || []).forEach((response, index) => {
|
|
370
|
-
const {
|
|
371
|
-
answer
|
|
372
|
-
} = response;
|
|
373
|
-
const reversedAlternates = [...Object.entries(response.alternates || {})].reverse();
|
|
374
|
-
const alternatesErrors = {};
|
|
375
|
-
const responseError = {};
|
|
376
|
-
|
|
377
|
-
if (answer === '') {
|
|
378
|
-
responseError.answer = 'Content should not be empty.';
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
reversedAlternates.forEach(([key, value], index) => {
|
|
382
|
-
if (value === '') {
|
|
383
|
-
alternatesErrors[key] = 'Content should not be empty.';
|
|
384
|
-
} else {
|
|
385
|
-
const identicalAnswer = answer === value || reversedAlternates.slice(index + 1).some(([, val]) => val === value);
|
|
386
|
-
|
|
387
|
-
if (identicalAnswer) {
|
|
388
|
-
alternatesErrors[key] = 'Content should be unique.';
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
});
|
|
392
|
-
|
|
393
|
-
if (!isEmpty(responseError) || !isEmpty(alternatesErrors)) {
|
|
394
|
-
responsesErrors[index] = _extends({}, responseError, alternatesErrors);
|
|
395
|
-
}
|
|
396
|
-
});
|
|
397
|
-
|
|
398
|
-
if (responseType === 'Advanced Multi') {
|
|
399
|
-
const nbOfResponseAreas = (expression.match(/\{\{response\}\}/g) || []).length;
|
|
400
|
-
|
|
401
|
-
if (nbOfResponseAreas > maxResponseAreas) {
|
|
402
|
-
errors.responseAreasError = `No more than ${maxResponseAreas} response areas should be defined.`;
|
|
403
|
-
} else if (nbOfResponseAreas < 1) {
|
|
404
|
-
errors.responseAreasError = 'There should be at least 1 response area defined.';
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
if (!isEmpty(responsesErrors)) {
|
|
409
|
-
errors.responsesErrors = responsesErrors;
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
return errors;
|
|
413
|
-
};
|
|
414
|
-
|
|
415
|
-
export { createCorrectResponseSession, createDefaultModel, model, normalize, outcome, validate };
|
|
416
|
-
//# sourceMappingURL=controller.js.map
|
package/esm/controller.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"controller.js","sources":["../controller/src/utils.js","../controller/src/defaults.js","../controller/src/index.js"],"sourcesContent":["export const ResponseTypes = {\n advanced: 'Advanced Multi',\n simple: 'Simple',\n};\n","import { ResponseTypes } from './utils';\n\nexport default {\n allowTrailingZerosDefault: false,\n customKeys: [],\n equationEditor: '8',\n expression: '',\n feedback: {\n correct: { default: 'Correct', type: 'none' },\n incorrect: { default: 'Incorrect', type: 'none' },\n partial: { default: 'Nearly', type: 'none' },\n },\n feedbackEnabled: false,\n ignoreOrderDefault: false,\n partialScoring: true,\n prompt: '',\n promptEnabled: true,\n rationale: '',\n rationaleEnabled: true,\n responseType: ResponseTypes.advanced,\n responses: [],\n scoringType: 'auto',\n studentInstructionsEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n validationDefault: 'literal',\n};\n","import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport { getActualFeedbackForCorrectness } from '@pie-lib/feedback';\n\nimport { ResponseTypes } from './utils';\nimport Translator from '@pie-lib/translator';\n\nconst { translator } = Translator;\nimport defaults from './defaults';\n\nimport * as mv from '@pie-framework/math-validation';\n\nconst log = debug('@pie-element:math-inline:controller');\n\nconst getResponseCorrectness = (model, answerItem, isOutcome) => {\n const correctResponses = model.responses;\n const isAdvanced = model.responseType === ResponseTypes.advanced;\n\n if (!answerItem) {\n return {\n correctness: 'unanswered',\n score: isOutcome ? 0 : '0%',\n correct: false,\n };\n }\n\n const isAnswerCorrect = getIsAnswerCorrect(isAdvanced ? correctResponses : correctResponses.slice(0, 1), answerItem);\n\n const correctnessObject = {\n correctness: 'incorrect',\n score: isOutcome ? 0 : '0%',\n correct: false,\n };\n\n if (isAnswerCorrect) {\n correctnessObject.correctness = 'correct';\n correctnessObject.score = isOutcome ? 1 : '100%';\n correctnessObject.correct = true;\n }\n\n return correctnessObject;\n};\n\nfunction getIsAnswerCorrect(correctResponseItems, answerItem) {\n let answerCorrect = false;\n\n (correctResponseItems || []).forEach((correctResponse) => {\n if (answerCorrect) return;\n\n const opts = {\n mode: correctResponse.validation || defaults.validationDefault,\n };\n\n if (opts.mode === 'literal') {\n opts.literal = {\n allowTrailingZeros: correctResponse.allowTrailingZeros || false,\n ignoreOrder: correctResponse.ignoreOrder || false,\n };\n }\n\n const acceptedValues = [correctResponse.answer].concat(\n Object.keys(correctResponse.alternates || {}).map((alternateId) => correctResponse.alternates[alternateId]),\n );\n\n for (let i = 0; i < acceptedValues.length; i++) {\n try {\n if (mv.latexEqual(answerItem, acceptedValues[i], opts)) {\n answerCorrect = true;\n break;\n }\n } catch (e) {\n log('Parse failure when evaluating math', acceptedValues[i], answerItem, e);\n continue;\n }\n }\n });\n\n return answerCorrect;\n}\n\nconst getCorrectness = (question, env, session, isOutcome) => {\n if (env.mode === 'evaluate') {\n return getResponseCorrectness(\n question,\n question.responseType === ResponseTypes.advanced\n ? (session && session.completeAnswer) || ''\n : session && session.response,\n isOutcome,\n );\n }\n\n return undefined;\n};\n\nexport function createDefaultModel(model = {}) {\n return new Promise((resolve) => {\n resolve({\n config: {\n ...defaults,\n ...model,\n },\n });\n });\n}\n\nexport const outcome = (question, session, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate') {\n resolve({ score: undefined, completed: undefined });\n } else {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n } else {\n const correctness = getCorrectness(question, env, session, true);\n\n resolve({ score: correctness.score });\n }\n }\n });\n};\n\nexport const normalize = (question) => {\n // making sure that defaults are set\n if (!isEmpty(question.responses)) {\n question.responses = question.responses.map((correctResponse) => ({\n ...correctResponse,\n validation: correctResponse.validation || question.validationDefault,\n allowTrailingZeros: correctResponse.allowTrailingZeros || question.allowTrailingZerosDefault,\n ignoreOrder: correctResponse.ignoreOrder || question.ignoreOrderDefault,\n }));\n }\n\n return { ...defaults, ...question };\n};\n\nexport const model = (question, session, env) =>\n new Promise((resolve) => {\n const normalizedQuestion = normalize(question);\n const correctness = getCorrectness(normalizedQuestion, env, session);\n const { extraCSSRules, responses, language, ...config } = normalizedQuestion;\n\n config.responses = config.responseType === ResponseTypes.simple ? responses.slice(0, 1) : responses;\n\n const feedback =\n env.mode === 'evaluate' && normalizedQuestion.feedbackEnabled\n ? getActualFeedbackForCorrectness(correctness?.correctness, normalizedQuestion.feedback)\n : undefined;\n\n const out = {\n extraCSSRules,\n config,\n correctness,\n feedback,\n disabled: env.mode !== 'gather',\n view: env.mode === 'view',\n };\n\n const note = normalizedQuestion.note || translator.t('mathInline.primaryCorrectWithAlternates', { lng: language });\n const showNote =\n config?.responses?.length > 1 ||\n (config?.responses || []).some(\n (response) => response.validation === 'symbolic' || Object.keys(response.alternates || {}).length > 0,\n );\n\n if (env.mode === 'evaluate') {\n out.correctResponse = {};\n out.config.showNote = showNote;\n out.config.note = note;\n } else {\n out.config.responses = [];\n out.config.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 out.config.rationale = null;\n out.config.teacherInstructions = null;\n }\n\n out.config.env = env;\n out.config.prompt = normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null;\n out.language = language;\n\n log('out: ', out);\n resolve(out);\n });\n\nconst escape = (string) => string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n\nconst simpleSessionResponse = (question) =>\n new Promise((resolve) => {\n const { responses, id } = question;\n const { answer } = responses && responses.length ? responses[0] : {};\n\n resolve({\n id,\n response: answer || '',\n completeAnswer: answer || '',\n });\n });\n\n// use this for items like E672793\nconst removeTrailingEscape = (str) => (str.endsWith('\\\\') ? str.slice(0, -1) : str);\n\nconst advancedSessionResponse = (question) =>\n new Promise((resolve) => {\n const { responses, id } = question;\n const { answer } = responses && responses.length ? responses[0] : {};\n\n if (!answer) {\n resolve({\n id,\n answers: {},\n completeAnswer: '',\n });\n\n return;\n }\n\n try {\n const e = question.expression;\n const RESPONSE_TOKEN = /\\\\{\\\\{\\s*response\\s*\\\\}\\\\}/g;\n\n const o = escape(e).split(RESPONSE_TOKEN);\n const to = o.map((t) => (t === '' ? t : t.replace(/\\s+/g, () => '\\\\s*')));\n const tt = to.join('(.*)');\n\n const m = answer.match(new RegExp(tt));\n\n const count = o.length - 1;\n\n if (!m) {\n resolve({\n id,\n answers: {},\n completeAnswer: answer,\n });\n\n // eslint-disable-next-line no-console\n console.log(`can not find match: ${o} in ${answer}`);\n\n return;\n }\n\n m.shift();\n\n const answers = {};\n\n for (var i = 0; i < count; i++) {\n answers[`r${i + 1}`] = { value: removeTrailingEscape(m[i].trim()) };\n }\n\n resolve({\n id,\n answers,\n completeAnswer: answer,\n });\n } catch (e) {\n resolve({\n id,\n answers: {},\n completeAnswer: answer,\n });\n // eslint-disable-next-line no-console\n console.error(e.toString());\n }\n });\n\nexport const createCorrectResponseSession = (question, env) => {\n if (env.mode === 'evaluate' || env.role !== 'instructor') {\n // eslint-disable-next-line no-console\n console.error('can not create correct response session if mode is evaluate or role is not instructor');\n\n return Promise.resolve(null);\n }\n\n if ((question.responseType || '').toLowerCase() === 'simple') {\n return simpleSessionResponse(question, env);\n } else {\n return advancedSessionResponse(question, env);\n }\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { expression = '', responses, responseType } = 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 (responses || []).forEach((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 if (responseType === 'Advanced Multi') {\n const nbOfResponseAreas = (expression.match(/\\{\\{response\\}\\}/g) || []).length;\n\n if (nbOfResponseAreas > maxResponseAreas) {\n errors.responseAreasError = `No more than ${maxResponseAreas} response areas should be defined.`;\n } else if (nbOfResponseAreas < 1) {\n errors.responseAreasError = 'There should be at least 1 response area defined.';\n }\n }\n\n if (!isEmpty(responsesErrors)) {\n errors.responsesErrors = responsesErrors;\n }\n\n return errors;\n};\n"],"names":["ResponseTypes","advanced","simple","allowTrailingZerosDefault","customKeys","equationEditor","expression","feedback","correct","default","type","incorrect","partial","feedbackEnabled","ignoreOrderDefault","partialScoring","prompt","promptEnabled","rationale","rationaleEnabled","responseType","responses","scoringType","studentInstructionsEnabled","teacherInstructions","teacherInstructionsEnabled","toolbarEditorPosition","validationDefault","translator","Translator","log","debug","getResponseCorrectness","model","answerItem","isOutcome","correctResponses","isAdvanced","correctness","score","isAnswerCorrect","getIsAnswerCorrect","slice","correctnessObject","correctResponseItems","answerCorrect","forEach","correctResponse","opts","mode","validation","defaults","literal","allowTrailingZeros","ignoreOrder","acceptedValues","answer","concat","Object","keys","alternates","map","alternateId","i","length","mv","latexEqual","e","getCorrectness","question","env","session","completeAnswer","response","undefined","createDefaultModel","Promise","resolve","config","outcome","completed","isEmpty","empty","normalize","normalizedQuestion","extraCSSRules","language","getActualFeedbackForCorrectness","out","disabled","view","note","t","lng","showNote","some","role","escape","string","replace","simpleSessionResponse","id","removeTrailingEscape","str","endsWith","advancedSessionResponse","answers","RESPONSE_TOKEN","o","split","to","tt","join","m","match","RegExp","count","console","shift","value","trim","error","toString","createCorrectResponseSession","toLowerCase","getContent","html","validate","maxResponseAreas","responsesErrors","errors","field","required","index","reversedAlternates","entries","reverse","alternatesErrors","responseError","key","identicalAnswer","val","nbOfResponseAreas","responseAreasError"],"mappings":"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"}
|