@pie-element/math-inline 5.6.0 → 5.6.1-beta.587

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/CHANGELOG.md +509 -0
  2. package/configure/CHANGELOG.md +471 -0
  3. package/configure/lib/configure.js +73 -31
  4. package/configure/lib/configure.js.map +1 -1
  5. package/configure/lib/defaults.js +37 -2
  6. package/configure/lib/defaults.js.map +1 -1
  7. package/configure/lib/general-config-block.js +123 -29
  8. package/configure/lib/general-config-block.js.map +1 -1
  9. package/configure/lib/index.js +31 -3
  10. package/configure/lib/index.js.map +1 -1
  11. package/configure/lib/response.js +90 -37
  12. package/configure/lib/response.js.map +1 -1
  13. package/configure/lib/utils.js +18 -1
  14. package/configure/lib/utils.js.map +1 -1
  15. package/configure/package.json +7 -8
  16. package/controller/CHANGELOG.md +145 -0
  17. package/controller/lib/defaults.js +2 -1
  18. package/controller/lib/defaults.js.map +1 -1
  19. package/controller/lib/index.js +148 -131
  20. package/controller/lib/index.js.map +1 -1
  21. package/controller/lib/utils.js.map +1 -1
  22. package/controller/package.json +4 -4
  23. package/docs/config-schema.json +168 -0
  24. package/docs/config-schema.json.md +132 -1
  25. package/docs/demo/config.js +2 -2
  26. package/docs/demo/generate.js +20 -16
  27. package/docs/demo/session.js +1 -1
  28. package/docs/pie-schema.json +128 -3
  29. package/docs/pie-schema.json.md +107 -3
  30. package/lib/index.js +7 -4
  31. package/lib/index.js.map +1 -1
  32. package/lib/main.js +230 -55
  33. package/lib/main.js.map +1 -1
  34. package/lib/print.js +133 -0
  35. package/lib/print.js.map +1 -0
  36. package/lib/simple-question-block.js +50 -38
  37. package/lib/simple-question-block.js.map +1 -1
  38. package/lib/utils.js.map +1 -1
  39. package/package.json +13 -8
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["log","decimalRegex","decimalCommaRegex","textRegex","decimalWithThousandSeparatorNumberRegex","noNumbers","processAnswerItem","answerItem","isLiteral","newAnswerItem","replace","containsDecimal","validExpressionWithThousandSeparator","stripForStringCompare","expression","match","getResponseCorrectness","model","isOutcome","correctResponses","responses","isAdvanced","responseType","ResponseTypes","advanced","correctness","score","correct","isAnswerCorrect","getIsAnswerCorrect","slice","correctnessObject","stripTargets","answer","numericValues","split","i","length","test","stripped","forEach","stripTarget","handleStringBasedCheck","acceptedValues","answerValueToUse","answerCorrect","acceptedValueToUse","correctResponseItem","correctResponse","concat","Object","keys","alternates","map","alternateId","validation","isLatex","allowThousandsSeparator","e","getCorrectness","question","env","session","mode","completeAnswer","response","createDefaultModel","Promise","resolve","config","defaults","outcome","undefined","completed","empty","normalize","feedbackEnabled","promptEnabled","rationaleEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","normalizedQuestion","simple","fb","feedback","then","base","disabled","view","out","assign","role","rationale","teacherInstructions","prompt","escape","string","simpleSessionResponse","id","advancedSessionResponse","reject","RESPONSE_TOKEN","o","to","t","tt","join","m","RegExp","count","answers","console","shift","value","trim","error","toString","createCorrectResponseSession","toLowerCase"],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport { getFeedbackForCorrectness } from '@pie-lib/feedback';\nimport areValuesEqual from '@pie-lib/math-evaluator';\nimport { ResponseTypes } from './utils';\n\nimport defaults from './defaults';\n\nconst log = debug('@pie-element:math-inline:controller');\nconst decimalRegex = /\\.|,/g;\nconst decimalCommaRegex = /,/g;\nconst textRegex = /\\\\text\\{([^{}]+)\\}/g;\nconst decimalWithThousandSeparatorNumberRegex = /^(?!0+\\.00)(?=.{1,9}(\\.|$))(?!0(?!\\.))\\d{1,3}(,\\d{3})*(\\.\\d+)?$/;\nconst noNumbers = /[^0-9.,]+/g;\n\n/**\n * TODO:\n *\n * We have `stringCheck` which if true disabled 'literal' and 'symbolic' so really it should be a validation method. And if it is what's the difference between it and 'literal'?\n *\n * We should support a equivalence option per correct response like:\n * responses: [ { answer: '..', validation: 'symbolic', alternates: [{ value: '..', validation: 'stringCompare'}, 'abc'] } ]\n *\n * if option is a string it is turned into an object w/ inherited opts.\n *\n * This would override any shared setting at the root.\n */\n\nfunction processAnswerItem(answerItem = '', isLiteral) {\n // looks confusing, but we're replacing U+002D and U+2212 (minus and hyphen) so we have the same symbol everywhere consistently\n // further processing is to be added here if needed\n let newAnswerItem = answerItem.replace('−', '-');\n\n newAnswerItem = newAnswerItem.replace(/\\\\cdot/g, '\\\\times');\n\n // also ignore text nodes, just swap out with empty string\n\n newAnswerItem = newAnswerItem.replace(textRegex, '');\n if (\n containsDecimal(newAnswerItem) && validExpressionWithThousandSeparator(newAnswerItem)\n ) {\n newAnswerItem = newAnswerItem.replace(decimalCommaRegex, '');\n }\n\n newAnswerItem = newAnswerItem.replace(/\\\\ /g, '').replace(/ /g, '');\n\n // eslint-disable-next-line no-useless-escape\n newAnswerItem = newAnswerItem\n .replace(/\\\\%/g, '')\n .replace(/%/g, '');\n\n return isLiteral ? stripForStringCompare(newAnswerItem) : newAnswerItem;\n}\n\nfunction containsDecimal(expression = '') {\n return expression.match(decimalRegex);\n}\n\nconst getResponseCorrectness = (model, answerItem, isOutcome) => {\n const correctResponses = model.responses;\n const isAdvanced = model.responseType === ResponseTypes.advanced;\n\n if (!answerItem) {\n return {\n correctness: 'unanswered',\n score: isOutcome ? 0 : '0%',\n correct: false\n };\n }\n\n const isAnswerCorrect = getIsAnswerCorrect(\n isAdvanced ? correctResponses : correctResponses.slice(0, 1),\n answerItem\n );\n const correctnessObject = {\n correctness: 'incorrect',\n score: isOutcome ? 0 : '0%',\n correct: false\n };\n\n if (isAnswerCorrect) {\n correctnessObject.correctness = 'correct';\n correctnessObject.score = isOutcome ? 1 : '100%';\n correctnessObject.correct = true;\n }\n\n return correctnessObject;\n};\n\nconst stripTargets = [\n /{/g,\n /}/g,\n /\\[/g,\n /]/g,\n /\\\\ /g,\n /\\\\/g,\n /\\\\s/g,\n /left/g,\n /right/g,\n / /g\n];\n\nconst validExpressionWithThousandSeparator = (answer) => {\n const numericValues = answer.split(noNumbers);\n\n for (let i = 0; i < numericValues.length; i++) {\n if (numericValues[i] != '' && containsDecimal(numericValues[i]) && !decimalWithThousandSeparatorNumberRegex.test(numericValues[i])) {\n\n return false;\n }\n }\n\n return true\n}\n\nfunction stripForStringCompare(answer = '') {\n let stripped = answer;\n\n stripTargets.forEach(stripTarget => {\n return (stripped = stripped.replace(stripTarget, ''));\n });\n\n return stripped;\n}\n\nfunction handleStringBasedCheck(acceptedValues, answerItem) {\n let answerValueToUse = processAnswerItem(answerItem, true);\n let answerCorrect = false;\n\n for (let i = 0; i < acceptedValues.length; i++) {\n let acceptedValueToUse = processAnswerItem(acceptedValues[i], true);\n\n answerCorrect = answerValueToUse === acceptedValueToUse;\n\n if (answerCorrect === true) {\n break;\n }\n }\n\n return answerCorrect;\n}\n\nfunction getIsAnswerCorrect(correctResponseItem, answerItem) {\n let answerCorrect = false;\n\n correctResponseItem.forEach(correctResponse => {\n // if not already deemed correct for one of the correct responses\n if (!answerCorrect) {\n const acceptedValues = [correctResponse.answer].concat(\n Object.keys(correctResponse.alternates || {}).map(\n alternateId => correctResponse.alternates[alternateId]\n )\n );\n\n if (correctResponse.validation === 'literal') {\n for (let i = 0; i < acceptedValues.length; i++) {\n let answerValueToUse = processAnswerItem(answerItem, true);\n let acceptedValueToUse = processAnswerItem(acceptedValues[i], true);\n\n if (acceptedValueToUse === answerValueToUse) {\n answerCorrect = true;\n break;\n }\n }\n } else {\n try {\n for (let i = 0; i < acceptedValues.length; i++) {\n // let answerValueToUse = processAnswerItem(answerItem);\n // let acceptedValueToUse = processAnswerItem(acceptedValues[i]);\n\n answerCorrect = areValuesEqual(\n processAnswerItem(acceptedValues[i]),\n processAnswerItem(answerItem),\n {\n isLatex: true,\n allowThousandsSeparator: correctResponse.allowThousandsSeparator\n }\n );\n if (answerCorrect) {\n break;\n }\n }\n } catch (e) {\n log(\n 'Parse failure when evaluating math',\n e,\n correctResponse,\n answerItem\n );\n // try to string check compare, last resort?\n // once invalid models have been weeded out, this'll get removed.\n answerCorrect = handleStringBasedCheck(acceptedValues, answerItem);\n }\n }\n }\n });\n\n return answerCorrect;\n}\n\nconst getCorrectness = (question, env, session, isOutcome) => {\n if (env.mode === 'evaluate') {\n return getResponseCorrectness(\n question,\n question.responseType === ResponseTypes.advanced\n ? (session && session.completeAnswer) || ''\n : session && session.response,\n isOutcome\n );\n }\n};\n\nexport function createDefaultModel(model = {}) {\n return new Promise(resolve => {\n resolve({\n config: {\n ...defaults,\n ...model\n }\n });\n });\n}\n\nexport const outcome = (question, session, env) => {\n return new Promise(resolve => {\n if (env.mode !== 'evaluate') {\n resolve({ score: undefined, completed: undefined });\n } else {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n } else {\n const correctness = getCorrectness(question, env, session, true);\n\n resolve({ score: correctness.score });\n }\n }\n });\n};\n\nexport const normalize = question => ({\n feedbackEnabled: true,\n promptEnabled: true,\n rationaleEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n ...question\n});\n\nexport function model(question, session, env) {\n return new Promise(resolve => {\n const normalizedQuestion = normalize(question);\n const correctness = getCorrectness(normalizedQuestion, env, session);\n const correctResponse = {};\n const { responses, ...config } = normalizedQuestion;\n\n if (config.responseType === ResponseTypes.simple) {\n config.responses = responses.slice(0, 1);\n } else {\n config.responses = responses;\n }\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 base = {\n config,\n correctness,\n feedback,\n disabled: env.mode !== 'gather',\n view: env.mode === 'view'\n };\n\n let out;\n\n if (env.mode === 'evaluate') {\n out = Object.assign(base, {\n correctResponse\n });\n } else {\n out = base;\n\n out.config.responses = [];\n }\n\n if (\n env.role === 'instructor' &&\n (env.mode === 'view' || env.mode === 'evaluate')\n ) {\n out.rationale = normalizedQuestion.rationaleEnabled\n ? normalizedQuestion.rationale\n : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n out.config.rationale = null;\n out.config.teacherInstructions = null;\n }\n\n out.config.prompt = normalizedQuestion.promptEnabled\n ? normalizedQuestion.prompt\n : null;\n\n log('out: ', out);\n resolve(out);\n });\n });\n}\n\nconst escape = string => string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n\nconst simpleSessionResponse = question =>\n new Promise(resolve => {\n const { responses } = question;\n const { answer } = responses ? responses[0] : {};\n resolve({\n id: question.id,\n response: answer,\n completeAnswer: answer\n });\n });\n\nconst advancedSessionResponse = question =>\n new Promise((resolve, reject) => {\n const { responses } = question;\n const { answer } = responses ? responses[0] : {};\n\n try {\n const e = question.expression;\n const RESPONSE_TOKEN = /\\\\{\\\\{\\s*response\\s*\\\\}\\\\}/g;\n\n const o = escape(e).split(RESPONSE_TOKEN);\n const to = o.map(t => (t === '' ? t : t.replace(/\\s+/g, () => ('\\\\s*'))));\n const tt = to.join('(.*)');\n\n const m = answer.match(new RegExp(tt));\n\n const count = o.length - 1;\n\n if (!m) {\n resolve({\n answers: {},\n completeAnswer: answer,\n id: question.id\n });\n\n console.log(`can not find match: ${o} in ${answer}`);\n\n return;\n }\n\n m.shift();\n\n const answers = {};\n\n for (var i = 0; i < count; i++) {\n answers[`r${i + 1}`] = { value: m[i].trim() };\n }\n\n resolve({\n answers,\n completeAnswer: answer,\n id: question.id\n });\n } catch (e) {\n resolve({\n answers: {},\n completeAnswer: answer,\n id: question.id\n });\n\n console.error(e.toString());\n }\n });\n\n\nexport const createCorrectResponseSession = (question, env) => {\n if (env.mode === 'evaluate' || env.role !== 'instructor') {\n // eslint-disable-next-line no-console\n console.error(\n 'can not create correct response session if mode is evaluate or role is not instructor'\n );\n\n return Promise.resolve(null);\n }\n\n if ((question.responseType || '').toLowerCase() === 'simple') {\n return simpleSessionResponse(question, env);\n } else {\n return advancedSessionResponse(question, env);\n }\n};\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../src/index.js"],"names":["log","getResponseCorrectness","model","answerItem","isOutcome","correctResponses","responses","isAdvanced","responseType","ResponseTypes","advanced","correctness","score","correct","isAnswerCorrect","getIsAnswerCorrect","slice","correctnessObject","correctResponseItem","answerCorrect","forEach","correctResponse","opts","mode","validation","defaults","validationDefault","literal","allowTrailingZeros","ignoreOrder","acceptedValues","answer","concat","Object","keys","alternates","map","alternateId","i","length","mv","latexEqual","e","getCorrectness","question","env","session","completeAnswer","response","createDefaultModel","Promise","resolve","config","outcome","undefined","completed","empty","normalize","allowTrailingZerosDefault","ignoreOrderDefault","feedbackEnabled","promptEnabled","rationaleEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","normalizedQuestion","simple","customKeys","fb","feedback","then","base","disabled","view","out","showNote","role","rationale","teacherInstructions","prompt","escape","string","replace","simpleSessionResponse","id","advancedSessionResponse","reject","answers","expression","RESPONSE_TOKEN","o","split","to","t","tt","join","m","match","RegExp","count","console","shift","value","trim","error","toString","createCorrectResponseSession","toLowerCase","validate","maxResponseAreas","responsesErrors","index","reversedAlternates","entries","reverse","alternatesErrors","responseError","key","identicalAnswer","some","val","errors","nbOfResponseAreas","responseAreasError"],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport { getFeedbackForCorrectness } from '@pie-lib/feedback';\nimport { ResponseTypes } from './utils';\n\nimport defaults from './defaults';\n\nimport * as mv from '@pie-framework/math-validation';\n\nconst log = debug('@pie-element:math-inline:controller');\n\nconst getResponseCorrectness = (model, answerItem, isOutcome) => {\n const correctResponses = model.responses;\n const isAdvanced = model.responseType === ResponseTypes.advanced;\n\n if (!answerItem) {\n return {\n correctness: 'unanswered',\n score: isOutcome ? 0 : '0%',\n correct: false,\n };\n }\n\n const isAnswerCorrect = getIsAnswerCorrect(isAdvanced ? correctResponses : correctResponses.slice(0, 1), answerItem);\n\n const correctnessObject = {\n correctness: 'incorrect',\n score: isOutcome ? 0 : '0%',\n correct: false,\n };\n\n if (isAnswerCorrect) {\n correctnessObject.correctness = 'correct';\n correctnessObject.score = isOutcome ? 1 : '100%';\n correctnessObject.correct = true;\n }\n\n return correctnessObject;\n};\n\nfunction getIsAnswerCorrect(correctResponseItem, answerItem) {\n let answerCorrect = false;\n\n (correctResponseItem || []).forEach((correctResponse) => {\n let opts = {\n mode: correctResponse.validation || defaults.validationDefault,\n };\n\n if (opts.mode == 'literal') {\n opts.literal = {\n allowTrailingZeros: correctResponse.allowTrailingZeros || false,\n ignoreOrder: correctResponse.ignoreOrder || false,\n };\n }\n\n if (!answerCorrect) {\n const acceptedValues =\n [correctResponse.answer].concat(\n Object.keys(correctResponse.alternates || {}).map((alternateId) => correctResponse.alternates[alternateId]),\n ) || [];\n\n try {\n for (let i = 0; i < acceptedValues.length; i++) {\n answerCorrect = mv.latexEqual(answerItem, acceptedValues[i], opts);\n\n if (answerCorrect) {\n break;\n }\n }\n } catch (e) {\n log('Parse failure when evaluating math', e, correctResponse, answerItem);\n\n answerCorrect = false;\n }\n }\n });\n\n return answerCorrect;\n}\n\nconst getCorrectness = (question, env, session, isOutcome) => {\n if (env.mode === 'evaluate') {\n return getResponseCorrectness(\n question,\n question.responseType === ResponseTypes.advanced\n ? (session && session.completeAnswer) || ''\n : session && session.response,\n isOutcome,\n );\n }\n};\n\nexport function createDefaultModel(model = {}) {\n return new Promise((resolve) => {\n resolve({\n config: {\n ...defaults,\n ...model,\n },\n });\n });\n}\n\nexport const outcome = (question, session, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate') {\n resolve({ score: undefined, completed: undefined });\n } else {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n } else {\n const correctness = getCorrectness(question, env, session, true);\n\n resolve({ score: correctness.score });\n }\n }\n });\n};\n\nexport const normalize = (question) => {\n // making sure that defaults are set\n if (!isEmpty(question.responses)) {\n question.responses = question.responses.map((correctResponse) => ({\n ...correctResponse,\n validation: correctResponse.validation || question.validationDefault,\n allowTrailingZeros: correctResponse.allowTrailingZeros || question.allowTrailingZerosDefault,\n ignoreOrder: correctResponse.ignoreOrder || question.ignoreOrderDefault,\n }));\n }\n\n return {\n ...defaults,\n feedbackEnabled: true,\n promptEnabled: true,\n rationaleEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n ...question,\n };\n};\n\nexport function model(question, session, env) {\n return new Promise((resolve) => {\n const normalizedQuestion = normalize(question);\n const correctness = getCorrectness(normalizedQuestion, env, session);\n const { responses, ...config } = normalizedQuestion;\n\n if (config.responseType === ResponseTypes.simple) {\n config.responses = responses.slice(0, 1);\n } else {\n config.responses = responses;\n config.customKeys = [];\n }\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 base = {\n config,\n correctness,\n feedback,\n disabled: env.mode !== 'gather',\n view: env.mode === 'view',\n };\n\n const out = base;\n let showNote = false;\n\n ((config && config.responses) || []).forEach((response) => {\n if (response.validation === 'symbolic' || Object.keys(response.alternates || {}).length > 0) {\n showNote = true;\n return;\n }\n });\n\n if (env.mode === 'evaluate') {\n out.correctResponse = {};\n out.config.showNote = showNote;\n } else {\n out.config.responses = [];\n out.config.showNote = false;\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 out.config.rationale = null;\n out.config.teacherInstructions = null;\n }\n\n out.config.env = env;\n out.config.prompt = normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null;\n\n log('out: ', out);\n resolve(out);\n });\n });\n}\n\nconst escape = (string) => string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n\nconst simpleSessionResponse = (question) =>\n new Promise((resolve) => {\n const { responses, id } = question;\n const { answer } = responses && responses.length ? responses[0] : {};\n\n resolve({\n id,\n response: answer || '',\n completeAnswer: answer || '',\n });\n });\n\nconst advancedSessionResponse = (question) =>\n new Promise((resolve, reject) => {\n const { responses, id } = question;\n const { answer } = responses && responses.length ? responses[0] : {};\n\n if (!answer) {\n resolve({\n id,\n answers: {},\n completeAnswer: '',\n });\n\n return;\n }\n\n try {\n const e = question.expression;\n const RESPONSE_TOKEN = /\\\\{\\\\{\\s*response\\s*\\\\}\\\\}/g;\n\n const o = escape(e).split(RESPONSE_TOKEN);\n const to = o.map((t) => (t === '' ? t : t.replace(/\\s+/g, () => '\\\\s*')));\n const tt = to.join('(.*)');\n\n const m = answer.match(new RegExp(tt));\n\n const count = o.length - 1;\n\n if (!m) {\n resolve({\n id,\n answers: {},\n completeAnswer: answer,\n });\n\n console.log(`can not find match: ${o} in ${answer}`);\n\n return;\n }\n\n m.shift();\n\n const answers = {};\n\n for (var i = 0; i < count; i++) {\n answers[`r${i + 1}`] = { value: m[i].trim() };\n }\n\n resolve({\n id,\n answers,\n completeAnswer: answer,\n });\n } catch (e) {\n resolve({\n id,\n answers: {},\n completeAnswer: answer,\n });\n\n console.error(e.toString());\n }\n });\n\nexport const createCorrectResponseSession = (question, env) => {\n if (env.mode === 'evaluate' || env.role !== 'instructor') {\n // eslint-disable-next-line no-console\n console.error('can not create correct response session if mode is evaluate or role is not instructor');\n\n return Promise.resolve(null);\n }\n\n if ((question.responseType || '').toLowerCase() === 'simple') {\n return simpleSessionResponse(question, env);\n } else {\n return advancedSessionResponse(question, env);\n }\n};\n\nexport const validate = (model = {}, config = {}) => {\n const { expression = '', responses, responseType } = model;\n const { maxResponseAreas } = config;\n const responsesErrors = {};\n\n (responses || []).forEach((response, index) => {\n const { answer } = response;\n const reversedAlternates = [...Object.entries(response.alternates || {})].reverse();\n const alternatesErrors = {};\n const responseError = {};\n\n if (answer === '') {\n responseError.answer = 'Content should not be empty.';\n }\n\n reversedAlternates.forEach(([key, value], index) => {\n if (value === '') {\n alternatesErrors[key] = 'Content should not be empty.';\n } else {\n const identicalAnswer =\n answer === value || reversedAlternates.slice(index + 1).some(([, val]) => val === value);\n\n if (identicalAnswer) {\n alternatesErrors[key] = 'Content should be unique.';\n }\n }\n });\n\n if (!isEmpty(responseError) || !isEmpty(alternatesErrors)) {\n responsesErrors[index] = { ...responseError, ...alternatesErrors };\n }\n });\n\n const errors = {};\n\n if (responseType === 'Advanced Multi') {\n const nbOfResponseAreas = (expression.match(/\\{\\{response\\}\\}/g) || []).length;\n\n if (nbOfResponseAreas > maxResponseAreas) {\n errors.responseAreasError = `No more than ${maxResponseAreas} response areas should be defined.`;\n } else if (nbOfResponseAreas < 1) {\n errors.responseAreasError = 'There should be at least 1 response area defined.';\n }\n }\n\n if (!isEmpty(responsesErrors)) {\n errors.responsesErrors = responsesErrors;\n }\n\n return errors;\n};\n"],"file":"index.js"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.js"],"names":["ResponseTypes","advanced","simple"],"mappings":";;;;;;AAAO,IAAMA,aAAa,GAAG;AAC3BC,EAAAA,QAAQ,EAAE,gBADiB;AAE3BC,EAAAA,MAAM,EAAE;AAFmB,CAAtB","sourcesContent":["export const ResponseTypes = {\n advanced: 'Advanced Multi',\n simple: 'Simple'\n};"],"file":"utils.js"}
1
+ {"version":3,"sources":["../src/utils.js"],"names":["ResponseTypes","advanced","simple"],"mappings":";;;;;;AAAO,IAAMA,aAAa,GAAG;AAC3BC,EAAAA,QAAQ,EAAE,gBADiB;AAE3BC,EAAAA,MAAM,EAAE;AAFmB,CAAtB","sourcesContent":["export const ResponseTypes = {\n advanced: 'Advanced Multi',\n simple: 'Simple',\n};\n"],"file":"utils.js"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pie-element/math-inline-controller",
3
3
  "private": true,
4
- "version": "5.4.0",
4
+ "version": "5.7.0",
5
5
  "description": "",
6
6
  "main": "lib/index.js",
7
7
  "module": "src/index.js",
@@ -9,9 +9,9 @@
9
9
  "test": "./node_modules/.bin/jest"
10
10
  },
11
11
  "dependencies": {
12
- "@pie-lib/controller-utils": "^0.2.24",
13
- "@pie-lib/feedback": "^0.4.25",
14
- "@pie-lib/math-evaluator": "2.1.4",
12
+ "@pie-framework/math-validation": "^1.2.2",
13
+ "@pie-lib/controller-utils": "^0.2.42",
14
+ "@pie-lib/feedback": "^0.4.42",
15
15
  "debug": "^3.1.0",
16
16
  "lodash": "^4.17.15"
17
17
  },
@@ -67,6 +67,27 @@
67
67
  }
68
68
  }
69
69
  },
70
+ "settingsPanelDisabled": {
71
+ "description": "Indicates if the settings panel is not available",
72
+ "type": "boolean",
73
+ "title": "settingsPanelDisabled"
74
+ },
75
+ "spellCheck": {
76
+ "title": "ConfigureProp",
77
+ "type": "object",
78
+ "properties": {
79
+ "settings": {
80
+ "description": "Indicates if the item has to be displayed in the Settings Panel",
81
+ "type": "boolean",
82
+ "title": "settings"
83
+ },
84
+ "label": {
85
+ "description": "Indicates the label for the item that has to be displayed in the Settings Panel",
86
+ "type": "string",
87
+ "title": "label"
88
+ }
89
+ }
90
+ },
70
91
  "scoringType": {
71
92
  "title": "ConfigureProp",
72
93
  "type": "object",
@@ -115,6 +136,111 @@
115
136
  }
116
137
  }
117
138
  },
139
+ "ignoreOrder": {
140
+ "title": "ConfigurePropWithEnabled",
141
+ "type": "object",
142
+ "properties": {
143
+ "settings": {
144
+ "description": "Indicates if the item has to be displayed in the Settings Panel",
145
+ "type": "boolean",
146
+ "title": "settings"
147
+ },
148
+ "label": {
149
+ "description": "Indicates the label for the item that has to be displayed in the Settings Panel",
150
+ "type": "string",
151
+ "title": "label"
152
+ },
153
+ "enabled": {
154
+ "description": "Indicates the value of the item if it affects config-ui\n(eg.: if item is a switch and displaying an input on the config-ui depends on the switch value: on/off)",
155
+ "type": "boolean",
156
+ "title": "enabled"
157
+ }
158
+ }
159
+ },
160
+ "allowTrailingZeros": {
161
+ "title": "ConfigurePropWithEnabled",
162
+ "type": "object",
163
+ "properties": {
164
+ "settings": {
165
+ "description": "Indicates if the item has to be displayed in the Settings Panel",
166
+ "type": "boolean",
167
+ "title": "settings"
168
+ },
169
+ "label": {
170
+ "description": "Indicates the label for the item that has to be displayed in the Settings Panel",
171
+ "type": "string",
172
+ "title": "label"
173
+ },
174
+ "enabled": {
175
+ "description": "Indicates the value of the item if it affects config-ui\n(eg.: if item is a switch and displaying an input on the config-ui depends on the switch value: on/off)",
176
+ "type": "boolean",
177
+ "title": "enabled"
178
+ }
179
+ }
180
+ },
181
+ "maxResponseAreas": {
182
+ "description": "Maximum number of response areas",
183
+ "type": "number",
184
+ "title": "maxResponseAreas"
185
+ },
186
+ "maxImageWidth": {
187
+ "title": "ConfigureMaxImageDimensionsProp",
188
+ "type": "object",
189
+ "properties": {
190
+ "teacherInstructions": {
191
+ "description": "Indicates the max dimension for images in teacher instructions",
192
+ "type": "number",
193
+ "title": "teacherInstructions"
194
+ },
195
+ "prompt": {
196
+ "description": "Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified",
197
+ "type": "number",
198
+ "title": "prompt"
199
+ },
200
+ "rationale": {
201
+ "description": "Indicates the max dimension for images in rationale",
202
+ "type": "number",
203
+ "title": "rationale"
204
+ }
205
+ }
206
+ },
207
+ "maxImageHeight": {
208
+ "title": "ConfigureMaxImageDimensionsProp",
209
+ "type": "object",
210
+ "properties": {
211
+ "teacherInstructions": {
212
+ "description": "Indicates the max dimension for images in teacher instructions",
213
+ "type": "number",
214
+ "title": "teacherInstructions"
215
+ },
216
+ "prompt": {
217
+ "description": "Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified",
218
+ "type": "number",
219
+ "title": "prompt"
220
+ },
221
+ "rationale": {
222
+ "description": "Indicates the max dimension for images in rationale",
223
+ "type": "number",
224
+ "title": "rationale"
225
+ }
226
+ }
227
+ },
228
+ "withRubric": {
229
+ "title": "ConfigureProp",
230
+ "type": "object",
231
+ "properties": {
232
+ "settings": {
233
+ "description": "Indicates if the item has to be displayed in the Settings Panel",
234
+ "type": "boolean",
235
+ "title": "settings"
236
+ },
237
+ "label": {
238
+ "description": "Indicates the label for the item that has to be displayed in the Settings Panel",
239
+ "type": "string",
240
+ "title": "label"
241
+ }
242
+ }
243
+ },
118
244
  "showPrompt": {
119
245
  "description": "Determines whether prompt field will be displayed or not",
120
246
  "default": true,
@@ -150,6 +276,48 @@
150
276
  "title": "label"
151
277
  }
152
278
  }
279
+ },
280
+ "ConfigurePropWithEnabled": {
281
+ "title": "ConfigurePropWithEnabled",
282
+ "type": "object",
283
+ "properties": {
284
+ "settings": {
285
+ "description": "Indicates if the item has to be displayed in the Settings Panel",
286
+ "type": "boolean",
287
+ "title": "settings"
288
+ },
289
+ "label": {
290
+ "description": "Indicates the label for the item that has to be displayed in the Settings Panel",
291
+ "type": "string",
292
+ "title": "label"
293
+ },
294
+ "enabled": {
295
+ "description": "Indicates the value of the item if it affects config-ui\n(eg.: if item is a switch and displaying an input on the config-ui depends on the switch value: on/off)",
296
+ "type": "boolean",
297
+ "title": "enabled"
298
+ }
299
+ }
300
+ },
301
+ "ConfigureMaxImageDimensionsProp": {
302
+ "title": "ConfigureMaxImageDimensionsProp",
303
+ "type": "object",
304
+ "properties": {
305
+ "teacherInstructions": {
306
+ "description": "Indicates the max dimension for images in teacher instructions",
307
+ "type": "number",
308
+ "title": "teacherInstructions"
309
+ },
310
+ "prompt": {
311
+ "description": "Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified",
312
+ "type": "number",
313
+ "title": "prompt"
314
+ },
315
+ "rationale": {
316
+ "description": "Indicates the max dimension for images in rationale",
317
+ "type": "number",
318
+ "title": "rationale"
319
+ }
320
+ }
153
321
  }
154
322
  },
155
323
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -50,6 +50,22 @@ Indicates if the item has to be displayed in the Settings Panel
50
50
 
51
51
  Indicates the label for the item that has to be displayed in the Settings Panel
52
52
 
53
+ # `settingsPanelDisabled` (boolean)
54
+
55
+ Indicates if the settings panel is not available
56
+
57
+ # `spellCheck` (object)
58
+
59
+ Properties of the `spellCheck` object:
60
+
61
+ ## `settings` (boolean)
62
+
63
+ Indicates if the item has to be displayed in the Settings Panel
64
+
65
+ ## `label` (string)
66
+
67
+ Indicates the label for the item that has to be displayed in the Settings Panel
68
+
53
69
  # `scoringType` (object)
54
70
 
55
71
  Properties of the `scoringType` object:
@@ -86,6 +102,88 @@ Indicates if the item has to be displayed in the Settings Panel
86
102
 
87
103
  Indicates the label for the item that has to be displayed in the Settings Panel
88
104
 
105
+ # `ignoreOrder` (object)
106
+
107
+ Properties of the `ignoreOrder` object:
108
+
109
+ ## `settings` (boolean)
110
+
111
+ Indicates if the item has to be displayed in the Settings Panel
112
+
113
+ ## `label` (string)
114
+
115
+ Indicates the label for the item that has to be displayed in the Settings Panel
116
+
117
+ ## `enabled` (boolean)
118
+
119
+ Indicates the value of the item if it affects config-ui
120
+ (eg.: if item is a switch and displaying an input on the config-ui depends on the switch value: on/off)
121
+
122
+ # `allowTrailingZeros` (object)
123
+
124
+ Properties of the `allowTrailingZeros` object:
125
+
126
+ ## `settings` (boolean)
127
+
128
+ Indicates if the item has to be displayed in the Settings Panel
129
+
130
+ ## `label` (string)
131
+
132
+ Indicates the label for the item that has to be displayed in the Settings Panel
133
+
134
+ ## `enabled` (boolean)
135
+
136
+ Indicates the value of the item if it affects config-ui
137
+ (eg.: if item is a switch and displaying an input on the config-ui depends on the switch value: on/off)
138
+
139
+ # `maxResponseAreas` (number)
140
+
141
+ Maximum number of response areas
142
+
143
+ # `maxImageWidth` (object)
144
+
145
+ Properties of the `maxImageWidth` object:
146
+
147
+ ## `teacherInstructions` (number)
148
+
149
+ Indicates the max dimension for images in teacher instructions
150
+
151
+ ## `prompt` (number)
152
+
153
+ Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified
154
+
155
+ ## `rationale` (number)
156
+
157
+ Indicates the max dimension for images in rationale
158
+
159
+ # `maxImageHeight` (object)
160
+
161
+ Properties of the `maxImageHeight` object:
162
+
163
+ ## `teacherInstructions` (number)
164
+
165
+ Indicates the max dimension for images in teacher instructions
166
+
167
+ ## `prompt` (number)
168
+
169
+ Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified
170
+
171
+ ## `rationale` (number)
172
+
173
+ Indicates the max dimension for images in rationale
174
+
175
+ # `withRubric` (object)
176
+
177
+ Properties of the `withRubric` object:
178
+
179
+ ## `settings` (boolean)
180
+
181
+ Indicates if the item has to be displayed in the Settings Panel
182
+
183
+ ## `label` (string)
184
+
185
+ Indicates the label for the item that has to be displayed in the Settings Panel
186
+
89
187
  # `showPrompt` (boolean)
90
188
 
91
189
  Determines whether prompt field will be displayed or not
@@ -120,4 +218,37 @@ Indicates if the item has to be displayed in the Settings Panel
120
218
 
121
219
  ### `label` (string)
122
220
 
123
- Indicates the label for the item that has to be displayed in the Settings Panel
221
+ Indicates the label for the item that has to be displayed in the Settings Panel
222
+
223
+ ## `ConfigurePropWithEnabled` (object)
224
+
225
+ Properties of the `ConfigurePropWithEnabled` object:
226
+
227
+ ### `settings` (boolean)
228
+
229
+ Indicates if the item has to be displayed in the Settings Panel
230
+
231
+ ### `label` (string)
232
+
233
+ Indicates the label for the item that has to be displayed in the Settings Panel
234
+
235
+ ### `enabled` (boolean)
236
+
237
+ Indicates the value of the item if it affects config-ui
238
+ (eg.: if item is a switch and displaying an input on the config-ui depends on the switch value: on/off)
239
+
240
+ ## `ConfigureMaxImageDimensionsProp` (object)
241
+
242
+ Properties of the `ConfigureMaxImageDimensionsProp` object:
243
+
244
+ ### `teacherInstructions` (number)
245
+
246
+ Indicates the max dimension for images in teacher instructions
247
+
248
+ ### `prompt` (number)
249
+
250
+ Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified
251
+
252
+ ### `rationale` (number)
253
+
254
+ Indicates the max dimension for images in rationale
@@ -2,7 +2,7 @@ const { model } = require('./generate');
2
2
 
3
3
  module.exports = {
4
4
  elements: {
5
- 'math-inline': '../..'
5
+ 'math-inline': '../..',
6
6
  },
7
- models: [model('1', 'math-inline')]
7
+ models: [model('1', 'math-inline')],
8
8
  };
@@ -8,31 +8,35 @@ const initialModel = {
8
8
  answer: 'r=\\sqrt{\\frac{V}{7\\pi}}',
9
9
  id: '1',
10
10
  alternates: {},
11
- validation: 'literal'
12
- }
11
+ validation: 'literal',
12
+ },
13
13
  ],
14
+ note: 'The answer shown above is the primary correct answer specified by the author for this item, but other answers may also be recognized as correct.',
14
15
  rationale:
15
16
  '<p>The correct answer is:</p><ul><li><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>r</mi><mo>=</mo><msqrt><mfrac><mi>V</mi><mrow><mn>7</mn><mi>&#960;</mi></mrow></mfrac></msqrt></math></li></ul>',
16
- }
17
+ };
17
18
 
18
19
  const E262456 = {
19
- 'equationEditor': 3,
20
- 'prompt': '<p><strong>B.</strong> Find the value of the expression that you wrote in part A to find how much money the band members made.</p>\n\n<p>Use the on-screen keyboard to type your answer in the box below.</p>\n',
21
- 'expression': '${{response}}',
22
- 'responses': [
20
+ equationEditor: 3,
21
+ toolbarEditorPosition: 'bottom',
22
+ prompt:
23
+ '<p><strong>B.</strong> Find the value of the expression that you wrote in part A to find how much money the band members made.</p>\n\n<p>Use the on-screen keyboard to type your answer in the box below.</p>\n',
24
+ expression: '${{response}}',
25
+ responses: [
23
26
  {
24
- 'allowSpaces': true,
25
- 'validation': 'symbolic',
26
- 'answer': '$410',
27
- 'id': '1'
28
- }
27
+ allowSpaces: true,
28
+ // 'validation': 'symbolic',
29
+ answer: '$410',
30
+ id: '1',
31
+ },
29
32
  ],
30
- 'responseType': 'Advanced Multi'
31
- }
32
-
33
+ note: 'The answer shown above is the primary correct answer specified by the author for this item, but other answers may also be recognized as correct.',
34
+ responseType: 'Advanced Multi',
35
+ };
33
36
 
34
37
  exports.model = (id, element) => ({
35
38
  id,
36
39
  element,
37
- ...E262456
40
+ ...E262456,
41
+ rubricEnabled: false,
38
42
  });
@@ -7,5 +7,5 @@ module.exports = [
7
7
  // r2: { value: '2' }
8
8
  // },
9
9
  // completeAnswer: '72\\div12=6',
10
- }
10
+ },
11
11
  ];