@pie-element/select-text 10.0.0 → 11.0.1-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/CHANGELOG.md +21 -0
- package/configure/CHANGELOG.md +8 -0
- package/configure/package.json +1 -1
- package/controller/CHANGELOG.md +8 -0
- package/controller/package.json +1 -1
- package/esm/configure.js +22532 -0
- package/esm/configure.js.map +1 -0
- package/esm/controller.js +262 -0
- package/esm/controller.js.map +1 -0
- package/esm/element.js +7814 -0
- package/esm/element.js.map +1 -0
- package/esm/print.js +7788 -0
- package/esm/print.js.map +1 -0
- package/module/element.js +1 -1
- package/module/index.html +1 -1
- package/module/manifest.json +1 -1
- package/module/print.html +1 -1
- package/module/print.js +1 -1
- package/package.json +22 -4
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import debug from 'debug';
|
|
2
|
+
import isEmpty from 'lodash/isEmpty';
|
|
3
|
+
import { getFeedbackForCorrectness } from '@pie-lib/feedback';
|
|
4
|
+
import { partialScoring } from '@pie-lib/controller-utils';
|
|
5
|
+
|
|
6
|
+
function ownKeys(object, enumerableOnly) {
|
|
7
|
+
var keys = Object.keys(object);
|
|
8
|
+
|
|
9
|
+
if (Object.getOwnPropertySymbols) {
|
|
10
|
+
var symbols = Object.getOwnPropertySymbols(object);
|
|
11
|
+
enumerableOnly && (symbols = symbols.filter(function (sym) {
|
|
12
|
+
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
13
|
+
})), keys.push.apply(keys, symbols);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return keys;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function _objectSpread2(target) {
|
|
20
|
+
for (var i = 1; i < arguments.length; i++) {
|
|
21
|
+
var source = null != arguments[i] ? arguments[i] : {};
|
|
22
|
+
i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
|
|
23
|
+
_defineProperty(target, key, source[key]);
|
|
24
|
+
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
|
|
25
|
+
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return target;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function _defineProperty(obj, key, value) {
|
|
33
|
+
if (key in obj) {
|
|
34
|
+
Object.defineProperty(obj, key, {
|
|
35
|
+
value: value,
|
|
36
|
+
enumerable: true,
|
|
37
|
+
configurable: true,
|
|
38
|
+
writable: true
|
|
39
|
+
});
|
|
40
|
+
} else {
|
|
41
|
+
obj[key] = value;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return obj;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
var defaults = {
|
|
48
|
+
feedbackEnabled: false,
|
|
49
|
+
highlightChoices: false,
|
|
50
|
+
maxSelections: 0,
|
|
51
|
+
mode: 'sentence',
|
|
52
|
+
partialScoring: false,
|
|
53
|
+
prompt: '',
|
|
54
|
+
promptEnabled: true,
|
|
55
|
+
rationale: '',
|
|
56
|
+
rationaleEnabled: true,
|
|
57
|
+
scoringType: 'auto',
|
|
58
|
+
studentInstructionsEnabled: true,
|
|
59
|
+
teacherInstructions: '',
|
|
60
|
+
teacherInstructionsEnabled: true,
|
|
61
|
+
text: '',
|
|
62
|
+
tokens: [],
|
|
63
|
+
toolbarEditorPosition: 'bottom'
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
var log = debug('@pie-element:select-text:controller');
|
|
67
|
+
|
|
68
|
+
var equalTokens = function equalTokens() {
|
|
69
|
+
var token1 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
70
|
+
var token2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
71
|
+
return (token1 === null || token1 === void 0 ? void 0 : token1.start) === (token2 === null || token2 === void 0 ? void 0 : token2.start) && (token1 === null || token1 === void 0 ? void 0 : token1.end) === (token2 === null || token2 === void 0 ? void 0 : token2.end) || // this case is used for the cases when the token's start & end were recalculated
|
|
72
|
+
(token1 === null || token1 === void 0 ? void 0 : token1.start) === (token2 === null || token2 === void 0 ? void 0 : token2.oldStart) && (token1 === null || token1 === void 0 ? void 0 : token1.end) === (token2 === null || token2 === void 0 ? void 0 : token2.oldEnd);
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
var normalizeTokens = function normalizeTokens() {
|
|
76
|
+
var tokens = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
77
|
+
var selectedTokens = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
78
|
+
var evaluateMode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
79
|
+
return (tokens || []).map(token => {
|
|
80
|
+
var isCorrect = !!token.correct; // search if correct token is missing from session
|
|
81
|
+
|
|
82
|
+
var isMissing = isCorrect && !(selectedTokens || []).find(selectedToken => equalTokens(token, selectedToken));
|
|
83
|
+
return _objectSpread2(_objectSpread2({}, token), {}, {
|
|
84
|
+
correct: evaluateMode ? isCorrect : undefined,
|
|
85
|
+
isMissing: evaluateMode ? isMissing : undefined
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
var getCorrectness = (tokens, selected) => {
|
|
91
|
+
var correct = tokens.filter(t => t.correct === true);
|
|
92
|
+
|
|
93
|
+
if (correct.length === 0) {
|
|
94
|
+
return 'unknown';
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
var correctSelected = getCorrectSelected(tokens, selected);
|
|
98
|
+
|
|
99
|
+
if (correctSelected.length === selected.length) {
|
|
100
|
+
if (correctSelected.length === correct.length) {
|
|
101
|
+
return 'correct';
|
|
102
|
+
} else if (correctSelected.length > 0) {
|
|
103
|
+
return 'partially-correct';
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (correctSelected.length > 0) {
|
|
108
|
+
return 'partially-correct';
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return 'incorrect';
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
var getCorrectSelected = (tokens, selected) => (selected || []).filter(s => tokens.findIndex(token => token.correct && equalTokens(token, s)) !== -1);
|
|
115
|
+
|
|
116
|
+
var getPartialScore = (question, session, totalCorrect) => {
|
|
117
|
+
if (!session || isEmpty(session)) {
|
|
118
|
+
return 0;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
var correctCount = getCorrectSelected(question.tokens, session.selectedTokens).length;
|
|
122
|
+
var correctTokens = (question.tokens || []).filter(t => t.correct === true);
|
|
123
|
+
var extraSelected = session.selectedTokens ? session.selectedTokens.length > correctTokens.length : 0;
|
|
124
|
+
var incorrectCount = extraSelected ? session.selectedTokens && session.selectedTokens.length - correctCount : 0;
|
|
125
|
+
var count = correctCount - incorrectCount;
|
|
126
|
+
var positiveCount = count < 0 ? 0 : count;
|
|
127
|
+
return totalCorrect.length ? parseFloat((positiveCount / totalCorrect.length).toFixed(2)) : 0;
|
|
128
|
+
};
|
|
129
|
+
var outcome = (question, session, env) => new Promise(resolve => {
|
|
130
|
+
if (!session || isEmpty(session)) {
|
|
131
|
+
resolve({
|
|
132
|
+
score: 0,
|
|
133
|
+
empty: true
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
session = normalizeSession(session);
|
|
138
|
+
|
|
139
|
+
if (env.mode !== 'evaluate') {
|
|
140
|
+
resolve({
|
|
141
|
+
score: undefined,
|
|
142
|
+
completed: undefined
|
|
143
|
+
});
|
|
144
|
+
} else {
|
|
145
|
+
var enabled = partialScoring.enabled(question, env, true);
|
|
146
|
+
var totalCorrect = question.tokens.filter(t => t.correct);
|
|
147
|
+
var score = getPartialScore(question, session, totalCorrect);
|
|
148
|
+
resolve({
|
|
149
|
+
score: enabled ? score : score === 1 ? 1 : 0
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
function createDefaultModel() {
|
|
154
|
+
var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
155
|
+
return new Promise(resolve => {
|
|
156
|
+
resolve(_objectSpread2(_objectSpread2({}, defaults), model));
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
var normalizeSession = session => _objectSpread2({
|
|
160
|
+
selectedTokens: []
|
|
161
|
+
}, session);
|
|
162
|
+
var normalize = question => _objectSpread2(_objectSpread2({}, defaults), question);
|
|
163
|
+
var model = (question, session, env) => {
|
|
164
|
+
session = session || {
|
|
165
|
+
selectedToken: []
|
|
166
|
+
};
|
|
167
|
+
session.selectedTokens = session.selectedTokens || [];
|
|
168
|
+
var normalizedQuestion = normalize(question);
|
|
169
|
+
return new Promise(resolve => {
|
|
170
|
+
log('[model]', 'normalizedQuestion: ', normalizedQuestion);
|
|
171
|
+
log('[model]', 'session: ', session);
|
|
172
|
+
var tokens = normalizeTokens(normalizedQuestion.tokens, session.selectedTokens, env.mode === 'evaluate');
|
|
173
|
+
log('[model] tokens:', tokens);
|
|
174
|
+
var correctness = env.mode === 'evaluate' ? getCorrectness(normalizedQuestion.tokens, session.selectedTokens) : undefined;
|
|
175
|
+
var fb = env.mode === 'evaluate' && normalizedQuestion.feedbackEnabled ? getFeedbackForCorrectness(correctness, normalizedQuestion.feedback) : Promise.resolve(undefined);
|
|
176
|
+
fb.then(feedback => {
|
|
177
|
+
var out = {
|
|
178
|
+
tokens,
|
|
179
|
+
highlightChoices: normalizedQuestion.highlightChoices,
|
|
180
|
+
prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,
|
|
181
|
+
text: normalizedQuestion.text,
|
|
182
|
+
disabled: env.mode !== 'gather',
|
|
183
|
+
maxSelections: normalizedQuestion.maxSelections,
|
|
184
|
+
correctness,
|
|
185
|
+
env,
|
|
186
|
+
feedback,
|
|
187
|
+
incorrect: env.mode === 'evaluate' ? correctness !== 'correct' : undefined,
|
|
188
|
+
language: normalizedQuestion.language,
|
|
189
|
+
extraCSSRules: normalizedQuestion.extraCSSRules
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
|
|
193
|
+
out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;
|
|
194
|
+
out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;
|
|
195
|
+
} else {
|
|
196
|
+
out.rationale = null;
|
|
197
|
+
out.teacherInstructions = null;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
resolve(out);
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
};
|
|
204
|
+
var createCorrectResponseSession = (question, env) => {
|
|
205
|
+
return new Promise(resolve => {
|
|
206
|
+
if (env.mode !== 'evaluate' && env.role === 'instructor') {
|
|
207
|
+
var {
|
|
208
|
+
tokens
|
|
209
|
+
} = question;
|
|
210
|
+
var selectedTokens = tokens.filter(t => t.correct);
|
|
211
|
+
resolve({
|
|
212
|
+
id: '1',
|
|
213
|
+
selectedTokens
|
|
214
|
+
});
|
|
215
|
+
} else {
|
|
216
|
+
resolve(null);
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
}; // remove all html tags
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
var getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
|
|
223
|
+
|
|
224
|
+
var validate = function validate() {
|
|
225
|
+
var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
226
|
+
var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
227
|
+
var {
|
|
228
|
+
tokens
|
|
229
|
+
} = model;
|
|
230
|
+
var {
|
|
231
|
+
minTokens = 2,
|
|
232
|
+
maxTokens,
|
|
233
|
+
maxSelections
|
|
234
|
+
} = config;
|
|
235
|
+
var errors = {};
|
|
236
|
+
var nbOfTokens = (tokens || []).length;
|
|
237
|
+
['teacherInstructions', 'prompt', 'rationale'].forEach(field => {
|
|
238
|
+
var _config$field;
|
|
239
|
+
|
|
240
|
+
if ((_config$field = config[field]) !== null && _config$field !== void 0 && _config$field.required && !getContent(model[field])) {
|
|
241
|
+
errors[field] = 'This field is required.';
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
var nbOfSelections = (tokens || []).reduce((acc, token) => token.correct ? acc + 1 : acc, 0);
|
|
245
|
+
|
|
246
|
+
if (nbOfTokens < minTokens) {
|
|
247
|
+
errors.tokensError = "There should be at least ".concat(minTokens, " tokens defined.");
|
|
248
|
+
} else if (nbOfTokens > maxTokens) {
|
|
249
|
+
errors.tokensError = "No more than ".concat(maxTokens, " tokens should be defined.");
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
if (nbOfSelections < 1) {
|
|
253
|
+
errors.selectionsError = 'There should be at least 1 token selected.';
|
|
254
|
+
} else if (nbOfSelections > maxSelections) {
|
|
255
|
+
errors.selectionsError = "No more than ".concat(maxSelections, " tokens should be selected.");
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
return errors;
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
export { createCorrectResponseSession, createDefaultModel, getCorrectness, getPartialScore, model, normalize, normalizeSession, outcome, validate };
|
|
262
|
+
//# sourceMappingURL=controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.js","sources":["../controller/src/defaults.js","../controller/src/index.js"],"sourcesContent":["export default {\n feedbackEnabled: false,\n highlightChoices: false,\n maxSelections: 0,\n mode: 'sentence',\n partialScoring: false,\n prompt: '',\n promptEnabled: true,\n rationale: '',\n rationaleEnabled: true,\n scoringType: 'auto',\n studentInstructionsEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n text: '',\n tokens: [],\n toolbarEditorPosition: 'bottom',\n};\n","import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport { getFeedbackForCorrectness } from '@pie-lib/feedback';\nimport { partialScoring } from '@pie-lib/controller-utils';\nimport defaults from './defaults';\n\nconst log = debug('@pie-element:select-text:controller');\n\nconst equalTokens = (token1 = {}, token2 = {}) =>\n (token1?.start === token2?.start && token1?.end === token2?.end) ||\n // this case is used for the cases when the token's start & end were recalculated\n (token1?.start === token2?.oldStart && token1?.end === token2?.oldEnd);\n\nconst normalizeTokens = (tokens = [], selectedTokens = [], evaluateMode = false) =>\n (tokens || []).map((token) => {\n const isCorrect = !!token.correct;\n // search if correct token is missing from session\n const isMissing = isCorrect && !(selectedTokens || []).find((selectedToken) => equalTokens(token, selectedToken));\n\n return {\n ...token,\n correct: evaluateMode ? isCorrect : undefined,\n isMissing: evaluateMode ? isMissing : undefined,\n };\n });\n\nexport const getCorrectness = (tokens, selected) => {\n const correct = tokens.filter((t) => t.correct === true);\n\n if (correct.length === 0) {\n return 'unknown';\n }\n\n const correctSelected = getCorrectSelected(tokens, selected);\n\n if (correctSelected.length === selected.length) {\n if (correctSelected.length === correct.length) {\n return 'correct';\n } else if (correctSelected.length > 0) {\n return 'partially-correct';\n }\n }\n\n if (correctSelected.length > 0) {\n return 'partially-correct';\n }\n\n return 'incorrect';\n};\n\nconst getCorrectSelected = (tokens, selected) =>\n (selected || []).filter((s) => tokens.findIndex((token) => token.correct && equalTokens(token, s)) !== -1);\n\nexport const getPartialScore = (question, session, totalCorrect) => {\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n const correctCount = getCorrectSelected(question.tokens, session.selectedTokens).length;\n const correctTokens = (question.tokens || []).filter((t) => t.correct === true);\n const extraSelected = session.selectedTokens ? session.selectedTokens.length > correctTokens.length : 0;\n const incorrectCount = extraSelected ? session.selectedTokens && session.selectedTokens.length - correctCount : 0;\n const count = correctCount - incorrectCount;\n const positiveCount = count < 0 ? 0 : count;\n\n return totalCorrect.length ? parseFloat((positiveCount / totalCorrect.length).toFixed(2)) : 0;\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\n session = normalizeSession(session);\n\n if (env.mode !== 'evaluate') {\n resolve({ score: undefined, completed: undefined });\n } else {\n const enabled = partialScoring.enabled(question, env, true);\n const totalCorrect = question.tokens.filter((t) => t.correct);\n const score = getPartialScore(question, session, totalCorrect);\n resolve({\n score: enabled ? score : score === 1 ? 1 : 0,\n });\n }\n });\n\nexport function createDefaultModel(model = {}) {\n return new Promise((resolve) => {\n resolve({ ...defaults, ...model });\n });\n}\n\nexport const normalizeSession = (session) => ({ selectedTokens: [], ...session });\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\nexport const model = (question, session, env) => {\n session = session || { selectedToken: [] };\n session.selectedTokens = session.selectedTokens || [];\n const normalizedQuestion = normalize(question);\n\n return new Promise((resolve) => {\n log('[model]', 'normalizedQuestion: ', normalizedQuestion);\n log('[model]', 'session: ', session);\n\n const tokens = normalizeTokens(normalizedQuestion.tokens, session.selectedTokens, env.mode === 'evaluate');\n log('[model] tokens:', tokens);\n\n const correctness =\n env.mode === 'evaluate' ? getCorrectness(normalizedQuestion.tokens, session.selectedTokens) : undefined;\n\n const fb =\n env.mode === 'evaluate' && normalizedQuestion.feedbackEnabled\n ? getFeedbackForCorrectness(correctness, normalizedQuestion.feedback)\n : Promise.resolve(undefined);\n\n fb.then((feedback) => {\n const out = {\n tokens,\n highlightChoices: normalizedQuestion.highlightChoices,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n text: normalizedQuestion.text,\n disabled: env.mode !== 'gather',\n maxSelections: normalizedQuestion.maxSelections,\n correctness,\n env,\n feedback,\n incorrect: env.mode === 'evaluate' ? correctness !== 'correct' : undefined,\n language: normalizedQuestion.language,\n extraCSSRules: normalizedQuestion.extraCSSRules,\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 resolve(out);\n });\n });\n};\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { tokens } = question;\n const selectedTokens = tokens.filter((t) => t.correct);\n\n resolve({\n id: '1',\n selectedTokens,\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, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { tokens } = model;\n const { minTokens = 2, maxTokens, maxSelections } = config;\n const errors = {};\n const nbOfTokens = (tokens || []).length;\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 const nbOfSelections = (tokens || []).reduce((acc, token) => (token.correct ? acc + 1 : acc), 0);\n\n if (nbOfTokens < minTokens) {\n errors.tokensError = `There should be at least ${minTokens} tokens defined.`;\n } else if (nbOfTokens > maxTokens) {\n errors.tokensError = `No more than ${maxTokens} tokens should be defined.`;\n }\n\n if (nbOfSelections < 1) {\n errors.selectionsError = 'There should be at least 1 token selected.';\n } else if (nbOfSelections > maxSelections) {\n errors.selectionsError = `No more than ${maxSelections} tokens should be selected.`;\n }\n\n return errors;\n};\n"],"names":["feedbackEnabled","highlightChoices","maxSelections","mode","partialScoring","prompt","promptEnabled","rationale","rationaleEnabled","scoringType","studentInstructionsEnabled","teacherInstructions","teacherInstructionsEnabled","text","tokens","toolbarEditorPosition","log","debug","equalTokens","token1","token2","start","end","oldStart","oldEnd","normalizeTokens","selectedTokens","evaluateMode","map","token","isCorrect","correct","isMissing","find","selectedToken","_objectSpread","undefined","getCorrectness","selected","filter","t","length","correctSelected","getCorrectSelected","s","findIndex","getPartialScore","question","session","totalCorrect","isEmpty","correctCount","correctTokens","extraSelected","incorrectCount","count","positiveCount","parseFloat","toFixed","outcome","env","Promise","resolve","score","empty","normalizeSession","completed","enabled","createDefaultModel","model","defaults","normalize","normalizedQuestion","correctness","fb","getFeedbackForCorrectness","feedback","then","out","disabled","incorrect","language","extraCSSRules","role","createCorrectResponseSession","id","getContent","html","replace","validate","config","minTokens","maxTokens","errors","nbOfTokens","forEach","field","required","nbOfSelections","reduce","acc","tokensError","selectionsError"],"mappings":"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"}
|