@pie-element/select-text 11.0.1 → 11.0.3-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/configure/package.json +4 -4
- package/controller/package.json +3 -3
- package/esm/configure.css +847 -0
- package/esm/configure.js +339 -21724
- package/esm/configure.js.map +1 -1
- package/esm/controller.css +847 -0
- package/esm/controller.js +63 -98
- package/esm/controller.js.map +1 -1
- package/esm/element.css +847 -0
- package/esm/element.js +61 -7476
- package/esm/element.js.map +1 -1
- package/esm/print.css +847 -0
- package/esm/print.js +54 -7466
- package/esm/print.js.map +1 -1
- package/module/configure.js +1 -1
- package/module/controller.js +82 -47
- 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 +6 -6
package/esm/controller.js
CHANGED
|
@@ -3,45 +3,22 @@ import isEmpty from 'lodash/isEmpty';
|
|
|
3
3
|
import { getFeedbackForCorrectness } from '@pie-lib/feedback';
|
|
4
4
|
import { partialScoring } from '@pie-lib/controller-utils';
|
|
5
5
|
|
|
6
|
-
function
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
}
|
|
6
|
+
function _extends() {
|
|
7
|
+
_extends = Object.assign || function (target) {
|
|
8
|
+
for (var i = 1; i < arguments.length; i++) {
|
|
9
|
+
var source = arguments[i];
|
|
10
|
+
|
|
11
|
+
for (var key in source) {
|
|
12
|
+
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
13
|
+
target[key] = source[key];
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
31
17
|
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
}
|
|
18
|
+
return target;
|
|
19
|
+
};
|
|
43
20
|
|
|
44
|
-
return
|
|
21
|
+
return _extends.apply(this, arguments);
|
|
45
22
|
}
|
|
46
23
|
|
|
47
24
|
var defaults = {
|
|
@@ -63,38 +40,29 @@ var defaults = {
|
|
|
63
40
|
toolbarEditorPosition: 'bottom'
|
|
64
41
|
};
|
|
65
42
|
|
|
66
|
-
|
|
43
|
+
const log = debug('@pie-element:select-text:controller');
|
|
67
44
|
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
};
|
|
45
|
+
const equalTokens = (token1 = {}, token2 = {}) => (token1 == null ? void 0 : token1.start) === (token2 == null ? void 0 : token2.start) && (token1 == null ? void 0 : token1.end) === (token2 == null ? void 0 : token2.end) || // this case is used for the cases when the token's start & end were recalculated
|
|
46
|
+
(token1 == null ? void 0 : token1.start) === (token2 == null ? void 0 : token2.oldStart) && (token1 == null ? void 0 : token1.end) === (token2 == null ? void 0 : token2.oldEnd);
|
|
74
47
|
|
|
75
|
-
|
|
76
|
-
|
|
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
|
|
48
|
+
const normalizeTokens = (tokens = [], selectedTokens = [], evaluateMode = false) => (tokens || []).map(token => {
|
|
49
|
+
const isCorrect = !!token.correct; // search if correct token is missing from session
|
|
81
50
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
});
|
|
51
|
+
const isMissing = isCorrect && !(selectedTokens || []).find(selectedToken => equalTokens(token, selectedToken));
|
|
52
|
+
return _extends({}, token, {
|
|
53
|
+
correct: evaluateMode ? isCorrect : undefined,
|
|
54
|
+
isMissing: evaluateMode ? isMissing : undefined
|
|
87
55
|
});
|
|
88
|
-
};
|
|
56
|
+
});
|
|
89
57
|
|
|
90
|
-
|
|
91
|
-
|
|
58
|
+
const getCorrectness = (tokens, selected) => {
|
|
59
|
+
const correct = tokens.filter(t => t.correct === true);
|
|
92
60
|
|
|
93
61
|
if (correct.length === 0) {
|
|
94
62
|
return 'unknown';
|
|
95
63
|
}
|
|
96
64
|
|
|
97
|
-
|
|
65
|
+
const correctSelected = getCorrectSelected(tokens, selected);
|
|
98
66
|
|
|
99
67
|
if (correctSelected.length === selected.length) {
|
|
100
68
|
if (correctSelected.length === correct.length) {
|
|
@@ -111,22 +79,22 @@ var getCorrectness = (tokens, selected) => {
|
|
|
111
79
|
return 'incorrect';
|
|
112
80
|
};
|
|
113
81
|
|
|
114
|
-
|
|
82
|
+
const getCorrectSelected = (tokens, selected) => (selected || []).filter(s => tokens.findIndex(token => token.correct && equalTokens(token, s)) !== -1);
|
|
115
83
|
|
|
116
|
-
|
|
84
|
+
const getPartialScore = (question, session, totalCorrect) => {
|
|
117
85
|
if (!session || isEmpty(session)) {
|
|
118
86
|
return 0;
|
|
119
87
|
}
|
|
120
88
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
89
|
+
const correctCount = getCorrectSelected(question.tokens, session.selectedTokens).length;
|
|
90
|
+
const correctTokens = (question.tokens || []).filter(t => t.correct === true);
|
|
91
|
+
const extraSelected = session.selectedTokens ? session.selectedTokens.length > correctTokens.length : 0;
|
|
92
|
+
const incorrectCount = extraSelected ? session.selectedTokens && session.selectedTokens.length - correctCount : 0;
|
|
93
|
+
const count = correctCount - incorrectCount;
|
|
94
|
+
const positiveCount = count < 0 ? 0 : count;
|
|
127
95
|
return totalCorrect.length ? parseFloat((positiveCount / totalCorrect.length).toFixed(2)) : 0;
|
|
128
96
|
};
|
|
129
|
-
|
|
97
|
+
const outcome = (question, session, env) => new Promise(resolve => {
|
|
130
98
|
if (!session || isEmpty(session)) {
|
|
131
99
|
resolve({
|
|
132
100
|
score: 0,
|
|
@@ -142,39 +110,38 @@ var outcome = (question, session, env) => new Promise(resolve => {
|
|
|
142
110
|
completed: undefined
|
|
143
111
|
});
|
|
144
112
|
} else {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
113
|
+
const enabled = partialScoring.enabled(question, env, true);
|
|
114
|
+
const totalCorrect = question.tokens.filter(t => t.correct);
|
|
115
|
+
const score = getPartialScore(question, session, totalCorrect);
|
|
148
116
|
resolve({
|
|
149
117
|
score: enabled ? score : score === 1 ? 1 : 0
|
|
150
118
|
});
|
|
151
119
|
}
|
|
152
120
|
});
|
|
153
|
-
function createDefaultModel() {
|
|
154
|
-
var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
121
|
+
function createDefaultModel(model = {}) {
|
|
155
122
|
return new Promise(resolve => {
|
|
156
|
-
resolve(
|
|
123
|
+
resolve(_extends({}, defaults, model));
|
|
157
124
|
});
|
|
158
125
|
}
|
|
159
|
-
|
|
126
|
+
const normalizeSession = session => _extends({
|
|
160
127
|
selectedTokens: []
|
|
161
128
|
}, session);
|
|
162
|
-
|
|
163
|
-
|
|
129
|
+
const normalize = question => _extends({}, defaults, question);
|
|
130
|
+
const model = (question, session, env) => {
|
|
164
131
|
session = session || {
|
|
165
132
|
selectedToken: []
|
|
166
133
|
};
|
|
167
134
|
session.selectedTokens = session.selectedTokens || [];
|
|
168
|
-
|
|
135
|
+
const normalizedQuestion = normalize(question);
|
|
169
136
|
return new Promise(resolve => {
|
|
170
137
|
log('[model]', 'normalizedQuestion: ', normalizedQuestion);
|
|
171
138
|
log('[model]', 'session: ', session);
|
|
172
|
-
|
|
139
|
+
const tokens = normalizeTokens(normalizedQuestion.tokens, session.selectedTokens, env.mode === 'evaluate');
|
|
173
140
|
log('[model] tokens:', tokens);
|
|
174
|
-
|
|
175
|
-
|
|
141
|
+
const correctness = env.mode === 'evaluate' ? getCorrectness(normalizedQuestion.tokens, session.selectedTokens) : undefined;
|
|
142
|
+
const fb = env.mode === 'evaluate' && normalizedQuestion.feedbackEnabled ? getFeedbackForCorrectness(correctness, normalizedQuestion.feedback) : Promise.resolve(undefined);
|
|
176
143
|
fb.then(feedback => {
|
|
177
|
-
|
|
144
|
+
const out = {
|
|
178
145
|
tokens,
|
|
179
146
|
highlightChoices: normalizedQuestion.highlightChoices,
|
|
180
147
|
prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,
|
|
@@ -201,13 +168,13 @@ var model = (question, session, env) => {
|
|
|
201
168
|
});
|
|
202
169
|
});
|
|
203
170
|
};
|
|
204
|
-
|
|
171
|
+
const createCorrectResponseSession = (question, env) => {
|
|
205
172
|
return new Promise(resolve => {
|
|
206
173
|
if (env.mode !== 'evaluate' && env.role === 'instructor') {
|
|
207
|
-
|
|
174
|
+
const {
|
|
208
175
|
tokens
|
|
209
176
|
} = question;
|
|
210
|
-
|
|
177
|
+
const selectedTokens = tokens.filter(t => t.correct);
|
|
211
178
|
resolve({
|
|
212
179
|
id: '1',
|
|
213
180
|
selectedTokens
|
|
@@ -219,40 +186,38 @@ var createCorrectResponseSession = (question, env) => {
|
|
|
219
186
|
}; // remove all html tags
|
|
220
187
|
|
|
221
188
|
|
|
222
|
-
|
|
189
|
+
const getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
|
|
223
190
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
227
|
-
var {
|
|
191
|
+
const validate = (model = {}, config = {}) => {
|
|
192
|
+
const {
|
|
228
193
|
tokens
|
|
229
194
|
} = model;
|
|
230
|
-
|
|
195
|
+
const {
|
|
231
196
|
minTokens = 2,
|
|
232
197
|
maxTokens,
|
|
233
198
|
maxSelections
|
|
234
199
|
} = config;
|
|
235
|
-
|
|
236
|
-
|
|
200
|
+
const errors = {};
|
|
201
|
+
const nbOfTokens = (tokens || []).length;
|
|
237
202
|
['teacherInstructions', 'prompt', 'rationale'].forEach(field => {
|
|
238
203
|
var _config$field;
|
|
239
204
|
|
|
240
|
-
if ((_config$field = config[field])
|
|
205
|
+
if ((_config$field = config[field]) != null && _config$field.required && !getContent(model[field])) {
|
|
241
206
|
errors[field] = 'This field is required.';
|
|
242
207
|
}
|
|
243
208
|
});
|
|
244
|
-
|
|
209
|
+
const nbOfSelections = (tokens || []).reduce((acc, token) => token.correct ? acc + 1 : acc, 0);
|
|
245
210
|
|
|
246
211
|
if (nbOfTokens < minTokens) {
|
|
247
|
-
errors.tokensError =
|
|
212
|
+
errors.tokensError = `There should be at least ${minTokens} tokens defined.`;
|
|
248
213
|
} else if (nbOfTokens > maxTokens) {
|
|
249
|
-
errors.tokensError =
|
|
214
|
+
errors.tokensError = `No more than ${maxTokens} tokens should be defined.`;
|
|
250
215
|
}
|
|
251
216
|
|
|
252
217
|
if (nbOfSelections < 1) {
|
|
253
218
|
errors.selectionsError = 'There should be at least 1 token selected.';
|
|
254
219
|
} else if (nbOfSelections > maxSelections) {
|
|
255
|
-
errors.selectionsError =
|
|
220
|
+
errors.selectionsError = `No more than ${maxSelections} tokens should be selected.`;
|
|
256
221
|
}
|
|
257
222
|
|
|
258
223
|
return errors;
|
package/esm/controller.js.map
CHANGED
|
@@ -1 +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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"}
|
|
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","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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"}
|