@pie-element/number-line 8.9.1-next.1 → 8.9.1-next.10

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 (73) hide show
  1. package/configure/lib/arrows.js +124 -0
  2. package/configure/lib/arrows.js.map +1 -0
  3. package/configure/lib/card-bar.js +78 -0
  4. package/configure/lib/card-bar.js.map +1 -0
  5. package/configure/lib/defaults.js +144 -0
  6. package/configure/lib/defaults.js.map +1 -0
  7. package/configure/lib/domain.js +140 -0
  8. package/configure/lib/domain.js.map +1 -0
  9. package/configure/lib/index.js +225 -0
  10. package/configure/lib/index.js.map +1 -0
  11. package/configure/lib/main.js +867 -0
  12. package/configure/lib/main.js.map +1 -0
  13. package/configure/lib/number-text-field.js +97 -0
  14. package/configure/lib/number-text-field.js.map +1 -0
  15. package/configure/lib/point-config.js +144 -0
  16. package/configure/lib/point-config.js.map +1 -0
  17. package/configure/lib/size.js +100 -0
  18. package/configure/lib/size.js.map +1 -0
  19. package/configure/lib/ticks.js +288 -0
  20. package/configure/lib/ticks.js.map +1 -0
  21. package/configure/lib/utils.js +14 -0
  22. package/configure/lib/utils.js.map +1 -0
  23. package/controller/lib/defaults.js +47 -0
  24. package/controller/lib/defaults.js.map +1 -0
  25. package/controller/lib/index.js +474 -0
  26. package/controller/lib/index.js.map +1 -0
  27. package/lib/data-converter.js +100 -0
  28. package/lib/data-converter.js.map +1 -0
  29. package/lib/draggable/index.js +53 -0
  30. package/lib/draggable/index.js.map +1 -0
  31. package/lib/index.js +241 -0
  32. package/lib/index.js.map +1 -0
  33. package/lib/number-line/colors.js +21 -0
  34. package/lib/number-line/colors.js.map +1 -0
  35. package/lib/number-line/feedback.js +108 -0
  36. package/lib/number-line/feedback.js.map +1 -0
  37. package/lib/number-line/graph/arrow.js +63 -0
  38. package/lib/number-line/graph/arrow.js.map +1 -0
  39. package/lib/number-line/graph/elements/base.js +26 -0
  40. package/lib/number-line/graph/elements/base.js.map +1 -0
  41. package/lib/number-line/graph/elements/builder.js +38 -0
  42. package/lib/number-line/graph/elements/builder.js.map +1 -0
  43. package/lib/number-line/graph/elements/line.js +317 -0
  44. package/lib/number-line/graph/elements/line.js.map +1 -0
  45. package/lib/number-line/graph/elements/point.js +233 -0
  46. package/lib/number-line/graph/elements/point.js.map +1 -0
  47. package/lib/number-line/graph/elements/ray.js +227 -0
  48. package/lib/number-line/graph/elements/ray.js.map +1 -0
  49. package/lib/number-line/graph/index.js +328 -0
  50. package/lib/number-line/graph/index.js.map +1 -0
  51. package/lib/number-line/graph/line.js +48 -0
  52. package/lib/number-line/graph/line.js.map +1 -0
  53. package/lib/number-line/graph/stacks.js +101 -0
  54. package/lib/number-line/graph/stacks.js.map +1 -0
  55. package/lib/number-line/graph/tick-utils.js +440 -0
  56. package/lib/number-line/graph/tick-utils.js.map +1 -0
  57. package/lib/number-line/graph/ticks.js +239 -0
  58. package/lib/number-line/graph/ticks.js.map +1 -0
  59. package/lib/number-line/index.js +425 -0
  60. package/lib/number-line/index.js.map +1 -0
  61. package/lib/number-line/point-chooser/button.js +74 -0
  62. package/lib/number-line/point-chooser/button.js.map +1 -0
  63. package/lib/number-line/point-chooser/img.js +9 -0
  64. package/lib/number-line/point-chooser/img.js.map +1 -0
  65. package/lib/number-line/point-chooser/index.js +193 -0
  66. package/lib/number-line/point-chooser/index.js.map +1 -0
  67. package/lib/number-line/point-chooser/styles.js +100 -0
  68. package/lib/number-line/point-chooser/styles.js.map +1 -0
  69. package/lib/number-line/transitions/fade.js +67 -0
  70. package/lib/number-line/transitions/fade.js.map +1 -0
  71. package/lib/number-line/transitions/index.js +16 -0
  72. package/lib/number-line/transitions/index.js.map +1 -0
  73. package/package.json +2 -2
@@ -0,0 +1,474 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.createCorrectResponseSession = exports.closeTo = exports.CLOSE_TO_PRECISION = void 0;
11
+ exports.createDefaultModel = createDefaultModel;
12
+ exports.getCorrectness = exports.getCorrected = void 0;
13
+ exports.getScore = getScore;
14
+ exports.model = model;
15
+ exports.normalize = normalize;
16
+ exports.outcome = outcome;
17
+ exports.validate = void 0;
18
+
19
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
20
+
21
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
22
+
23
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
24
+
25
+ var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
26
+
27
+ var _find = _interopRequireDefault(require("lodash/find"));
28
+
29
+ var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
30
+
31
+ var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
32
+
33
+ var _isEqualWith = _interopRequireDefault(require("lodash/isEqualWith"));
34
+
35
+ var _merge = _interopRequireDefault(require("lodash/merge"));
36
+
37
+ var _omitBy = _interopRequireDefault(require("lodash/omitBy"));
38
+
39
+ var _feedback = require("@pie-lib/pie-toolbox/feedback");
40
+
41
+ var _controllerUtils = require("@pie-lib/pie-toolbox/controller-utils");
42
+
43
+ var math = _interopRequireWildcard(require("mathjs"));
44
+
45
+ var _defaults = _interopRequireDefault(require("./defaults"));
46
+
47
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
48
+
49
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
50
+
51
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
52
+
53
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
54
+
55
+ var score = function score(number) {
56
+ return {
57
+ score: {
58
+ scaled: number
59
+ }
60
+ };
61
+ };
62
+
63
+ var getPartialScore = function getPartialScore(corrected, ps) {
64
+ var correct = corrected.correct;
65
+ var rule = ps.find(function (r) {
66
+ return r.numberOfCorrect === correct.length;
67
+ });
68
+
69
+ if (rule) {
70
+ return 1.0 * (rule.scorePercentage / 100);
71
+ } else {
72
+ return 0;
73
+ }
74
+ };
75
+
76
+ var accumulateAnswer = function accumulateAnswer(correctResponse) {
77
+ return function (total, answer) {
78
+ var isCorrectResponse = correctResponse.some(function (cr) {
79
+ return matches(cr)(answer);
80
+ });
81
+ return total + (isCorrectResponse ? 1 : 0);
82
+ };
83
+ };
84
+ /**
85
+ */
86
+
87
+
88
+ function outcome(model, session, env) {
89
+ return new Promise(function (resolve) {
90
+ if (!session || (0, _isEmpty["default"])(session)) {
91
+ resolve({
92
+ score: 0,
93
+ empty: true
94
+ });
95
+ } else {
96
+ var partialScoringEnabled = _controllerUtils.partialScoring.enabled(model, env);
97
+
98
+ var numCorrect = (session.answer || []).reduce(accumulateAnswer(model.correctResponse), 0);
99
+ var total = model.correctResponse.length;
100
+ var numIncorrect = 0;
101
+
102
+ if ((session.answer || []).length > total) {
103
+ numIncorrect = (session.answer || []).length - total;
104
+ }
105
+
106
+ if (total === 0) {
107
+ total = 1;
108
+ }
109
+
110
+ var _score = numCorrect < 0 ? 0 : (numCorrect - numIncorrect) / total;
111
+
112
+ if (_score < 0) {
113
+ _score = 0;
114
+ }
115
+
116
+ resolve({
117
+ score: partialScoringEnabled ? _score : _score === 1 ? 1 : 0
118
+ });
119
+ }
120
+ });
121
+ }
122
+
123
+ function getScore(question, session) {
124
+ return new Promise(function (resolve) {
125
+ if (!session || (0, _isEmpty["default"])(session)) {
126
+ resolve({
127
+ score: {
128
+ scaled: 0
129
+ }
130
+ });
131
+ } else {
132
+ session.answer = session.answer || [];
133
+ var corrected = getCorrected(session.answer, (0, _cloneDeep["default"])(question.correctResponse));
134
+ var correctness = getCorrectness(corrected);
135
+
136
+ if (correctness === 'correct') {
137
+ resolve(score(1.0));
138
+ } else if (correctness === 'incorrect') {
139
+ resolve(score(0.0));
140
+ } else if (correctness === 'partial') {
141
+ var allowPartialScoring = question.allowPartialScoring,
142
+ _partialScoring = question.partialScoring;
143
+
144
+ var ps = (_partialScoring || []).filter(function (o) {
145
+ return !(0, _isEmpty["default"])(o);
146
+ });
147
+
148
+ var canDoPartialScoring = allowPartialScoring && ps.length > 0;
149
+
150
+ if (canDoPartialScoring) {
151
+ resolve(score(getPartialScore(corrected, ps)));
152
+ } else {
153
+ resolve(score(0.0));
154
+ }
155
+ } else {
156
+ resolve({
157
+ score: {
158
+ scaled: -1
159
+ }
160
+ });
161
+ }
162
+ }
163
+ });
164
+ }
165
+
166
+ var CLOSE_TO_PRECISION = 3;
167
+ exports.CLOSE_TO_PRECISION = CLOSE_TO_PRECISION;
168
+
169
+ var closeTo = function closeTo(a, b, precision) {
170
+ precision = precision || 5;
171
+ var expectedDiff = Math.pow(10, -precision) / 2;
172
+ var receivedDiff = Math.abs(a - b);
173
+ var close = receivedDiff <= expectedDiff;
174
+ return close;
175
+ };
176
+
177
+ exports.closeTo = closeTo;
178
+
179
+ var matches = function matches(a) {
180
+ return function (v) {
181
+ return (0, _isEqualWith["default"])(a, v, function (v, ov) {
182
+ if (typeof v === 'number' && typeof ov === 'number') {
183
+ return closeTo(v, ov, CLOSE_TO_PRECISION);
184
+ }
185
+ });
186
+ };
187
+ };
188
+
189
+ var getCorrected = function getCorrected(answer, correctResponse) {
190
+ if ((0, _isEmpty["default"])(correctResponse) && answer.length > 0) {
191
+ return {
192
+ correct: [],
193
+ incorrect: [],
194
+ notInAnswer: [],
195
+ noCorrectResponse: true
196
+ };
197
+ }
198
+
199
+ return answer.reduce(function (acc, a, index) {
200
+ var correct = acc.correct,
201
+ incorrect = acc.incorrect,
202
+ notInAnswer = acc.notInAnswer;
203
+ var match = (0, _find["default"])(notInAnswer, matches(a));
204
+
205
+ if (match) {
206
+ correct.push(index);
207
+ notInAnswer.splice(notInAnswer.indexOf(match), 1);
208
+ } else {
209
+ incorrect.push(index);
210
+ }
211
+
212
+ return {
213
+ correct: correct,
214
+ incorrect: incorrect,
215
+ notInAnswer: notInAnswer
216
+ };
217
+ }, {
218
+ correct: [],
219
+ incorrect: [],
220
+ notInAnswer: correctResponse
221
+ });
222
+ };
223
+
224
+ exports.getCorrected = getCorrected;
225
+
226
+ var getCorrectness = function getCorrectness(corrected) {
227
+ var incorrect = corrected.incorrect,
228
+ correct = corrected.correct,
229
+ notInAnswer = corrected.notInAnswer,
230
+ noCorrectResponse = corrected.noCorrectResponse;
231
+
232
+ if (noCorrectResponse) {
233
+ return 'unknown';
234
+ }
235
+
236
+ if (incorrect.length === 0 && correct.length === 0) {
237
+ return 'unanswered';
238
+ }
239
+
240
+ if (incorrect.length === 0 && notInAnswer.length === 0) {
241
+ return 'correct';
242
+ }
243
+
244
+ if (incorrect.length > 0 || notInAnswer.length > 0) {
245
+ if (correct.length > 0) {
246
+ return 'partial';
247
+ } else {
248
+ return 'incorrect';
249
+ }
250
+ }
251
+
252
+ return 'unknown';
253
+ };
254
+ /**
255
+ * A sample of a normalize function see:
256
+ * https://github.com/pie-framework/pie-elements/issues/21
257
+ */
258
+
259
+
260
+ exports.getCorrectness = getCorrectness;
261
+
262
+ function normalize(question) {
263
+ return new Promise(function (resolve) {
264
+ var feedback = (0, _merge["default"])(_defaults["default"].feedback, question.feedback);
265
+
266
+ if ((0, _isEqual["default"])(feedback, question.feedback)) {
267
+ return resolve(_objectSpread({}, question));
268
+ } else {
269
+ resolve(_objectSpread(_objectSpread({}, question), {}, {
270
+ feedback: feedback
271
+ }));
272
+ }
273
+ });
274
+ }
275
+
276
+ function createDefaultModel() {
277
+ var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
278
+ return new Promise(function (resolve) {
279
+ var out = _objectSpread(_objectSpread({}, model), {}, {
280
+ graph: _objectSpread(_objectSpread({}, _defaults["default"].graph), model.graph),
281
+ colorContrast: 'black_on_white'
282
+ });
283
+
284
+ resolve((0, _omitBy["default"])(out, function (v) {
285
+ return !v;
286
+ }));
287
+ });
288
+ } // this function is duplicated in configure; at some point, use the same shared function
289
+
290
+
291
+ var updateTicks = function updateTicks(model) {
292
+ var _model$graph = model.graph;
293
+ _model$graph = _model$graph === void 0 ? {} : _model$graph;
294
+ var domain = _model$graph.domain,
295
+ labelStep = _model$graph.labelStep,
296
+ _model$graph$ticks = _model$graph.ticks,
297
+ ticks = _model$graph$ticks === void 0 ? {} : _model$graph$ticks;
298
+ var minor = ticks.minor,
299
+ major = ticks.major;
300
+
301
+ if (domain) {
302
+ domain.min = Number((domain.min || 0).toFixed(2));
303
+ domain.max = Number((domain.max || 0).toFixed(2));
304
+ }
305
+
306
+ if (labelStep && typeof labelStep === 'string' && labelStep.match(/^[1-9][0-9]*\/[1-9][0-9]*$/g)) {
307
+ model.graph.fraction = true; // update the ticks frequency and label value to match the label step if needed
308
+
309
+ var step = math.evaluate(labelStep);
310
+
311
+ if (step !== major) {
312
+ ticks.major = step;
313
+ ticks.minor = step / (major / minor);
314
+ }
315
+ }
316
+
317
+ return model;
318
+ };
319
+
320
+ function model(question, session, env) {
321
+ if (!question) {
322
+ return Promise.reject(new Error('question is null'));
323
+ }
324
+
325
+ return new Promise( /*#__PURE__*/function () {
326
+ var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(resolve, reject) {
327
+ var normalizedQuestion, _updateTicks, graph, evaluateMode, correctResponse, corrected, correctness, exhibitOnly, disabled, fb;
328
+
329
+ return _regenerator["default"].wrap(function _callee$(_context) {
330
+ while (1) {
331
+ switch (_context.prev = _context.next) {
332
+ case 0:
333
+ _context.next = 2;
334
+ return normalize(question);
335
+
336
+ case 2:
337
+ normalizedQuestion = _context.sent;
338
+ _updateTicks = updateTicks(normalizedQuestion), graph = _updateTicks.graph;
339
+
340
+ if (graph) {
341
+ evaluateMode = env.mode === 'evaluate';
342
+ correctResponse = (0, _cloneDeep["default"])(normalizedQuestion.correctResponse);
343
+ corrected = evaluateMode && getCorrected(session ? session.answer || [] : [], correctResponse);
344
+ correctness = evaluateMode && getCorrectness(corrected);
345
+ exhibitOnly = graph.exhibitOnly;
346
+ disabled = env.mode !== 'gather' || exhibitOnly === true;
347
+ fb = evaluateMode ? (0, _feedback.getFeedbackForCorrectness)(correctness, normalizedQuestion.feedback) : Promise.resolve(undefined);
348
+ fb.then(function (feedbackMessage) {
349
+ var out = {
350
+ prompt: normalizedQuestion.prompt,
351
+ graph: graph,
352
+ disabled: disabled,
353
+ corrected: corrected,
354
+ correctResponse: evaluateMode && ['unanswered', 'correct'].indexOf(correctness) === -1 && normalizedQuestion.correctResponse,
355
+ feedback: feedbackMessage && {
356
+ type: correctness,
357
+ message: feedbackMessage
358
+ },
359
+ colorContrast: env.accessibility && env.accessibility.colorContrast || 'black_on_white',
360
+ language: normalizedQuestion.language
361
+ };
362
+ resolve((0, _omitBy["default"])(out, function (v) {
363
+ return !v;
364
+ }));
365
+ });
366
+ } else {
367
+ reject(new Error('graph is undefined'));
368
+ }
369
+
370
+ case 5:
371
+ case "end":
372
+ return _context.stop();
373
+ }
374
+ }
375
+ }, _callee);
376
+ }));
377
+
378
+ return function (_x, _x2) {
379
+ return _ref.apply(this, arguments);
380
+ };
381
+ }());
382
+ }
383
+
384
+ var createCorrectResponseSession = function createCorrectResponseSession(question, env) {
385
+ return new Promise(function (resolve) {
386
+ if (env.mode !== 'evaluate' && env.role === 'instructor') {
387
+ var answer = question.correctResponse;
388
+ resolve({
389
+ answer: answer,
390
+ id: '1'
391
+ });
392
+ } else {
393
+ resolve(null);
394
+ }
395
+ });
396
+ }; // remove all html tags
397
+
398
+
399
+ exports.createCorrectResponseSession = createCorrectResponseSession;
400
+
401
+ var getInnerText = function getInnerText(html) {
402
+ return (html || '').replaceAll(/<[^>]*>/g, '');
403
+ }; // remove all html tags except img and iframe
404
+
405
+
406
+ var getContent = function getContent(html) {
407
+ return (html || '').replace(/(<(?!img|iframe)([^>]+)>)/gi, '');
408
+ };
409
+
410
+ var validate = function validate() {
411
+ var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
412
+ var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
413
+
414
+ var _ref2 = model || {},
415
+ graph = _ref2.graph,
416
+ correctResponse = _ref2.correctResponse;
417
+
418
+ var _ref3 = config || {},
419
+ _ref3$maxMaxElements = _ref3.maxMaxElements,
420
+ maxMaxElements = _ref3$maxMaxElements === void 0 ? 20 : _ref3$maxMaxElements,
421
+ _ref3$numberLineDimen = _ref3.numberLineDimensions;
422
+
423
+ _ref3$numberLineDimen = _ref3$numberLineDimen === void 0 ? {} : _ref3$numberLineDimen;
424
+ var _ref3$numberLineDimen2 = _ref3$numberLineDimen.min,
425
+ minWidth = _ref3$numberLineDimen2 === void 0 ? 200 : _ref3$numberLineDimen2,
426
+ _ref3$numberLineDimen3 = _ref3$numberLineDimen.max,
427
+ maxWidth = _ref3$numberLineDimen3 === void 0 ? 800 : _ref3$numberLineDimen3;
428
+
429
+ var _ref4 = graph || {},
430
+ width = _ref4.width,
431
+ domain = _ref4.domain,
432
+ maxNumberOfPoints = _ref4.maxNumberOfPoints;
433
+
434
+ var _ref5 = domain || {},
435
+ min = _ref5.min,
436
+ max = _ref5.max;
437
+
438
+ var errors = {};
439
+ ['teacherInstructions', 'prompt'].forEach(function (field) {
440
+ var _config$field;
441
+
442
+ if ((_config$field = config[field]) !== null && _config$field !== void 0 && _config$field.required && !getContent(model[field])) {
443
+ errors[field] = 'This field is required.';
444
+ }
445
+ });
446
+
447
+ if (width < minWidth || width > maxWidth) {
448
+ errors.widthError = "Width should be a value between ".concat(minWidth, " and ").concat(maxWidth, ".");
449
+ }
450
+
451
+ var MIN_DOMAIN = -100000;
452
+ var MAX_DOMAIN = 100000;
453
+
454
+ if (min < MIN_DOMAIN || min > MAX_DOMAIN || max < MIN_DOMAIN || max > MAX_DOMAIN) {
455
+ errors.domainError = "Min and max values must both be in the range [".concat(MIN_DOMAIN, ", ").concat(MAX_DOMAIN, "].");
456
+ }
457
+
458
+ if (min >= max) {
459
+ errors.maxError = 'Max value must be greater than min value.';
460
+ }
461
+
462
+ if (maxNumberOfPoints < 1 || maxNumberOfPoints > maxMaxElements) {
463
+ errors.pointsError = "Max number of elements should be between 1 and ".concat(maxMaxElements, ".");
464
+ }
465
+
466
+ if (correctResponse && correctResponse.length === 0) {
467
+ errors.correctResponseError = 'The correct answer should include at least one number line object.';
468
+ }
469
+
470
+ return errors;
471
+ };
472
+
473
+ exports.validate = validate;
474
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.js"],"names":["score","number","scaled","getPartialScore","corrected","ps","correct","rule","find","r","numberOfCorrect","length","scorePercentage","accumulateAnswer","correctResponse","total","answer","isCorrectResponse","some","cr","matches","outcome","model","session","env","Promise","resolve","empty","partialScoringEnabled","partialScoring","enabled","numCorrect","reduce","numIncorrect","getScore","question","getCorrected","correctness","getCorrectness","allowPartialScoring","filter","o","canDoPartialScoring","CLOSE_TO_PRECISION","closeTo","a","b","precision","expectedDiff","Math","pow","receivedDiff","abs","close","v","ov","incorrect","notInAnswer","noCorrectResponse","acc","index","match","push","splice","indexOf","normalize","feedback","defaults","createDefaultModel","out","graph","colorContrast","updateTicks","domain","labelStep","ticks","minor","major","min","Number","toFixed","max","fraction","step","math","evaluate","reject","Error","normalizedQuestion","evaluateMode","mode","exhibitOnly","disabled","fb","undefined","then","feedbackMessage","prompt","type","message","accessibility","language","createCorrectResponseSession","role","id","getInnerText","html","replaceAll","getContent","replace","validate","config","maxMaxElements","numberLineDimensions","minWidth","maxWidth","width","maxNumberOfPoints","errors","forEach","field","required","widthError","MIN_DOMAIN","MAX_DOMAIN","domainError","maxError","pointsError","correctResponseError"],"mappings":"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","sourcesContent":["import cloneDeep from 'lodash/cloneDeep';\nimport find from 'lodash/find';\nimport isEmpty from 'lodash/isEmpty';\nimport isEqual from 'lodash/isEqual';\nimport isEqualWith from 'lodash/isEqualWith';\nimport merge from 'lodash/merge';\nimport omitBy from 'lodash/omitBy';\nimport { getFeedbackForCorrectness } from '@pie-lib/pie-toolbox/feedback';\nimport { partialScoring } from '@pie-lib/pie-toolbox/controller-utils';\nimport * as math from 'mathjs';\n\nimport defaults from './defaults';\n\nconst score = (number) => {\n return {\n score: {\n scaled: number,\n },\n };\n};\n\nconst getPartialScore = (corrected, ps) => {\n const { correct } = corrected;\n const rule = ps.find((r) => r.numberOfCorrect === correct.length);\n\n if (rule) {\n return 1.0 * (rule.scorePercentage / 100);\n } else {\n return 0;\n }\n};\n\nconst accumulateAnswer = (correctResponse) => (total, answer) => {\n const isCorrectResponse = correctResponse.some((cr) => matches(cr)(answer));\n return total + (isCorrectResponse ? 1 : 0);\n};\n\n/**\n */\nexport function outcome(model, session, env) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n } else {\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const numCorrect = (session.answer || []).reduce(accumulateAnswer(model.correctResponse), 0);\n\n let total = model.correctResponse.length;\n let numIncorrect = 0;\n\n if ((session.answer || []).length > total) {\n numIncorrect = (session.answer || []).length - total;\n }\n\n if (total === 0) {\n total = 1;\n }\n\n let score = numCorrect < 0 ? 0 : (numCorrect - numIncorrect) / total;\n\n if (score < 0) {\n score = 0;\n }\n\n resolve({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0 });\n }\n });\n}\n\nexport function getScore(question, session) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: { scaled: 0 } });\n } else {\n session.answer = session.answer || [];\n\n const corrected = getCorrected(session.answer, cloneDeep(question.correctResponse));\n\n const correctness = getCorrectness(corrected);\n\n if (correctness === 'correct') {\n resolve(score(1.0));\n } else if (correctness === 'incorrect') {\n resolve(score(0.0));\n } else if (correctness === 'partial') {\n const { allowPartialScoring, partialScoring } = question;\n const ps = (partialScoring || []).filter((o) => !isEmpty(o));\n const canDoPartialScoring = allowPartialScoring && ps.length > 0;\n if (canDoPartialScoring) {\n resolve(score(getPartialScore(corrected, ps)));\n } else {\n resolve(score(0.0));\n }\n } else {\n resolve({ score: { scaled: -1 } });\n }\n }\n });\n}\n\nexport const CLOSE_TO_PRECISION = 3;\n\nexport const closeTo = (a, b, precision) => {\n precision = precision || 5;\n const expectedDiff = Math.pow(10, -precision) / 2;\n const receivedDiff = Math.abs(a - b);\n const close = receivedDiff <= expectedDiff;\n return close;\n};\n\nconst matches = (a) => (v) => {\n return isEqualWith(a, v, (v, ov) => {\n if (typeof v === 'number' && typeof ov === 'number') {\n return closeTo(v, ov, CLOSE_TO_PRECISION);\n }\n });\n};\n\nexport const getCorrected = (answer, correctResponse) => {\n if (isEmpty(correctResponse) && answer.length > 0) {\n return {\n correct: [],\n incorrect: [],\n notInAnswer: [],\n noCorrectResponse: true,\n };\n }\n\n return answer.reduce(\n (acc, a, index) => {\n const { correct, incorrect, notInAnswer } = acc;\n\n const match = find(notInAnswer, matches(a));\n if (match) {\n correct.push(index);\n notInAnswer.splice(notInAnswer.indexOf(match), 1);\n } else {\n incorrect.push(index);\n }\n\n return {\n correct: correct,\n incorrect: incorrect,\n notInAnswer: notInAnswer,\n };\n },\n {\n correct: [],\n incorrect: [],\n notInAnswer: correctResponse,\n },\n );\n};\n\nexport const getCorrectness = (corrected) => {\n const { incorrect, correct, notInAnswer, noCorrectResponse } = corrected;\n\n if (noCorrectResponse) {\n return 'unknown';\n }\n\n if (incorrect.length === 0 && correct.length === 0) {\n return 'unanswered';\n }\n\n if (incorrect.length === 0 && notInAnswer.length === 0) {\n return 'correct';\n }\n\n if (incorrect.length > 0 || notInAnswer.length > 0) {\n if (correct.length > 0) {\n return 'partial';\n } else {\n return 'incorrect';\n }\n }\n\n return 'unknown';\n};\n\n/**\n * A sample of a normalize function see:\n * https://github.com/pie-framework/pie-elements/issues/21\n */\nexport function normalize(question) {\n return new Promise((resolve) => {\n const feedback = merge(defaults.feedback, question.feedback);\n\n if (isEqual(feedback, question.feedback)) {\n return resolve({ ...question });\n } else {\n resolve({ ...question, feedback });\n }\n });\n}\n\nexport function createDefaultModel(model = {}) {\n return new Promise((resolve) => {\n const out = {\n ...model,\n graph: {\n ...defaults.graph,\n ...model.graph,\n },\n colorContrast: 'black_on_white',\n };\n\n resolve(omitBy(out, (v) => !v));\n });\n}\n\n// this function is duplicated in configure; at some point, use the same shared function\nconst updateTicks = (model) => {\n const { graph: { domain, labelStep, ticks = {} } = {} } = model;\n const { minor, major } = ticks;\n\n if (domain) {\n domain.min = Number((domain.min || 0).toFixed(2));\n domain.max = Number((domain.max || 0).toFixed(2));\n }\n\n if (labelStep && typeof labelStep === 'string' && labelStep.match(/^[1-9][0-9]*\\/[1-9][0-9]*$/g)) {\n model.graph.fraction = true;\n\n // update the ticks frequency and label value to match the label step if needed\n const step = math.evaluate(labelStep);\n\n if (step !== major) {\n ticks.major = step;\n ticks.minor = step / (major / minor);\n }\n }\n\n return model;\n};\n\nexport function model(question, session, env) {\n if (!question) {\n return Promise.reject(new Error('question is null'));\n }\n\n return new Promise(async (resolve, reject) => {\n const normalizedQuestion = await normalize(question);\n const { graph } = updateTicks(normalizedQuestion);\n\n if (graph) {\n const evaluateMode = env.mode === 'evaluate';\n\n const correctResponse = cloneDeep(normalizedQuestion.correctResponse);\n const corrected = evaluateMode && getCorrected(session ? session.answer || [] : [], correctResponse);\n const correctness = evaluateMode && getCorrectness(corrected);\n\n const { exhibitOnly } = graph;\n const disabled = env.mode !== 'gather' || exhibitOnly === true;\n\n const fb = evaluateMode\n ? getFeedbackForCorrectness(correctness, normalizedQuestion.feedback)\n : Promise.resolve(undefined);\n\n fb.then((feedbackMessage) => {\n const out = {\n prompt: normalizedQuestion.prompt,\n graph,\n disabled,\n corrected,\n correctResponse:\n evaluateMode && ['unanswered', 'correct'].indexOf(correctness) === -1 && normalizedQuestion.correctResponse,\n feedback: feedbackMessage && {\n type: correctness,\n message: feedbackMessage,\n },\n colorContrast: (env.accessibility && env.accessibility.colorContrast) || 'black_on_white',\n language: normalizedQuestion.language,\n };\n\n resolve(omitBy(out, (v) => !v));\n });\n } else {\n reject(new Error('graph is undefined'));\n }\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { correctResponse: answer } = question;\n\n resolve({\n answer,\n id: '1',\n });\n } else {\n resolve(null);\n }\n });\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img and iframe\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { graph, correctResponse } = model || {};\n const { maxMaxElements = 20, numberLineDimensions: { min: minWidth = 200, max: maxWidth = 800 } = {} } = config || {};\n const { width, domain, maxNumberOfPoints } = graph || {};\n const { min, max } = domain || {};\n const errors = {};\n\n ['teacherInstructions', 'prompt'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n if (width < minWidth || width > maxWidth) {\n errors.widthError = `Width should be a value between ${minWidth} and ${maxWidth}.`;\n }\n\n const MIN_DOMAIN = -100000;\n const MAX_DOMAIN = 100000;\n\n if (min < MIN_DOMAIN || min > MAX_DOMAIN || max < MIN_DOMAIN || max > MAX_DOMAIN) {\n errors.domainError = `Min and max values must both be in the range [${MIN_DOMAIN}, ${MAX_DOMAIN}].`;\n }\n\n if (min >= max) {\n errors.maxError = 'Max value must be greater than min value.';\n }\n\n if (maxNumberOfPoints < 1 || maxNumberOfPoints > maxMaxElements) {\n errors.pointsError = `Max number of elements should be between 1 and ${maxMaxElements}.`;\n }\n\n if (correctResponse && correctResponse.length === 0) {\n errors.correctResponseError = 'The correct answer should include at least one number line object.';\n }\n\n return errors;\n};\n"],"file":"index.js"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.toSessionFormat = exports.toGraphFormat = exports.switchPosition = exports.switchGraphLine = exports.lineIsSwitched = void 0;
7
+
8
+ var lineIsSwitched = function lineIsSwitched(line) {
9
+ var position = line.position;
10
+ return position.left > position.right;
11
+ };
12
+
13
+ exports.lineIsSwitched = lineIsSwitched;
14
+
15
+ var switchGraphLine = function switchGraphLine(line) {
16
+ var position = line.position;
17
+
18
+ if (position.left < position.right) {
19
+ return line;
20
+ }
21
+
22
+ var newRightPoint = line.leftPoint,
23
+ newLeftPoint = line.rightPoint;
24
+ return {
25
+ leftPoint: newLeftPoint,
26
+ rightPoint: newRightPoint,
27
+ position: switchPosition(position),
28
+ type: 'line'
29
+ };
30
+ };
31
+
32
+ exports.switchGraphLine = switchGraphLine;
33
+
34
+ var switchPosition = function switchPosition(p) {
35
+ var newRight = p.left,
36
+ newLeft = p.right;
37
+ return {
38
+ left: newLeft,
39
+ right: newRight
40
+ };
41
+ };
42
+
43
+ exports.switchPosition = switchPosition;
44
+
45
+ var toSessionFormat = function toSessionFormat(gf) {
46
+ if (gf.type === 'point') {
47
+ return {
48
+ type: 'point',
49
+ pointType: gf.pointType,
50
+ domainPosition: gf.position
51
+ };
52
+ } else if (gf.type === 'line') {
53
+ return {
54
+ type: 'line',
55
+ size: gf.position.right - gf.position.left,
56
+ domainPosition: gf.position.left,
57
+ leftPoint: gf.leftPoint,
58
+ rightPoint: gf.rightPoint
59
+ };
60
+ } else if (gf.type === 'ray') {
61
+ return {
62
+ type: 'ray',
63
+ domainPosition: gf.position,
64
+ pointType: gf.pointType,
65
+ direction: gf.direction
66
+ };
67
+ }
68
+ };
69
+
70
+ exports.toSessionFormat = toSessionFormat;
71
+
72
+ var toGraphFormat = function toGraphFormat(sf) {
73
+ if (sf.type === 'point') {
74
+ return {
75
+ type: 'point',
76
+ pointType: sf.pointType,
77
+ position: sf.domainPosition
78
+ };
79
+ } else if (sf.type === 'line') {
80
+ return {
81
+ type: 'line',
82
+ position: {
83
+ left: sf.domainPosition,
84
+ right: sf.domainPosition + sf.size
85
+ },
86
+ leftPoint: sf.leftPoint,
87
+ rightPoint: sf.rightPoint
88
+ };
89
+ } else if (sf.type === 'ray') {
90
+ return {
91
+ type: 'ray',
92
+ position: sf.domainPosition,
93
+ pointType: sf.pointType,
94
+ direction: sf.direction
95
+ };
96
+ }
97
+ };
98
+
99
+ exports.toGraphFormat = toGraphFormat;
100
+ //# sourceMappingURL=data-converter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/data-converter.js"],"names":["lineIsSwitched","line","position","left","right","switchGraphLine","newRightPoint","leftPoint","newLeftPoint","rightPoint","switchPosition","type","p","newRight","newLeft","toSessionFormat","gf","pointType","domainPosition","size","direction","toGraphFormat","sf"],"mappings":"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","sourcesContent":["export const lineIsSwitched = (line) => {\n let { position } = line;\n return position.left > position.right;\n};\n\nexport const switchGraphLine = (line) => {\n let { position } = line;\n\n if (position.left < position.right) {\n return line;\n }\n\n let { leftPoint: newRightPoint, rightPoint: newLeftPoint } = line;\n\n return {\n leftPoint: newLeftPoint,\n rightPoint: newRightPoint,\n position: switchPosition(position),\n type: 'line',\n };\n};\n\nexport const switchPosition = (p) => {\n let { left: newRight, right: newLeft } = p;\n return { left: newLeft, right: newRight };\n};\n\nexport const toSessionFormat = (gf) => {\n if (gf.type === 'point') {\n return {\n type: 'point',\n pointType: gf.pointType,\n domainPosition: gf.position,\n };\n } else if (gf.type === 'line') {\n return {\n type: 'line',\n size: gf.position.right - gf.position.left,\n domainPosition: gf.position.left,\n leftPoint: gf.leftPoint,\n rightPoint: gf.rightPoint,\n };\n } else if (gf.type === 'ray') {\n return {\n type: 'ray',\n domainPosition: gf.position,\n pointType: gf.pointType,\n direction: gf.direction,\n };\n }\n};\n\nexport const toGraphFormat = (sf) => {\n if (sf.type === 'point') {\n return {\n type: 'point',\n pointType: sf.pointType,\n position: sf.domainPosition,\n };\n } else if (sf.type === 'line') {\n return {\n type: 'line',\n position: {\n left: sf.domainPosition,\n right: sf.domainPosition + sf.size,\n },\n leftPoint: sf.leftPoint,\n rightPoint: sf.rightPoint,\n };\n } else if (sf.type === 'ray') {\n return {\n type: 'ray',\n position: sf.domainPosition,\n pointType: sf.pointType,\n direction: sf.direction,\n };\n }\n};\n"],"file":"data-converter.js"}