@pie-element/math-templated 7.1.1-next.12 → 7.1.2

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.
Files changed (98) hide show
  1. package/CHANGELOG.json +1 -0
  2. package/CHANGELOG.md +1144 -0
  3. package/LICENSE.md +5 -0
  4. package/README.md +0 -0
  5. package/configure/CHANGELOG.json +1 -0
  6. package/configure/CHANGELOG.md +1021 -0
  7. package/configure/lib/defaults.js +172 -0
  8. package/configure/lib/defaults.js.map +1 -0
  9. package/configure/lib/design.js +546 -0
  10. package/configure/lib/design.js.map +1 -0
  11. package/configure/lib/index.js +169 -0
  12. package/configure/lib/index.js.map +1 -0
  13. package/configure/lib/markupUtils.js +39 -0
  14. package/configure/lib/markupUtils.js.map +1 -0
  15. package/configure/lib/response.js +394 -0
  16. package/configure/lib/response.js.map +1 -0
  17. package/configure/lib/utils.js +15 -0
  18. package/configure/lib/utils.js.map +1 -0
  19. package/configure/package.json +26 -0
  20. package/controller/CHANGELOG.json +1 -0
  21. package/controller/CHANGELOG.md +874 -0
  22. package/controller/lib/defaults.js +28 -0
  23. package/controller/lib/defaults.js.map +1 -0
  24. package/controller/lib/index.js +360 -0
  25. package/controller/lib/index.js.map +1 -0
  26. package/controller/package.json +17 -0
  27. package/docs/config-schema.json +2251 -0
  28. package/docs/config-schema.json.md +1658 -0
  29. package/docs/demo/config.js +8 -0
  30. package/docs/demo/generate.js +42 -0
  31. package/docs/demo/index.html +1 -0
  32. package/docs/demo/session.js +14 -0
  33. package/docs/pie-schema.json +1231 -0
  34. package/docs/pie-schema.json.md +894 -0
  35. package/lib/index.js +76 -0
  36. package/lib/index.js.map +1 -0
  37. package/lib/main.js +877 -0
  38. package/lib/main.js.map +1 -0
  39. package/lib/print.js +88 -0
  40. package/lib/print.js.map +1 -0
  41. package/module/configure.js +1 -0
  42. package/module/controller.js +3711 -0
  43. package/module/demo.js +67 -0
  44. package/module/element.js +1 -0
  45. package/module/index.html +21 -0
  46. package/module/manifest.json +22 -0
  47. package/module/print-demo.js +105 -0
  48. package/module/print.html +18 -0
  49. package/module/print.js +1 -0
  50. package/package.json +22 -93
  51. package/configure.js +0 -2
  52. package/controller.js +0 -1
  53. package/dist/author/defaults.d.ts +0 -173
  54. package/dist/author/defaults.js +0 -123
  55. package/dist/author/design.d.ts +0 -35
  56. package/dist/author/design.js +0 -360
  57. package/dist/author/index.d.ts +0 -42
  58. package/dist/author/index.js +0 -97
  59. package/dist/author/markupUtils.d.ts +0 -11
  60. package/dist/author/markupUtils.js +0 -10
  61. package/dist/author/response.d.ts +0 -41
  62. package/dist/author/response.js +0 -238
  63. package/dist/author/utils.d.ts +0 -9
  64. package/dist/author/utils.js +0 -7
  65. package/dist/browser/author/index.js +0 -31954
  66. package/dist/browser/author/index.js.map +0 -1
  67. package/dist/browser/browser-DJA4OL8j.js +0 -331
  68. package/dist/browser/browser-DJA4OL8j.js.map +0 -1
  69. package/dist/browser/controller/index.js +0 -37731
  70. package/dist/browser/controller/index.js.map +0 -1
  71. package/dist/browser/delivery/index.js +0 -81
  72. package/dist/browser/delivery/index.js.map +0 -1
  73. package/dist/browser/dist-Csid0rBE.js +0 -17046
  74. package/dist/browser/dist-Csid0rBE.js.map +0 -1
  75. package/dist/browser/dist-D9ARZhQk.js +0 -1426
  76. package/dist/browser/dist-D9ARZhQk.js.map +0 -1
  77. package/dist/browser/main-I_wWeaur.js +0 -1274
  78. package/dist/browser/main-I_wWeaur.js.map +0 -1
  79. package/dist/browser/math-templated.css +0 -2
  80. package/dist/browser/print/index.js +0 -47
  81. package/dist/browser/print/index.js.map +0 -1
  82. package/dist/controller/defaults.d.ts +0 -29
  83. package/dist/controller/defaults.js +0 -23
  84. package/dist/controller/index.d.ts +0 -45
  85. package/dist/controller/index.js +0 -154
  86. package/dist/delivery/index.d.ts +0 -20
  87. package/dist/delivery/index.js +0 -51
  88. package/dist/delivery/main.d.ts +0 -40
  89. package/dist/delivery/main.js +0 -492
  90. package/dist/index.d.ts +0 -1
  91. package/dist/index.iife.d.ts +0 -8
  92. package/dist/index.iife.js +0 -205
  93. package/dist/index.js +0 -2
  94. package/dist/math-templated.css +0 -2
  95. package/dist/print/index.d.ts +0 -15
  96. package/dist/print/index.js +0 -47
  97. package/dist/runtime-support.d.ts +0 -12
  98. package/dist/runtime-support.js +0 -12
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ // Should be exactly the same as configure/defaults.js
8
+ var _default = exports.default = {
9
+ model: {
10
+ allowTrailingZerosDefault: false,
11
+ equationEditor: '8',
12
+ ignoreOrderDefault: false,
13
+ markup: '',
14
+ playerSpellCheckEnabled: true,
15
+ prompt: '',
16
+ promptEnabled: true,
17
+ rationale: '',
18
+ rationaleEnabled: true,
19
+ responses: {},
20
+ spellCheckEnabled: true,
21
+ teacherInstructions: '',
22
+ teacherInstructionsEnabled: true,
23
+ toolbarEditorPosition: 'bottom',
24
+ validationDefault: 'literal'
25
+ },
26
+ configuration: {}
27
+ };
28
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","names":["_default","exports","default","model","allowTrailingZerosDefault","equationEditor","ignoreOrderDefault","markup","playerSpellCheckEnabled","prompt","promptEnabled","rationale","rationaleEnabled","responses","spellCheckEnabled","teacherInstructions","teacherInstructionsEnabled","toolbarEditorPosition","validationDefault","configuration"],"sources":["../src/defaults.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"],"mappings":";;;;;;AAAA;AAAA,IAAAA,QAAA,GAAAC,OAAA,CAAAC,OAAA,GACe;EACbC,KAAK,EAAE;IACLC,yBAAyB,EAAE,KAAK;IAChCC,cAAc,EAAE,GAAG;IACnBC,kBAAkB,EAAE,KAAK;IACzBC,MAAM,EAAE,EAAE;IACVC,uBAAuB,EAAE,IAAI;IAC7BC,MAAM,EAAE,EAAE;IACVC,aAAa,EAAE,IAAI;IACnBC,SAAS,EAAE,EAAE;IACbC,gBAAgB,EAAE,IAAI;IACtBC,SAAS,EAAE,CAAC,CAAC;IACbC,iBAAiB,EAAE,IAAI;IACvBC,mBAAmB,EAAE,EAAE;IACvBC,0BAA0B,EAAE,IAAI;IAChCC,qBAAqB,EAAE,QAAQ;IAC/BC,iBAAiB,EAAE;EACrB,CAAC;EACDC,aAAa,EAAE,CAAC;AAClB,CAAC","ignoreList":[]}
@@ -0,0 +1,360 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.validate = exports.prepareVal = exports.outcome = exports.normalizeSession = exports.model = exports.getPartialScore = exports.getLogTrace = exports.getCorrectness = exports.createDefaultModel = exports.createCorrectResponseSession = void 0;
8
+ var _debug = _interopRequireDefault(require("debug"));
9
+ var _lodashEs = require("lodash-es");
10
+ var _translator = _interopRequireDefault(require("@pie-lib/translator"));
11
+ var mv = _interopRequireWildcard(require("@pie-framework/math-validation"));
12
+ var _defaults = _interopRequireDefault(require("./defaults"));
13
+ var _controllerUtils = require("@pie-lib/controller-utils");
14
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
15
+ const {
16
+ translator
17
+ } = _translator.default;
18
+ const log = (0, _debug.default)('@pie-element:math-templated:controller');
19
+ const getFeedback = value => value ? 'correct' : 'incorrect';
20
+ const getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
21
+ const getIsAnswerCorrect = (correctResponse, answerItem) => {
22
+ let answerCorrect = false;
23
+ const opts = {
24
+ mode: correctResponse.validation || _defaults.default.validationDefault,
25
+ ...(correctResponse.validation === 'literal' && {
26
+ literal: {
27
+ allowTrailingZeros: correctResponse.allowTrailingZeros || false,
28
+ ignoreOrder: correctResponse.ignoreOrder || false
29
+ }
30
+ })
31
+ };
32
+ if (!answerCorrect) {
33
+ const acceptedValues = [correctResponse.answer, ...Object.values(correctResponse.alternates || {})];
34
+ try {
35
+ for (const value of acceptedValues) {
36
+ answerCorrect = mv.latexEqual(answerItem.value, value, opts);
37
+ if (answerCorrect) break;
38
+ }
39
+ } catch (e) {
40
+ log('Parse failure when evaluating math', e, correctResponse, answerItem);
41
+ answerCorrect = false;
42
+ }
43
+ }
44
+ return answerCorrect;
45
+ };
46
+ const getResponseCorrectness = (question, sessionResponse) => {
47
+ const correctResponses = question.responses;
48
+ if (!sessionResponse) {
49
+ return {
50
+ correctness: 'unanswered',
51
+ score: 0,
52
+ correct: false
53
+ };
54
+ } else {
55
+ let correctAnswers = 0;
56
+ let score = 0;
57
+ const correctResponsesCount = Object.keys(correctResponses || {}).length;
58
+ Object.keys(correctResponses).forEach(responseId => {
59
+ const answerItem = sessionResponse['r' + responseId];
60
+ const correctResponse = correctResponses[responseId] || {};
61
+ const answerCorrect = getIsAnswerCorrect(correctResponse, answerItem);
62
+ if (answerCorrect) {
63
+ correctAnswers++;
64
+ }
65
+ });
66
+ const fullyCorrect = correctAnswers === correctResponsesCount;
67
+
68
+ // partial credit scoring: each correct answer is worth 1 / total answers point
69
+ // dichotomous scoring: for credit to be awarded, a correct answer must be entered for every response area
70
+ score = Number((correctAnswers / Object.keys(correctResponses).length).toFixed(2));
71
+ return {
72
+ correctness: getFeedback(fullyCorrect),
73
+ score: correctAnswers > 0 ? score : 0,
74
+ correct: fullyCorrect
75
+ };
76
+ }
77
+ };
78
+ const getCorrectness = (question, env, session) => {
79
+ if (env.mode === 'evaluate') {
80
+ return getResponseCorrectness(question, session && session.answers);
81
+ }
82
+ };
83
+ exports.getCorrectness = getCorrectness;
84
+ const getPartialScore = (question, session) => {
85
+ if (!session || (0, _lodashEs.isEmpty)(session)) {
86
+ return 0;
87
+ }
88
+ return 1;
89
+ };
90
+
91
+ /**
92
+ * Generates detailed trace log for math-templated scoring evaluation
93
+ * @param {Object} question
94
+ * @param {Object} session
95
+ * @param {Object} env
96
+ * @returns {Array<string>} traceLog
97
+ */
98
+ exports.getPartialScore = getPartialScore;
99
+ const getLogTrace = (question, session, env) => {
100
+ const traceLog = [];
101
+ if (!session || !session.answers || Object.keys(session.answers).length === 0) {
102
+ traceLog.push('Student did not enter a response.');
103
+ return traceLog;
104
+ }
105
+ const answers = session.answers;
106
+ const responseIds = Object.keys(question.responses || {});
107
+ const totalAreas = responseIds.length;
108
+ traceLog.push(`${totalAreas} response area(s) defined in this question.`);
109
+ let answeredCount = 0;
110
+ let correctCount = 0;
111
+ responseIds.forEach((responseId, index) => {
112
+ const answerItem = answers[`r${responseId}`];
113
+ const studentValue = answerItem?.value?.trim();
114
+ const correctResponse = question.responses[responseId] || {};
115
+ const cleanStudentAnswer = studentValue ? studentValue.replace(/\\/g, '') : '';
116
+ if (studentValue) {
117
+ answeredCount++;
118
+ traceLog.push(`Response area ${index + 1}: student entered ${cleanStudentAnswer}.`);
119
+ } else {
120
+ traceLog.push(`Response area ${index + 1}: no response entered.`);
121
+ }
122
+ const validation = correctResponse.validation || question.validationDefault;
123
+ traceLog.push(`Validation mode: ${validation}.`);
124
+ if (validation === 'literal') {
125
+ const allowTrailingZeros = correctResponse.allowTrailingZeros || false;
126
+ const ignoreOrder = correctResponse.ignoreOrder || false;
127
+ traceLog.push(`Allow trailing zeros: ${allowTrailingZeros ? 'enabled' : 'disabled'}.`);
128
+ traceLog.push(`Ignore order: ${ignoreOrder ? 'enabled' : 'disabled'}.`);
129
+ }
130
+ const acceptedValues = [correctResponse.answer].concat(Object.values(correctResponse.alternates || {}));
131
+ if (acceptedValues.length > 1) {
132
+ traceLog.push(`Accepted answers: ${acceptedValues.length} (including alternates).`);
133
+ }
134
+ if (studentValue) {
135
+ const isCorrect = getIsAnswerCorrect(correctResponse, answerItem);
136
+ if (isCorrect) {
137
+ correctCount++;
138
+ traceLog.push(`Response area ${index + 1} is correct.`);
139
+ } else {
140
+ traceLog.push(`Response area ${index + 1} is incorrect.`);
141
+ }
142
+ }
143
+ });
144
+ traceLog.push(`${correctCount} out of ${totalAreas} response area(s) are correct.`);
145
+ const partialScoringEnabled = _controllerUtils.partialScoring.enabled(question, env);
146
+ traceLog.push(`Scoring method: ${partialScoringEnabled ? 'partial scoring' : 'all-or-nothing scoring'}.`);
147
+ if (partialScoringEnabled) {
148
+ traceLog.push('Each correct response area contributes to the score.');
149
+ } else {
150
+ traceLog.push('Student must answer all response areas correctly to receive full credit.');
151
+ }
152
+ const correctness = getCorrectness(question, env, session);
153
+ traceLog.push(`Overall correctness: ${correctness.correctness}.`);
154
+ traceLog.push(`Final score: ${correctness.score}.`);
155
+ return traceLog;
156
+ };
157
+ exports.getLogTrace = getLogTrace;
158
+ const outcome = (question, session, env) => new Promise(resolve => {
159
+ if (!session || (0, _lodashEs.isEmpty)(session)) {
160
+ resolve({
161
+ score: 0,
162
+ empty: true,
163
+ logTrace: ['Student did not enter a response.']
164
+ });
165
+ return;
166
+ }
167
+ const partialScoringEnabled = _controllerUtils.partialScoring.enabled(question, env);
168
+ session = normalizeSession(session);
169
+ if (env.mode !== 'evaluate') {
170
+ resolve({
171
+ score: undefined,
172
+ completed: undefined,
173
+ logTrace: []
174
+ });
175
+ } else {
176
+ const correctness = getCorrectness(question, env, session, true);
177
+ const score = correctness.score;
178
+ resolve({
179
+ score: partialScoringEnabled ? score : score === 1 ? 1 : 0,
180
+ logTrace: getLogTrace(question, session, env)
181
+ });
182
+ }
183
+ });
184
+ exports.outcome = outcome;
185
+ const createDefaultModel = (model = {}) => {
186
+ const {
187
+ validationDefault,
188
+ allowTrailingZerosDefault,
189
+ ignoreOrderDefault,
190
+ responses = {}
191
+ } = model;
192
+ const updatedResponses = Object.keys(responses).reduce((acc, responseId) => {
193
+ const correctResponse = responses[responseId];
194
+ acc[responseId] = {
195
+ ...correctResponse,
196
+ validation: correctResponse.validation || validationDefault,
197
+ allowTrailingZeros: correctResponse.allowTrailingZeros || allowTrailingZerosDefault,
198
+ ignoreOrder: correctResponse.ignoreOrder || ignoreOrderDefault
199
+ };
200
+ return acc;
201
+ }, {});
202
+ return {
203
+ ..._defaults.default.model,
204
+ ...model,
205
+ responses: updatedResponses
206
+ };
207
+ };
208
+ exports.createDefaultModel = createDefaultModel;
209
+ const normalizeSession = s => ({
210
+ ...s
211
+ });
212
+ exports.normalizeSession = normalizeSession;
213
+ const getTextFromHTML = html => (html || '').replace(/<\/?[^>]+(>|$)/g, '');
214
+ const prepareVal = html => getTextFromHTML(html).trim();
215
+ exports.prepareVal = prepareVal;
216
+ const model = (question, session, env) => {
217
+ return new Promise(resolve => {
218
+ session = session || {};
219
+ const normalizedQuestion = createDefaultModel(question);
220
+ const correctness = getCorrectness(normalizedQuestion, env, session);
221
+ const {
222
+ responses,
223
+ language
224
+ } = normalizedQuestion;
225
+ let {
226
+ note
227
+ } = normalizedQuestion;
228
+ let showNote = false;
229
+
230
+ // check if there is at least one alternate response or if the validation for at least one response is not literal
231
+ Object.keys(responses).forEach(responseId => {
232
+ const correctResponse = responses[responseId] || {};
233
+ if (correctResponse.alternates && Object.keys(correctResponse.alternates).length > 0) {
234
+ showNote = true;
235
+ } else if (correctResponse.validation !== 'literal') {
236
+ showNote = true;
237
+ }
238
+ });
239
+ if (!note) {
240
+ note = translator.t('mathInline.primaryCorrectWithAlternates', {
241
+ lng: language
242
+ });
243
+ }
244
+ const out = {
245
+ prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,
246
+ markup: normalizedQuestion.markup,
247
+ responses: env.mode === 'gather' ? null : normalizedQuestion.responses,
248
+ language: normalizedQuestion.language,
249
+ equationEditor: normalizedQuestion.equationEditor,
250
+ customKeys: normalizedQuestion.customKeys,
251
+ disabled: env.mode !== 'gather',
252
+ view: env.mode === 'view',
253
+ correctness,
254
+ env,
255
+ extraCSSRules: normalizedQuestion.extraCSSRules
256
+ };
257
+ const {
258
+ answers = {}
259
+ } = session || {};
260
+ let feedback = {};
261
+ if (env.mode === 'evaluate') {
262
+ Object.keys(responses).forEach(responseId => {
263
+ const answerItem = answers['r' + responseId];
264
+ const correctResponse = responses[responseId];
265
+ feedback[responseId] = getIsAnswerCorrect(correctResponse, answerItem);
266
+ });
267
+ }
268
+ if (env.mode === 'evaluate') {
269
+ out.correctResponse = {};
270
+ out.showNote = showNote;
271
+ out.note = note;
272
+ out.feedback = feedback;
273
+ } else {
274
+ out.responses = {};
275
+ out.showNote = false;
276
+ }
277
+ if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
278
+ out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;
279
+ out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;
280
+ } else {
281
+ out.rationale = null;
282
+ out.teacherInstructions = null;
283
+ }
284
+ log('out: ', out);
285
+ resolve(out);
286
+ });
287
+ };
288
+ exports.model = model;
289
+ const createCorrectResponseSession = (question, env) => new Promise(resolve => {
290
+ if (env.mode !== 'evaluate' && env.role === 'instructor') {
291
+ const correctResponse = Object.keys(question.responses).reduce((acc, responseId) => {
292
+ acc['r' + responseId] = {
293
+ value: question.responses[responseId].answer
294
+ };
295
+ return acc;
296
+ }, {});
297
+ resolve({
298
+ id: '1',
299
+ answers: correctResponse
300
+ });
301
+ } else {
302
+ resolve(null);
303
+ }
304
+ });
305
+ exports.createCorrectResponseSession = createCorrectResponseSession;
306
+ const validate = (model = {}, config = {}) => {
307
+ const {
308
+ responses,
309
+ markup
310
+ } = model;
311
+ const {
312
+ maxResponseAreas
313
+ } = config;
314
+ const responsesErrors = {};
315
+ const errors = {};
316
+ ['teacherInstructions', 'prompt', 'rationale'].forEach(field => {
317
+ if (config[field]?.required && !getContent(model[field])) {
318
+ errors[field] = 'This field is required.';
319
+ }
320
+ });
321
+ Object.entries(responses || {}).forEach(([key, response], index) => {
322
+ const {
323
+ answer
324
+ } = response;
325
+ const reversedAlternates = [...Object.entries(response.alternates || {})].reverse();
326
+ const alternatesErrors = {};
327
+ const responseError = {};
328
+ if (answer === '') {
329
+ responseError.answer = 'Content should not be empty.';
330
+ }
331
+ reversedAlternates.forEach(([key, value], index) => {
332
+ if (value === '') {
333
+ alternatesErrors[key] = 'Content should not be empty.';
334
+ } else {
335
+ const identicalAnswer = answer === value || reversedAlternates.slice(index + 1).some(([, val]) => val === value);
336
+ if (identicalAnswer) {
337
+ alternatesErrors[key] = 'Content should be unique.';
338
+ }
339
+ }
340
+ });
341
+ if (!(0, _lodashEs.isEmpty)(responseError) || !(0, _lodashEs.isEmpty)(alternatesErrors)) {
342
+ responsesErrors[index] = {
343
+ ...responseError,
344
+ ...alternatesErrors
345
+ };
346
+ }
347
+ });
348
+ const nbOfResponseAreas = (markup.match(/\{\{(\d+)\}\}/g) || []).length;
349
+ if (nbOfResponseAreas > maxResponseAreas) {
350
+ errors.responseAreas = `No more than ${maxResponseAreas} response areas should be defined.`;
351
+ } else if (nbOfResponseAreas < 1) {
352
+ errors.responseAreas = 'There should be at least 1 response area defined.';
353
+ }
354
+ if (!(0, _lodashEs.isEmpty)(responsesErrors)) {
355
+ errors.responses = responsesErrors;
356
+ }
357
+ return errors;
358
+ };
359
+ exports.validate = validate;
360
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["_debug","_interopRequireDefault","require","_lodashEs","_translator","mv","_interopRequireWildcard","_defaults","_controllerUtils","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","translator","Translator","log","debug","getFeedback","value","getContent","html","replace","getIsAnswerCorrect","correctResponse","answerItem","answerCorrect","opts","mode","validation","defaults","validationDefault","literal","allowTrailingZeros","ignoreOrder","acceptedValues","answer","values","alternates","latexEqual","getResponseCorrectness","question","sessionResponse","correctResponses","responses","correctness","score","correct","correctAnswers","correctResponsesCount","keys","length","forEach","responseId","fullyCorrect","Number","toFixed","getCorrectness","env","session","answers","exports","getPartialScore","isEmpty","getLogTrace","traceLog","push","responseIds","totalAreas","answeredCount","correctCount","index","studentValue","trim","cleanStudentAnswer","concat","isCorrect","partialScoringEnabled","partialScoring","enabled","outcome","Promise","resolve","empty","logTrace","normalizeSession","undefined","completed","createDefaultModel","model","allowTrailingZerosDefault","ignoreOrderDefault","updatedResponses","reduce","acc","s","getTextFromHTML","prepareVal","normalizedQuestion","language","note","showNote","lng","out","prompt","promptEnabled","markup","equationEditor","customKeys","disabled","view","extraCSSRules","feedback","role","rationale","rationaleEnabled","teacherInstructions","teacherInstructionsEnabled","createCorrectResponseSession","id","validate","config","maxResponseAreas","responsesErrors","errors","field","required","entries","key","response","reversedAlternates","reverse","alternatesErrors","responseError","identicalAnswer","slice","some","val","nbOfResponseAreas","match","responseAreas"],"sources":["../src/index.js"],"sourcesContent":["import debug from 'debug';\nimport { isEmpty } from 'lodash-es';\nimport Translator from '@pie-lib/translator';\nimport * as mv from '@pie-framework/math-validation';\n\nimport defaults from './defaults';\nimport { partialScoring } from '@pie-lib/controller-utils';\n\nconst { translator } = Translator;\nconst log = debug('@pie-element:math-templated:controller');\n\nconst getFeedback = (value) => (value ? 'correct' : 'incorrect');\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nconst getIsAnswerCorrect = (correctResponse, answerItem) => {\n let answerCorrect = false;\n\n const opts = {\n mode: correctResponse.validation || defaults.validationDefault,\n ...(correctResponse.validation === 'literal' && {\n literal: {\n allowTrailingZeros: correctResponse.allowTrailingZeros || false,\n ignoreOrder: correctResponse.ignoreOrder || false,\n },\n }),\n };\n\n if (!answerCorrect) {\n const acceptedValues = [correctResponse.answer, ...Object.values(correctResponse.alternates || {})];\n\n try {\n for (const value of acceptedValues) {\n answerCorrect = mv.latexEqual(answerItem.value, value, opts);\n if (answerCorrect) break;\n }\n } catch (e) {\n log('Parse failure when evaluating math', e, correctResponse, answerItem);\n answerCorrect = false;\n }\n }\n\n return answerCorrect;\n};\n\nconst getResponseCorrectness = (question, sessionResponse) => {\n const correctResponses = question.responses;\n\n if (!sessionResponse) {\n return {\n correctness: 'unanswered',\n score: 0,\n correct: false,\n };\n } else {\n let correctAnswers = 0;\n let score = 0;\n const correctResponsesCount = Object.keys(correctResponses || {}).length;\n\n Object.keys(correctResponses).forEach((responseId) => {\n const answerItem = sessionResponse['r' + responseId];\n const correctResponse = correctResponses[responseId] || {};\n\n const answerCorrect = getIsAnswerCorrect(correctResponse, answerItem);\n if (answerCorrect) {\n correctAnswers++;\n }\n });\n\n const fullyCorrect = correctAnswers === correctResponsesCount;\n\n // partial credit scoring: each correct answer is worth 1 / total answers point\n // dichotomous scoring: for credit to be awarded, a correct answer must be entered for every response area\n score = Number((correctAnswers / Object.keys(correctResponses).length).toFixed(2));\n\n return {\n correctness: getFeedback(fullyCorrect),\n score: correctAnswers > 0 ? score : 0,\n correct: fullyCorrect,\n };\n }\n};\n\nexport const getCorrectness = (question, env, session) => {\n if (env.mode === 'evaluate') {\n return getResponseCorrectness(question, session && session.answers);\n }\n};\n\nexport const getPartialScore = (question, session) => {\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n return 1;\n};\n\n/**\n * Generates detailed trace log for math-templated scoring evaluation\n * @param {Object} question\n * @param {Object} session\n * @param {Object} env\n * @returns {Array<string>} traceLog\n */\nexport const getLogTrace = (question, session, env) => {\n const traceLog = [];\n\n if (!session || !session.answers || Object.keys(session.answers).length === 0) {\n traceLog.push('Student did not enter a response.');\n return traceLog;\n }\n\n const answers = session.answers;\n const responseIds = Object.keys(question.responses || {});\n const totalAreas = responseIds.length;\n\n traceLog.push(`${totalAreas} response area(s) defined in this question.`);\n\n let answeredCount = 0;\n let correctCount = 0;\n\n responseIds.forEach((responseId, index) => {\n const answerItem = answers[`r${responseId}`];\n const studentValue = answerItem?.value?.trim();\n const correctResponse = question.responses[responseId] || {};\n\n const cleanStudentAnswer = studentValue ? studentValue.replace(/\\\\/g, '') : '';\n\n if (studentValue) {\n answeredCount++;\n traceLog.push(`Response area ${index + 1}: student entered ${cleanStudentAnswer}.`);\n } else {\n traceLog.push(`Response area ${index + 1}: no response entered.`);\n }\n\n const validation = correctResponse.validation || question.validationDefault;\n traceLog.push(`Validation mode: ${validation}.`);\n \n if (validation === 'literal') {\n const allowTrailingZeros = correctResponse.allowTrailingZeros || false;\n const ignoreOrder = correctResponse.ignoreOrder || false;\n \n traceLog.push(`Allow trailing zeros: ${allowTrailingZeros ? 'enabled' : 'disabled'}.`);\n traceLog.push(`Ignore order: ${ignoreOrder ? 'enabled' : 'disabled'}.`);\n }\n \n const acceptedValues = [correctResponse.answer].concat(\n Object.values(correctResponse.alternates || {})\n );\n \n if (acceptedValues.length > 1) {\n traceLog.push(`Accepted answers: ${acceptedValues.length} (including alternates).`);\n }\n\n if (studentValue) {\n const isCorrect = getIsAnswerCorrect(correctResponse, answerItem);\n if (isCorrect) {\n correctCount++;\n traceLog.push(`Response area ${index + 1} is correct.`);\n } else {\n traceLog.push(`Response area ${index + 1} is incorrect.`);\n }\n }\n });\n\n traceLog.push(`${correctCount} out of ${totalAreas} response area(s) are correct.`);\n\n const partialScoringEnabled = partialScoring.enabled(question, env);\n traceLog.push(\n `Scoring method: ${partialScoringEnabled ? 'partial scoring' : 'all-or-nothing scoring'}.`\n );\n\n if (partialScoringEnabled) {\n traceLog.push('Each correct response area contributes to the score.');\n } else {\n traceLog.push('Student must answer all response areas correctly to receive full credit.');\n }\n\n const correctness = getCorrectness(question, env, session);\n traceLog.push(`Overall correctness: ${correctness.correctness}.`);\n traceLog.push(`Final score: ${correctness.score}.`);\n\n return traceLog;\n};\n\nexport const outcome = (question, session, env) =>\n new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ \n score: 0, \n empty: true, \n logTrace: ['Student did not enter a response.'] \n });\n return;\n }\n \n const partialScoringEnabled = partialScoring.enabled(question, env);\n session = normalizeSession(session);\n\n if (env.mode !== 'evaluate') {\n resolve({ score: undefined, completed: undefined, logTrace: [] });\n } else {\n const correctness = getCorrectness(question, env, session, true);\n const score = correctness.score;\n\n resolve({ \n score: partialScoringEnabled ? score : score === 1 ? 1 : 0,\n logTrace: getLogTrace(question, session, env)\n });\n }\n });\n\nexport const createDefaultModel = (model = {}) => {\n const { validationDefault, allowTrailingZerosDefault, ignoreOrderDefault, responses = {} } = model;\n\n const updatedResponses = Object.keys(responses).reduce((acc, responseId) => {\n const correctResponse = responses[responseId];\n\n acc[responseId] = {\n ...correctResponse,\n validation: correctResponse.validation || validationDefault,\n allowTrailingZeros: correctResponse.allowTrailingZeros || allowTrailingZerosDefault,\n ignoreOrder: correctResponse.ignoreOrder || ignoreOrderDefault,\n };\n\n return acc;\n }, {});\n\n return {\n ...defaults.model,\n ...model,\n responses: updatedResponses,\n };\n};\n\nexport const normalizeSession = (s) => ({ ...s });\n\nconst getTextFromHTML = (html) => (html || '').replace(/<\\/?[^>]+(>|$)/g, '');\n\nexport const prepareVal = (html) => getTextFromHTML(html).trim();\n\nexport const model = (question, session, env) => {\n return new Promise((resolve) => {\n session = session || {};\n const normalizedQuestion = createDefaultModel(question);\n const correctness = getCorrectness(normalizedQuestion, env, session);\n const { responses, language } = normalizedQuestion;\n let { note } = normalizedQuestion;\n let showNote = false;\n\n // check if there is at least one alternate response or if the validation for at least one response is not literal\n Object.keys(responses).forEach((responseId) => {\n const correctResponse = responses[responseId] || {};\n if (correctResponse.alternates && Object.keys(correctResponse.alternates).length > 0) {\n showNote = true;\n } else if (correctResponse.validation !== 'literal') {\n showNote = true;\n }\n });\n\n if (!note) {\n note = translator.t('mathInline.primaryCorrectWithAlternates', { lng: language });\n }\n\n const out = {\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n markup: normalizedQuestion.markup,\n responses: env.mode === 'gather' ? null : normalizedQuestion.responses,\n language: normalizedQuestion.language,\n equationEditor: normalizedQuestion.equationEditor,\n customKeys: normalizedQuestion.customKeys,\n disabled: env.mode !== 'gather',\n view: env.mode === 'view',\n correctness,\n env,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n\n const { answers = {} } = session || {};\n let feedback = {};\n\n if (env.mode === 'evaluate') {\n Object.keys(responses).forEach((responseId) => {\n const answerItem = answers['r' + responseId];\n const correctResponse = responses[responseId];\n feedback[responseId] = getIsAnswerCorrect(correctResponse, answerItem);\n });\n }\n\n if (env.mode === 'evaluate') {\n out.correctResponse = {};\n out.showNote = showNote;\n out.note = note;\n out.feedback = feedback;\n } else {\n out.responses = {};\n out.showNote = false;\n }\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n log('out: ', out);\n resolve(out);\n });\n};\n\nexport const createCorrectResponseSession = (question, env) =>\n new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const correctResponse = Object.keys(question.responses).reduce((acc, responseId) => {\n acc['r' + responseId] = { value: question.responses[responseId].answer };\n return acc;\n }, {});\n\n resolve({ id: '1', answers: correctResponse });\n } else {\n resolve(null);\n }\n });\n\nexport const validate = (model = {}, config = {}) => {\n const { responses, markup } = model;\n const { maxResponseAreas } = config;\n const responsesErrors = {};\n const errors = {};\n\n ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n Object.entries(responses || {}).forEach(([key, response], index) => {\n const { answer } = response;\n const reversedAlternates = [...Object.entries(response.alternates || {})].reverse();\n const alternatesErrors = {};\n const responseError = {};\n\n if (answer === '') {\n responseError.answer = 'Content should not be empty.';\n }\n\n reversedAlternates.forEach(([key, value], index) => {\n if (value === '') {\n alternatesErrors[key] = 'Content should not be empty.';\n } else {\n const identicalAnswer =\n answer === value || reversedAlternates.slice(index + 1).some(([, val]) => val === value);\n\n if (identicalAnswer) {\n alternatesErrors[key] = 'Content should be unique.';\n }\n }\n });\n\n if (!isEmpty(responseError) || !isEmpty(alternatesErrors)) {\n responsesErrors[index] = { ...responseError, ...alternatesErrors };\n }\n });\n\n const nbOfResponseAreas = (markup.match(/\\{\\{(\\d+)\\}\\}/g) || []).length;\n\n if (nbOfResponseAreas > maxResponseAreas) {\n errors.responseAreas = `No more than ${maxResponseAreas} response areas should be defined.`;\n } else if (nbOfResponseAreas < 1) {\n errors.responseAreas = 'There should be at least 1 response area defined.';\n }\n\n if (!isEmpty(responsesErrors)) {\n errors.responses = responsesErrors;\n }\n\n return errors;\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "@pie-element/math-templated-controller",
3
+ "private": true,
4
+ "version": "6.1.1",
5
+ "description": "",
6
+ "main": "lib/index.js",
7
+ "module": "src/index.js",
8
+ "dependencies": {
9
+ "@pie-framework/math-validation": "^1.4.2",
10
+ "@pie-lib/controller-utils": "2.0.2",
11
+ "@pie-lib/translator": "4.0.2",
12
+ "debug": "^4.1.1",
13
+ "lodash-es": "^4.17.23"
14
+ },
15
+ "author": "",
16
+ "license": "ISC"
17
+ }