@pie-element/math-templated 5.0.1 → 5.0.2-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/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 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
- }
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
- 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
- }
19
+ return target;
20
+ };
44
21
 
45
- return obj;
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
- var {
47
+ const {
71
48
  translator
72
49
  } = Translator;
73
- var log = debug('@pie-element:math-templated:controller');
50
+ const log = debug('@pie-element:math-templated:controller');
74
51
 
75
- var getFeedback = value => value ? 'correct' : 'incorrect';
52
+ const getFeedback = value => value ? 'correct' : 'incorrect';
76
53
 
77
- var getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
54
+ const getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
78
55
 
79
- var getIsAnswerCorrect = (correctResponse, answerItem) => {
80
- var answerCorrect = false;
56
+ const getIsAnswerCorrect = (correctResponse, answerItem) => {
57
+ let answerCorrect = false;
81
58
 
82
- var opts = _objectSpread2({
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
- var acceptedValues = [correctResponse.answer, ...Object.values(correctResponse.alternates || {})];
69
+ const acceptedValues = [correctResponse.answer, ...Object.values(correctResponse.alternates || {})];
93
70
 
94
71
  try {
95
- for (var value of acceptedValues) {
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
- var getResponseCorrectness = (question, sessionResponse) => {
109
- var correctResponses = question.responses;
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
- var correctAnswers = 0;
119
- var score = 0;
120
- var correctResponsesCount = Object.keys(correctResponses || {}).length;
95
+ let correctAnswers = 0;
96
+ let score = 0;
97
+ const correctResponsesCount = Object.keys(correctResponses || {}).length;
121
98
  Object.keys(correctResponses).forEach(responseId => {
122
- var answerItem = sessionResponse['r' + responseId];
123
- var correctResponse = correctResponses[responseId] || {};
124
- var answerCorrect = getIsAnswerCorrect(correctResponse, answerItem);
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
- var fullyCorrect = correctAnswers === correctResponsesCount; // partial credit scoring: each correct answer is worth 1 / total answers point
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
- var getCorrectness = (question, env, session) => {
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
- var getPartialScore = (question, session) => {
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
- var outcome = (question, session, env) => new Promise(resolve => {
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
- var partialScoringEnabled = partialScoring.enabled(question, env);
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
- var correctness = getCorrectness(question, env, session);
172
- var score = correctness.score;
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
- var createDefaultModel = function createDefaultModel() {
179
- var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
180
- var {
155
+ const createDefaultModel = (model = {}) => {
156
+ const {
181
157
  validationDefault,
182
158
  allowTrailingZerosDefault,
183
159
  ignoreOrderDefault,
184
160
  responses = {}
185
161
  } = model;
186
- var updatedResponses = Object.keys(responses).reduce((acc, responseId) => {
187
- var correctResponse = responses[responseId];
188
- acc[responseId] = _objectSpread2(_objectSpread2({}, correctResponse), {}, {
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 _objectSpread2(_objectSpread2(_objectSpread2({}, defaults.model), model), {}, {
171
+ return _extends({}, defaults.model, model, {
196
172
  responses: updatedResponses
197
173
  });
198
174
  };
199
- var normalizeSession = s => _objectSpread2({}, s);
175
+ const normalizeSession = s => _extends({}, s);
200
176
 
201
- var getTextFromHTML = html => (html || '').replace(/<\/?[^>]+(>|$)/g, '');
177
+ const getTextFromHTML = html => (html || '').replace(/<\/?[^>]+(>|$)/g, '');
202
178
 
203
- var prepareVal = html => getTextFromHTML(html).trim();
204
- var model = (question, session, env) => {
179
+ const prepareVal = html => getTextFromHTML(html).trim();
180
+ const model = (question, session, env) => {
205
181
  return new Promise(resolve => {
206
182
  session = session || {};
207
- var normalizedQuestion = createDefaultModel(question);
208
- var correctness = getCorrectness(normalizedQuestion, env, session);
209
- var {
183
+ const normalizedQuestion = createDefaultModel(question);
184
+ const correctness = getCorrectness(normalizedQuestion, env, session);
185
+ const {
210
186
  responses,
211
187
  language
212
188
  } = normalizedQuestion;
213
- var {
189
+ let {
214
190
  note
215
191
  } = 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
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
- var correctResponse = responses[responseId] || {};
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
- var out = {
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
- var {
223
+ const {
248
224
  answers = {}
249
225
  } = session || {};
250
- var feedback = {};
226
+ let feedback = {};
251
227
 
252
228
  if (env.mode === 'evaluate') {
253
229
  Object.keys(responses).forEach(responseId => {
254
- var answerItem = answers['r' + responseId];
255
- var correctResponse = responses[responseId];
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
- var createCorrectResponseSession = (question, env) => new Promise(resolve => {
258
+ const createCorrectResponseSession = (question, env) => new Promise(resolve => {
283
259
  if (env.mode !== 'evaluate' && env.role === 'instructor') {
284
- var correctResponse = Object.keys(question.responses).reduce((acc, responseId) => {
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
- 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 {
274
+ const validate = (model = {}, config = {}) => {
275
+ const {
302
276
  responses,
303
277
  markup
304
278
  } = model;
305
- var {
279
+ const {
306
280
  maxResponseAreas
307
281
  } = config;
308
- var responsesErrors = {};
309
- var errors = {};
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]) !== null && _config$field !== void 0 && _config$field.required && !getContent(model[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((_ref, index) => {
318
- var [key, response] = _ref;
319
- var {
291
+ Object.entries(responses || {}).forEach(([key, response], index) => {
292
+ const {
320
293
  answer
321
294
  } = response;
322
- var reversedAlternates = [...Object.entries(response.alternates || {})].reverse();
323
- var alternatesErrors = {};
324
- var responseError = {};
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((_ref2, index) => {
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
- var identicalAnswer = answer === value || reversedAlternates.slice(index + 1).some(_ref3 => {
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] = _objectSpread2(_objectSpread2({}, responseError), alternatesErrors);
316
+ responsesErrors[index] = _extends({}, responseError, alternatesErrors);
349
317
  }
350
318
  });
351
- var nbOfResponseAreas = (markup.match(/\{\{(\d+)\}\}/g) || []).length;
319
+ const nbOfResponseAreas = (markup.match(/\{\{(\d+)\}\}/g) || []).length;
352
320
 
353
321
  if (nbOfResponseAreas > maxResponseAreas) {
354
- errors.responseAreas = "No more than ".concat(maxResponseAreas, " response areas should be defined.");
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
  }
@@ -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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"}