@pie-element/select-text 8.17.3 → 8.17.4-next.11

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.
@@ -27,24 +27,26 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
27
27
 
28
28
  var log = (0, _debug["default"])('@pie-element:select-text:controller');
29
29
 
30
- var isAnswerSelected = function isAnswerSelected(token, selectedToken) {
31
- return token && selectedToken && token.correct === true && !(token.start === selectedToken.start && token.end === selectedToken.end || token.start === selectedToken.oldStart && token.end === selectedToken.oldEnd);
30
+ var equalTokens = function equalTokens() {
31
+ var token1 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
32
+ var token2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
33
+ 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
34
+ (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);
32
35
  };
33
36
 
34
- var buildTokens = function buildTokens(tokens, selectedTokens, evaluateMode) {
35
- tokens = tokens || [];
36
- selectedTokens = selectedTokens || [];
37
- return tokens.map(function (t) {
38
- // map the correct answer that are missing from session
39
- var isNotSelected = selectedTokens.findIndex(function (selectedToken) {
40
- return isAnswerSelected(t, selectedToken);
41
- }) === -1;
42
- return Object.assign({}, t, evaluateMode ? {
43
- correct: !!t.correct,
44
- isMissing: !isNotSelected
45
- } : {
46
- correct: undefined,
47
- isMissing: undefined
37
+ var normalizeTokens = function normalizeTokens() {
38
+ var tokens = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
39
+ var selectedTokens = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
40
+ var evaluateMode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
41
+ return (tokens || []).map(function (token) {
42
+ var isCorrect = !!token.correct; // search if correct token is missing from session
43
+
44
+ var isMissing = isCorrect && !(selectedTokens || []).find(function (selectedToken) {
45
+ return equalTokens(token, selectedToken);
46
+ });
47
+ return _objectSpread(_objectSpread({}, token), {}, {
48
+ correct: evaluateMode ? isCorrect : undefined,
49
+ isMissing: evaluateMode ? isMissing : undefined
48
50
  });
49
51
  });
50
52
  };
@@ -79,24 +81,18 @@ exports.getCorrectness = getCorrectness;
79
81
 
80
82
  var getCorrectSelected = function getCorrectSelected(tokens, selected) {
81
83
  return (selected || []).filter(function (s) {
82
- var index = tokens.findIndex(function (c) {
83
- return c.correct && (c.start === s.start && c.end === s.end || // this case is used for the cases when the token's start & end were recalculated
84
- c.start === s.oldStart && c.end === s.oldEnd);
85
- });
86
- return index !== -1;
84
+ return tokens.findIndex(function (token) {
85
+ return token.correct && equalTokens(token, s);
86
+ }) !== -1;
87
87
  });
88
88
  };
89
89
 
90
- var getCorrectCount = function getCorrectCount(tokens, selected) {
91
- return getCorrectSelected(tokens, selected).length;
92
- };
93
-
94
90
  var getPartialScore = function getPartialScore(question, session, totalCorrect) {
95
91
  if (!session || (0, _isEmpty["default"])(session)) {
96
92
  return 0;
97
93
  }
98
94
 
99
- var correctCount = getCorrectCount(question.tokens, session.selectedTokens);
95
+ var correctCount = getCorrectSelected(question.tokens, session.selectedTokens).length;
100
96
  var correctTokens = (question.tokens || []).filter(function (t) {
101
97
  return t.correct === true;
102
98
  });
@@ -148,10 +144,10 @@ function createDefaultModel() {
148
144
  });
149
145
  }
150
146
 
151
- var normalizeSession = function normalizeSession(s) {
147
+ var normalizeSession = function normalizeSession(session) {
152
148
  return _objectSpread({
153
149
  selectedTokens: []
154
- }, s);
150
+ }, session);
155
151
  };
156
152
 
157
153
  exports.normalizeSession = normalizeSession;
@@ -177,8 +173,8 @@ var model = function model(question, session, env) {
177
173
  return new Promise(function (resolve) {
178
174
  log('[model]', 'normalizedQuestion: ', normalizedQuestion);
179
175
  log('[model]', 'session: ', session);
180
- var tokens = buildTokens(normalizedQuestion.tokens, session.selectedTokens, env.mode === 'evaluate');
181
- log('tokens:', tokens);
176
+ var tokens = normalizeTokens(normalizedQuestion.tokens, session.selectedTokens, env.mode === 'evaluate');
177
+ log('[model] tokens:', tokens);
182
178
  var correctness = env.mode === 'evaluate' ? getCorrectness(normalizedQuestion.tokens, session.selectedTokens) : undefined;
183
179
  var fb = env.mode === 'evaluate' && normalizedQuestion.feedbackEnabled ? (0, _feedback.getFeedbackForCorrectness)(correctness, normalizedQuestion.feedback) : Promise.resolve(undefined);
184
180
  fb.then(function (feedback) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["log","isAnswerSelected","token","selectedToken","correct","start","end","oldStart","oldEnd","buildTokens","tokens","selectedTokens","evaluateMode","map","t","isNotSelected","findIndex","Object","assign","isMissing","undefined","getCorrectness","selected","filter","length","correctSelected","getCorrectSelected","s","index","c","getCorrectCount","getPartialScore","question","session","totalCorrect","correctCount","correctTokens","extraSelected","incorrectCount","count","positiveCount","parseFloat","toFixed","outcome","env","Promise","resolve","score","empty","normalizeSession","mode","completed","enabled","partialScoring","createDefaultModel","model","defaults","normalize","feedbackEnabled","rationaleEnabled","promptEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","normalizedQuestion","correctness","fb","feedback","then","out","highlightChoices","prompt","text","disabled","maxSelections","incorrect","language","role","rationale","teacherInstructions","createCorrectResponseSession","id","getInnerText","html","replaceAll","getContent","replace","validate","config","minTokens","maxTokens","errors","nbOfTokens","forEach","field","required","nbOfSelections","reduce","acc","tokensError","selectionsError"],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport { getFeedbackForCorrectness } from '@pie-lib/pie-toolbox/feedback';\nimport { partialScoring } from '@pie-lib/pie-toolbox/controller-utils';\nimport defaults from './defaults';\n\nconst log = debug('@pie-element:select-text:controller');\n\nconst isAnswerSelected = (token, selectedToken) =>\n token &&\n selectedToken &&\n token.correct === true &&\n !(\n (token.start === selectedToken.start && token.end === selectedToken.end) ||\n (token.start === selectedToken.oldStart && token.end === selectedToken.oldEnd)\n );\n\nconst buildTokens = (tokens, selectedTokens, evaluateMode) => {\n tokens = tokens || [];\n selectedTokens = selectedTokens || [];\n\n return tokens.map((t) => {\n // map the correct answer that are missing from session\n const isNotSelected = selectedTokens.findIndex((selectedToken) => isAnswerSelected(t, selectedToken)) === -1;\n return Object.assign(\n {},\n t,\n evaluateMode ? { correct: !!t.correct, isMissing: !isNotSelected } : { correct: undefined, isMissing: undefined },\n );\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 return (selected || []).filter((s) => {\n const index = tokens.findIndex((c) => {\n return (\n c.correct &&\n ((c.start === s.start && c.end === s.end) ||\n // this case is used for the cases when the token's start & end were recalculated\n (c.start === s.oldStart && c.end === s.oldEnd))\n );\n });\n return index !== -1;\n });\n};\n\nconst getCorrectCount = (tokens, selected) => getCorrectSelected(tokens, selected).length;\n\nexport const getPartialScore = (question, session, totalCorrect) => {\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n const correctCount = getCorrectCount(question.tokens, session.selectedTokens);\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({\n ...defaults,\n ...model,\n });\n });\n}\n\nexport const normalizeSession = (s) => ({\n selectedTokens: [],\n ...s,\n});\n\nexport const normalize = (question) => ({\n feedbackEnabled: false,\n rationaleEnabled: true,\n promptEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n ...question,\n});\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 const tokens = buildTokens(normalizedQuestion.tokens, session.selectedTokens, env.mode === 'evaluate');\n log('tokens:', tokens);\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 };\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 and iframe\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe)([^>]+)>)/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"],"file":"index.js"}
1
+ {"version":3,"sources":["../src/index.js"],"names":["log","equalTokens","token1","token2","start","end","oldStart","oldEnd","normalizeTokens","tokens","selectedTokens","evaluateMode","map","token","isCorrect","correct","isMissing","find","selectedToken","undefined","getCorrectness","selected","filter","t","length","correctSelected","getCorrectSelected","s","findIndex","getPartialScore","question","session","totalCorrect","correctCount","correctTokens","extraSelected","incorrectCount","count","positiveCount","parseFloat","toFixed","outcome","env","Promise","resolve","score","empty","normalizeSession","mode","completed","enabled","partialScoring","createDefaultModel","model","defaults","normalize","feedbackEnabled","rationaleEnabled","promptEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","normalizedQuestion","correctness","fb","feedback","then","out","highlightChoices","prompt","text","disabled","maxSelections","incorrect","language","role","rationale","teacherInstructions","createCorrectResponseSession","id","getInnerText","html","replaceAll","getContent","replace","validate","config","minTokens","maxTokens","errors","nbOfTokens","forEach","field","required","nbOfSelections","reduce","acc","tokensError","selectionsError"],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport { getFeedbackForCorrectness } from '@pie-lib/pie-toolbox/feedback';\nimport { partialScoring } from '@pie-lib/pie-toolbox/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({\n ...defaults,\n ...model,\n });\n });\n}\n\nexport const normalizeSession = (session) => ({ selectedTokens: [], ...session });\n\nexport const normalize = (question) => ({\n feedbackEnabled: false,\n rationaleEnabled: true,\n promptEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n ...question,\n});\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 };\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 and iframe\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe)([^>]+)>)/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"],"file":"index.js"}
@@ -19946,29 +19946,23 @@ var defaults = {
19946
19946
  tokens: tokens(),
19947
19947
  };
19948
19948
 
19949
- const isAnswerSelected = (token, selectedToken) =>
19950
- token &&
19951
- selectedToken &&
19952
- token.correct === true &&
19953
- !(
19954
- (token.start === selectedToken.start && token.end === selectedToken.end) ||
19955
- (token.start === selectedToken.oldStart && token.end === selectedToken.oldEnd)
19956
- );
19957
-
19958
- const buildTokens = (tokens, selectedTokens, evaluateMode) => {
19959
- tokens = tokens || [];
19960
- selectedTokens = selectedTokens || [];
19961
-
19962
- return tokens.map((t) => {
19963
- // map the correct answer that are missing from session
19964
- const isNotSelected = selectedTokens.findIndex((selectedToken) => isAnswerSelected(t, selectedToken)) === -1;
19965
- return Object.assign(
19966
- {},
19967
- t,
19968
- evaluateMode ? { correct: !!t.correct, isMissing: !isNotSelected } : { correct: undefined, isMissing: undefined },
19969
- );
19949
+ const equalTokens = (token1 = {}, token2 = {}) =>
19950
+ (token1?.start === token2?.start && token1?.end === token2?.end) ||
19951
+ // this case is used for the cases when the token's start & end were recalculated
19952
+ (token1?.start === token2?.oldStart && token1?.end === token2?.oldEnd);
19953
+
19954
+ const normalizeTokens = (tokens = [], selectedTokens = [], evaluateMode = false) =>
19955
+ (tokens || []).map((token) => {
19956
+ const isCorrect = !!token.correct;
19957
+ // search if correct token is missing from session
19958
+ const isMissing = isCorrect && !(selectedTokens || []).find((selectedToken) => equalTokens(token, selectedToken));
19959
+
19960
+ return {
19961
+ ...token,
19962
+ correct: evaluateMode ? isCorrect : undefined,
19963
+ isMissing: evaluateMode ? isMissing : undefined,
19964
+ };
19970
19965
  });
19971
- };
19972
19966
 
19973
19967
  const getCorrectness = (tokens, selected) => {
19974
19968
  const correct = tokens.filter((t) => t.correct === true);
@@ -19994,28 +19988,15 @@ const getCorrectness = (tokens, selected) => {
19994
19988
  return 'incorrect';
19995
19989
  };
19996
19990
 
19997
- const getCorrectSelected = (tokens, selected) => {
19998
- return (selected || []).filter((s) => {
19999
- const index = tokens.findIndex((c) => {
20000
- return (
20001
- c.correct &&
20002
- ((c.start === s.start && c.end === s.end) ||
20003
- // this case is used for the cases when the token's start & end were recalculated
20004
- (c.start === s.oldStart && c.end === s.oldEnd))
20005
- );
20006
- });
20007
- return index !== -1;
20008
- });
20009
- };
20010
-
20011
- const getCorrectCount = (tokens, selected) => getCorrectSelected(tokens, selected).length;
19991
+ const getCorrectSelected = (tokens, selected) =>
19992
+ (selected || []).filter((s) => tokens.findIndex((token) => token.correct && equalTokens(token, s)) !== -1);
20012
19993
 
20013
19994
  const getPartialScore = (question, session, totalCorrect) => {
20014
19995
  if (!session || isEmpty_1(session)) {
20015
19996
  return 0;
20016
19997
  }
20017
19998
 
20018
- const correctCount = getCorrectCount(question.tokens, session.selectedTokens);
19999
+ const correctCount = getCorrectSelected(question.tokens, session.selectedTokens).length;
20019
20000
  const correctTokens = (question.tokens || []).filter((t) => t.correct === true);
20020
20001
  const extraSelected = session.selectedTokens ? session.selectedTokens.length > correctTokens.length : 0;
20021
20002
  const incorrectCount = extraSelected ? session.selectedTokens && session.selectedTokens.length - correctCount : 0;
@@ -20054,10 +20035,7 @@ function createDefaultModel(model = {}) {
20054
20035
  });
20055
20036
  }
20056
20037
 
20057
- const normalizeSession = (s) => ({
20058
- selectedTokens: [],
20059
- ...s,
20060
- });
20038
+ const normalizeSession = (session) => ({ selectedTokens: [], ...session });
20061
20039
 
20062
20040
  const normalize = (question) => ({
20063
20041
  feedbackEnabled: false,
@@ -20074,7 +20052,9 @@ const model = (question, session, env) => {
20074
20052
  const normalizedQuestion = normalize(question);
20075
20053
 
20076
20054
  return new Promise((resolve) => {
20077
- const tokens = buildTokens(normalizedQuestion.tokens, session.selectedTokens, env.mode === 'evaluate');
20055
+
20056
+ const tokens = normalizeTokens(normalizedQuestion.tokens, session.selectedTokens, env.mode === 'evaluate');
20057
+
20078
20058
  const correctness =
20079
20059
  env.mode === 'evaluate' ? getCorrectness(normalizedQuestion.tokens, session.selectedTokens) : undefined;
20080
20060
 
package/module/index.html CHANGED
@@ -2,7 +2,7 @@
2
2
  <!doctype html>
3
3
  <html>
4
4
  <head>
5
- <title>@pie-element/select-text@8.17.2</title>
5
+ <title>@pie-element/select-text@8.17.3</title>
6
6
  <script
7
7
  type="module"
8
8
  src="https://cdn.jsdelivr.net/npm/@pslb/demo-el@^1.0.0/dist/demo-el/demo-el.esm.js"></script>
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pie-element/select-text",
3
- "version": "8.17.2",
3
+ "version": "8.17.3",
4
4
  "modules": [
5
5
  {
6
6
  "name": "@pie-lib/pie-toolbox-math-rendering-module",
package/module/print.html CHANGED
@@ -2,7 +2,7 @@
2
2
  <!doctype html>
3
3
  <html>
4
4
  <head>
5
- <title>@pie-element/select-text@8.17.2</title>
5
+ <title>@pie-element/select-text@8.17.3</title>
6
6
  <link
7
7
  href="https://fonts.googleapis.com/css?family=Roboto&display=swap"
8
8
  rel="stylesheet"
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "access": "public"
5
5
  },
6
6
  "repository": "pie-framework/pie-elements",
7
- "version": "8.17.3",
7
+ "version": "8.17.4-next.11+ca20fee23",
8
8
  "description": "",
9
9
  "dependencies": {
10
10
  "@material-ui/core": "^3.9.2",
@@ -16,7 +16,7 @@
16
16
  },
17
17
  "author": "",
18
18
  "license": "ISC",
19
- "gitHead": "f81c56a1ec80f089945f538d35ec91af8e278e75",
19
+ "gitHead": "ca20fee234e0e3c6acc638563e8efdd56d63c5db",
20
20
  "scripts": {
21
21
  "postpublish": "../../scripts/postpublish"
22
22
  },