@pie-element/select-text 11.0.1-next.0 → 11.0.1

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.
@@ -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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"}