@pie-element/select-text 9.6.1 → 9.6.2-beta.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.
- package/CHANGELOG.md +0 -30
- package/configure/CHANGELOG.md +0 -29
- package/configure/lib/__tests__/design.test.js +214 -0
- package/configure/lib/defaultConfiguration.js +12 -1
- package/configure/lib/defaultConfiguration.js.map +1 -1
- package/configure/lib/design.js +450 -62
- package/configure/lib/design.js.map +1 -1
- package/configure/lib/index.js +7 -1
- package/configure/lib/index.js.map +1 -1
- package/configure/lib/utils.js +26 -2
- package/configure/lib/utils.js.map +1 -1
- package/configure/package.json +2 -2
- package/controller/CHANGELOG.md +0 -28
- package/controller/lib/__tests__/index.test.js +833 -0
- package/controller/lib/index.js +1 -0
- package/controller/lib/index.js.map +1 -1
- package/controller/package.json +2 -2
- package/docs/demo/generate.js +101 -44
- package/docs/demo/pie.manifest.json +11 -0
- package/lib/__tests__/index.test.js +91 -0
- package/lib/__tests__/main.test.js +83 -0
- package/lib/main.js +40 -6
- package/lib/main.js.map +1 -1
- package/module/configure.js +2540 -7020
- package/module/controller.js +1 -0
- package/module/demo.js +101 -44
- package/module/element.js +1106 -1139
- package/module/index.html +1 -1
- package/module/manifest.json +3 -3
- package/module/print-demo.js +101 -44
- package/module/print.html +1 -1
- package/module/print.js +1106 -1139
- package/package.json +3 -3
- package/LICENSE.md +0 -5
package/controller/lib/index.js
CHANGED
|
@@ -177,6 +177,7 @@ var model = function model(question, session, env) {
|
|
|
177
177
|
highlightChoices: normalizedQuestion.highlightChoices,
|
|
178
178
|
prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,
|
|
179
179
|
text: normalizedQuestion.text,
|
|
180
|
+
tokenizedText: normalizedQuestion.tokenizedText,
|
|
180
181
|
disabled: env.mode !== 'gather',
|
|
181
182
|
maxSelections: normalizedQuestion.maxSelections,
|
|
182
183
|
correctness: correctness,
|
|
@@ -1 +1 @@
|
|
|
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","normalizedQuestion","correctness","fb","feedbackEnabled","feedback","then","out","highlightChoices","prompt","promptEnabled","text","disabled","maxSelections","incorrect","language","extraCSSRules","role","rationale","rationaleEnabled","teacherInstructions","teacherInstructionsEnabled","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({ ...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"],"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","normalizedQuestion","correctness","fb","feedbackEnabled","feedback","then","out","highlightChoices","prompt","promptEnabled","text","tokenizedText","disabled","maxSelections","incorrect","language","extraCSSRules","role","rationale","rationaleEnabled","teacherInstructions","teacherInstructionsEnabled","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({ ...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 tokenizedText: normalizedQuestion.tokenizedText,\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"],"file":"index.js"}
|
package/controller/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-element/select-text-controller",
|
|
3
3
|
"private": true,
|
|
4
|
-
"version": "6.
|
|
4
|
+
"version": "6.2.10",
|
|
5
5
|
"description": "",
|
|
6
6
|
"main": "lib/index.js",
|
|
7
7
|
"module": "src/index.js",
|
|
8
8
|
"dependencies": {
|
|
9
|
-
"@pie-lib/pie-toolbox": "2.
|
|
9
|
+
"@pie-lib/pie-toolbox": "2.20.0",
|
|
10
10
|
"debug": "^3.1.0",
|
|
11
11
|
"lodash": "^4.17.15"
|
|
12
12
|
},
|
package/docs/demo/generate.js
CHANGED
|
@@ -224,52 +224,109 @@ exports.model = (id, element) => {
|
|
|
224
224
|
'<p>Select the sentence from "The Gymnast" that <span class="relative-emphasis">best</span> represents the theme.</p>',
|
|
225
225
|
rationale:
|
|
226
226
|
'<p>The final sentence of the passage best exemplifies the theme of the short story because Natasha's practice and determination finally pays off.</p>',
|
|
227
|
+
// tokens: [
|
|
228
|
+
// {
|
|
229
|
+
// text: 'She thought about what she had to do, struggling to rein in her wild, fearful thoughts.',
|
|
230
|
+
// end: 90,
|
|
231
|
+
// start: 3,
|
|
232
|
+
// correct: false,
|
|
233
|
+
// },
|
|
234
|
+
// {
|
|
235
|
+
// start: 449,
|
|
236
|
+
// end: 585,
|
|
237
|
+
// text: 'Just for a hair of a moment, Natasha wondered if she really wanted a perfect 10, so weary was she of trying for but never achieving one.',
|
|
238
|
+
// correct: false,
|
|
239
|
+
// },
|
|
240
|
+
// {
|
|
241
|
+
// end: 627,
|
|
242
|
+
// correct: false,
|
|
243
|
+
// text: 'At last Natasha\'s moment arrived.',
|
|
244
|
+
// start: 594,
|
|
245
|
+
// },
|
|
246
|
+
// {
|
|
247
|
+
// end: 743,
|
|
248
|
+
// text: 'The faces of past giants of gymnastics swam before her mind\'s eye, now razor–sharp with fierce determination.',
|
|
249
|
+
// correct: false,
|
|
250
|
+
// start: 628,
|
|
251
|
+
// },
|
|
252
|
+
// {
|
|
253
|
+
// text: 'Suddenly, the din of the gymnasium was silent to her.',
|
|
254
|
+
// end: 997,
|
|
255
|
+
// correct: false,
|
|
256
|
+
// start: 944,
|
|
257
|
+
// },
|
|
258
|
+
// {
|
|
259
|
+
// end: 1087,
|
|
260
|
+
// start: 998,
|
|
261
|
+
// correct: false,
|
|
262
|
+
// text: 'Forcing all sound out of her mind, she focused on the gleaming balance beam ahead of her.',
|
|
263
|
+
// },
|
|
264
|
+
// {
|
|
265
|
+
// correct: true,
|
|
266
|
+
// start: 1088,
|
|
267
|
+
// end: 1225,
|
|
268
|
+
// text: 'Taking a deep breath, Natasha made her graceful, yet powerful approach, mounted the beam flawlessly, and...executed her first perfect 10.',
|
|
269
|
+
// },
|
|
270
|
+
// ],
|
|
271
|
+
// "element": "select-text",
|
|
272
|
+
// text: '<p>She thought about what she had to do, struggling to rein in her wild, fearful thoughts. Coach Cummings always said that an undisciplined mind never scored a perfect 10. Natasha wanted to please her Coach, yet sometimes his approval wasn\'t as exciting as his anger. The gymnasts were unanimous about one thing: Coach Cummings\'s fits of disapproving rage were much more humorous to witness than his infrequent, backslapping moments of high praise. Just for a hair of a moment, Natasha wondered if she really wanted a perfect 10, so weary was she of trying for but never achieving one.</p>\n\n<p>At last Natasha\'s moment arrived. The faces of past giants of gymnastics swam before her mind\'s eye, now razor–sharp with fierce determination. "I am talented. I am not afraid. I will make a perfect 10," she spoke aloud to herself, as she approached the mat, dusted her hands with chalk to prevent slippage, and returned to her starting point. Suddenly, the din of the gymnasium was silent to her. Forcing all sound out of her mind, she focused on the gleaming balance beam ahead of her. Taking a deep breath, Natasha made her graceful, yet powerful approach, mounted the beam flawlessly, and...executed her first perfect 10.</p>\n',
|
|
227
273
|
tokens: [
|
|
228
|
-
{
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
},
|
|
234
|
-
{
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
},
|
|
240
|
-
{
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
},
|
|
246
|
-
{
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
},
|
|
252
|
-
{
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
},
|
|
258
|
-
{
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
},
|
|
264
|
-
{
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
},
|
|
274
|
+
// {
|
|
275
|
+
// id: '0-30-1751440197593',
|
|
276
|
+
// quote: 'She thought about what she had',
|
|
277
|
+
// start: 0,
|
|
278
|
+
// end: 30,
|
|
279
|
+
// },
|
|
280
|
+
// {
|
|
281
|
+
// id: '185-206-1751440199435',
|
|
282
|
+
// quote: 'o please her Coach, y',
|
|
283
|
+
// start: 185,
|
|
284
|
+
// end: 206,
|
|
285
|
+
// },
|
|
286
|
+
// {
|
|
287
|
+
// id: '356-379-1751440202337',
|
|
288
|
+
// quote: 'e much more humorous to',
|
|
289
|
+
// start: 356,
|
|
290
|
+
// end: 379,
|
|
291
|
+
// },
|
|
292
|
+
// {
|
|
293
|
+
// id: '0-88-1751443110733',
|
|
294
|
+
// quote: 'She thought about what she had to do, struggling to rein in her wild, fearful thoughts. ',
|
|
295
|
+
// start: 0,
|
|
296
|
+
// end: 88,
|
|
297
|
+
// },
|
|
298
|
+
// {
|
|
299
|
+
// id: '590-607-1751443116013',
|
|
300
|
+
// quote: "Át last Ñatasha's",
|
|
301
|
+
// start: 590,
|
|
302
|
+
// end: 607,
|
|
303
|
+
// },
|
|
304
|
+
// {
|
|
305
|
+
// id: '624-641-1751443118643',
|
|
306
|
+
// quote: 'The faces of past',
|
|
307
|
+
// start: 624,
|
|
308
|
+
// end: 641,
|
|
309
|
+
// },
|
|
310
|
+
// {
|
|
311
|
+
// id: '1223-1231-1751443121777',
|
|
312
|
+
// quote: 'header 2',
|
|
313
|
+
// start: 1223,
|
|
314
|
+
// end: 1231,
|
|
315
|
+
// },
|
|
316
|
+
// {
|
|
317
|
+
// id: '358-376-1751443129379',
|
|
318
|
+
// quote: '»»» were much more',
|
|
319
|
+
// start: 358,
|
|
320
|
+
// end: 376,
|
|
321
|
+
// },
|
|
322
|
+
// {
|
|
323
|
+
// id: '137-154-1751443132310',
|
|
324
|
+
// quote: 'mind never scored',
|
|
325
|
+
// start: 137,
|
|
326
|
+
// end: 154,
|
|
327
|
+
// },
|
|
270
328
|
],
|
|
271
|
-
|
|
272
|
-
text: "<p>She thought about what she had to do, struggling to rein in her wild, fearful thoughts. Coach Cummings always said that an undisciplined mind never scored a perfect 10. Natasha wanted to please her Coach, yet sometimes his approval wasn't as exciting as his anger. The gymnasts were unanimous about one thing: Coach Cummings's fits of disapproving rage were much more humorous to witness than his infrequent, backslapping moments of high praise. Just for a hair of a moment, Natasha wondered if she really wanted a perfect 10, so weary was she of trying for but never achieving one.</p>\n\n<p>At last Natasha's moment arrived. The faces of past giants of gymnastics swam before her mind's eye, now razor–sharp with fierce determination. \"I am talented. I am not afraid. I will make a perfect 10,\" she spoke aloud to herself, as she approached the mat, dusted her hands with chalk to prevent slippage, and returned to her starting point. Suddenly, the din of the gymnasium was silent to her. Forcing all sound out of her mind, she focused on the gleaming balance beam ahead of her. Taking a deep breath, Natasha made her graceful, yet powerful approach, mounted the beam flawlessly, and...executed her first perfect 10.</p>\n",
|
|
329
|
+
text: '<p>She thought about what she had to do, <u>struggling to rein</u> in her wild, <b>fearful thoughts</b>. Coach Cummings always said that an undisciplined mind <sup>never scored </sup>a perfect 10. Natasha €€€ wanted to please her Coach, yet sometimes his approval wasn't as exciting as his anger. The gymnasts were unanimous about one thing: Coach Cummings's fits of disapproving rage »»» were much more humorous to witness than his infrequent, backslapping moments of high praise. Just for a hair of a moment, Natasha wondered if she really wanted a perfect 10, so weary was she of trying for but never achieving one</p><p><em>Át last Ñatasha's moment arrived.</em> The <s>faces</s> of past giants of gymnastics swam before her mind's eye, now razor–sharp with fierce determination. "I am talented. I am not afraid. I will make a perfect 10," she spoke aloud to herself, as she approached the mat, dusted her hands with chalk to prevent slippage, and returned to her starting point. Suddenly, the din of the gymnasium was silent to her. Forcing all sound out of her mind, she focused on the gleaming balance beam ahead of her. Taking a deep breath, Natasha made her graceful, yet powerful approach, mounted the beam flawlessly, and...executed her first perfect 10.</p><p></p><table border="1"><tbody><tr><td><p>header 1</p></td><td><p>header 2</p></td></tr><tr><td><p>row </p></td><td><p>row</p></td></tr></tbody></table><div></div>',
|
|
273
330
|
rubricEnabled: false,
|
|
274
331
|
}),
|
|
275
332
|
);
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
var _ = _interopRequireDefault(require(".."));
|
|
6
|
+
|
|
7
|
+
var _react = _interopRequireDefault(require("react"));
|
|
8
|
+
|
|
9
|
+
var _reactDom = _interopRequireDefault(require("react-dom"));
|
|
10
|
+
|
|
11
|
+
var _piePlayerEvents = require("@pie-framework/pie-player-events");
|
|
12
|
+
|
|
13
|
+
var _mathRendering = require("@pie-lib/pie-toolbox/math-rendering");
|
|
14
|
+
|
|
15
|
+
jest.mock('@pie-lib/pie-toolbox/math-rendering', function () {
|
|
16
|
+
return {
|
|
17
|
+
renderMath: jest.fn()
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
jest.mock('../main', function () {
|
|
21
|
+
return jest.fn();
|
|
22
|
+
});
|
|
23
|
+
jest.mock('react', function () {
|
|
24
|
+
return {
|
|
25
|
+
createElement: jest.fn()
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
jest.mock('react-dom', function () {
|
|
29
|
+
return {
|
|
30
|
+
render: jest.fn(function (r, el, cb) {
|
|
31
|
+
cb();
|
|
32
|
+
})
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
describe('select-text', function () {
|
|
36
|
+
var c;
|
|
37
|
+
beforeEach(function () {
|
|
38
|
+
c = new _["default"]();
|
|
39
|
+
c.dispatchEvent = jest.fn();
|
|
40
|
+
c.tagName = 'select-text';
|
|
41
|
+
c.model = {};
|
|
42
|
+
c.session = {};
|
|
43
|
+
});
|
|
44
|
+
describe('init', function () {
|
|
45
|
+
it('calls createElement', function () {
|
|
46
|
+
expect(_react["default"].createElement).toBeCalled();
|
|
47
|
+
});
|
|
48
|
+
it('calls render', function () {
|
|
49
|
+
expect(_reactDom["default"].render).toBeCalledWith(undefined, expect.anything(), expect.any(Function));
|
|
50
|
+
});
|
|
51
|
+
it('calls renderMath', function () {
|
|
52
|
+
expect(_mathRendering.renderMath).toHaveBeenCalled();
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe('isSessionComplete', function () {
|
|
56
|
+
it('returns true for non empty selectedTokens', function () {
|
|
57
|
+
c.session = {
|
|
58
|
+
selectedTokens: [{
|
|
59
|
+
start: 0,
|
|
60
|
+
end: 1,
|
|
61
|
+
text: 'f'
|
|
62
|
+
}]
|
|
63
|
+
};
|
|
64
|
+
expect(c.isSessionComplete()).toEqual(true);
|
|
65
|
+
});
|
|
66
|
+
it('returns false for empty selectedTokens', function () {
|
|
67
|
+
c.session = {
|
|
68
|
+
selectedTokens: []
|
|
69
|
+
};
|
|
70
|
+
expect(c.isSessionComplete()).toEqual(false);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe('selectionChanged', function () {
|
|
74
|
+
var newTokens;
|
|
75
|
+
beforeEach(function () {
|
|
76
|
+
newTokens = [{
|
|
77
|
+
start: 2,
|
|
78
|
+
end: 3,
|
|
79
|
+
text: 'f'
|
|
80
|
+
}];
|
|
81
|
+
c.selectionChanged(newTokens);
|
|
82
|
+
});
|
|
83
|
+
it('sets the tokens', function () {
|
|
84
|
+
expect(c._session.selectedTokens).toEqual(newTokens);
|
|
85
|
+
});
|
|
86
|
+
it('calls dispatchEvent', function () {
|
|
87
|
+
expect(c.dispatchEvent).toBeCalledWith(new _piePlayerEvents.SessionChangedEvent('select-text', true));
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaW5kZXgudGVzdC5qcyJdLCJuYW1lcyI6WyJqZXN0IiwibW9jayIsInJlbmRlck1hdGgiLCJmbiIsImNyZWF0ZUVsZW1lbnQiLCJyZW5kZXIiLCJyIiwiZWwiLCJjYiIsImRlc2NyaWJlIiwiYyIsImJlZm9yZUVhY2giLCJTZWxlY3RUZXh0IiwiZGlzcGF0Y2hFdmVudCIsInRhZ05hbWUiLCJtb2RlbCIsInNlc3Npb24iLCJpdCIsImV4cGVjdCIsIlJlYWN0IiwidG9CZUNhbGxlZCIsIlJlYWN0RE9NIiwidG9CZUNhbGxlZFdpdGgiLCJ1bmRlZmluZWQiLCJhbnl0aGluZyIsImFueSIsIkZ1bmN0aW9uIiwidG9IYXZlQmVlbkNhbGxlZCIsInNlbGVjdGVkVG9rZW5zIiwic3RhcnQiLCJlbmQiLCJ0ZXh0IiwiaXNTZXNzaW9uQ29tcGxldGUiLCJ0b0VxdWFsIiwibmV3VG9rZW5zIiwic2VsZWN0aW9uQ2hhbmdlZCIsIl9zZXNzaW9uIiwiU2Vzc2lvbkNoYW5nZWRFdmVudCJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBQSxJQUFJLENBQUNDLElBQUwsQ0FBVSxxQ0FBVixFQUFpRDtBQUFBLFNBQU87QUFDdERDLElBQUFBLFVBQVUsRUFBRUYsSUFBSSxDQUFDRyxFQUFMO0FBRDBDLEdBQVA7QUFBQSxDQUFqRDtBQUdBSCxJQUFJLENBQUNDLElBQUwsQ0FBVSxTQUFWLEVBQXFCO0FBQUEsU0FBTUQsSUFBSSxDQUFDRyxFQUFMLEVBQU47QUFBQSxDQUFyQjtBQUVBSCxJQUFJLENBQUNDLElBQUwsQ0FBVSxPQUFWLEVBQW1CO0FBQUEsU0FBTztBQUN4QkcsSUFBQUEsYUFBYSxFQUFFSixJQUFJLENBQUNHLEVBQUw7QUFEUyxHQUFQO0FBQUEsQ0FBbkI7QUFJQUgsSUFBSSxDQUFDQyxJQUFMLENBQVUsV0FBVixFQUF1QjtBQUFBLFNBQU87QUFDNUJJLElBQUFBLE1BQU0sRUFBRUws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QztBQUNELEtBRkMsQ0FBRjtBQUlBakIsSUFBQUEsRUFBRSxDQUFDLHFCQUFELEVBQXdCLFlBQU07QUFDOUJDLE1BQUFBLE1BQU0sQ0FBQ1IsQ0FBQyxDQUFDRyxhQUFILENBQU4sQ0FBd0JTLGNBQXhCLENBQXVDLElBQUllLG9DQUFKLENBQXdCLGFBQXhCLEVBQXVDLElBQXZDLENBQXZDO0FBQ0QsS0FGQyxDQUFGO0FBR0QsR0FkTyxDQUFSO0FBZUQsQ0FsRE8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTZWxlY3RUZXh0IGZyb20gJy4uJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCB7IFNlc3Npb25DaGFuZ2VkRXZlbnQgfSBmcm9tICdAcGllLWZyYW1ld29yay9waWUtcGxheWVyLWV2ZW50cyc7XG5cbmltcG9ydCB7IHJlbmRlck1hdGggfSBmcm9tICdAcGllLWxpYi9waWUtdG9vbGJveC9tYXRoLXJlbmRlcmluZyc7XG5qZXN0Lm1vY2soJ0BwaWUtbGliL3BpZS10b29sYm94L21hdGgtcmVuZGVyaW5nJywgKCkgPT4gKHtcbiAgcmVuZGVyTWF0aDogamVzdC5mbigpLFxufSkpO1xuamVzdC5tb2NrKCcuLi9tYWluJywgKCkgPT4gamVzdC5mbigpKTtcblxuamVzdC5tb2NrKCdyZWFjdCcsICgpID0+ICh7XG4gIGNyZWF0ZUVsZW1lbnQ6IGplc3QuZm4oKSxcbn0pKTtcblxuamVzdC5tb2NrKCdyZWFjdC1kb20nLCAoKSA9PiAoe1xuICByZW5kZXI6IGplc3QuZm4oKHIsIGVsLCBjYikgPT4ge1xuICAgIGNiKCk7XG4gIH0pLFxufSkpO1xuXG5kZXNjcmliZSgnc2VsZWN0LXRleHQnLCAoKSA9PiB7XG4gIGxldCBjO1xuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBjID0gbmV3IFNlbGVjdFRleHQoKTtcbiAgICBjLmRpc3BhdGNoRXZlbnQgPSBqZXN0LmZuKCk7XG4gICAgYy50YWdOYW1lID0gJ3NlbGVjdC10ZXh0JztcbiAgICBjLm1vZGVsID0ge307XG4gICAgYy5zZXNzaW9uID0ge307XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpbml0JywgKCkgPT4ge1xuICAgIGl0KCdjYWxscyBjcmVhdGVFbGVtZW50JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFJlYWN0LmNyZWF0ZUVsZW1lbnQpLnRvQmVDYWxsZWQoKTtcbiAgICB9KTtcbiAgICBpdCgnY2FsbHMgcmVuZGVyJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFJlYWN0RE9NLnJlbmRlcikudG9CZUNhbGxlZFdpdGgodW5kZWZpbmVkLCBleHBlY3QuYW55dGhpbmcoKSwgZXhwZWN0LmFueShGdW5jdGlvbikpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbGxzIHJlbmRlck1hdGgnLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVuZGVyTWF0aCkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNTZXNzaW9uQ29tcGxldGUnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgdHJ1ZSBmb3Igbm9uIGVtcHR5IHNlbGVjdGVkVG9rZW5zJywgKCkgPT4ge1xuICAgICAgYy5zZXNzaW9uID0geyBzZWxlY3RlZFRva2VuczogW3sgc3RhcnQ6IDAsIGVuZDogMSwgdGV4dDogJ2YnIH1dIH07XG4gICAgICBleHBlY3QoYy5pc1Nlc3Npb25Db21wbGV0ZSgpKS50b0VxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgZmFsc2UgZm9yIGVtcHR5IHNlbGVjdGVkVG9rZW5zJywgKCkgPT4ge1xuICAgICAgYy5zZXNzaW9uID0geyBzZWxlY3RlZFRva2VuczogW10gfTtcbiAgICAgIGV4cGVjdChjLmlzU2Vzc2lvbkNvbXBsZXRlKCkpLnRvRXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2VsZWN0aW9uQ2hhbmdlZCcsICgpID0+IHtcbiAgICBsZXQgbmV3VG9rZW5zO1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgbmV3VG9rZW5zID0gW3sgc3RhcnQ6IDIsIGVuZDogMywgdGV4dDogJ2YnIH1dO1xuICAgICAgYy5zZWxlY3Rpb25DaGFuZ2VkKG5ld1Rva2Vucyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2V0cyB0aGUgdG9rZW5zJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGMuX3Nlc3Npb24uc2VsZWN0ZWRUb2tlbnMpLnRvRXF1YWwobmV3VG9rZW5zKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBkaXNwYXRjaEV2ZW50JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGMuZGlzcGF0Y2hFdmVudCkudG9CZUNhbGxlZFdpdGgobmV3IFNlc3Npb25DaGFuZ2VkRXZlbnQoJ3NlbGVjdC10ZXh0JywgdHJ1ZSkpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
6
|
+
|
|
7
|
+
var _enzyme = require("enzyme");
|
|
8
|
+
|
|
9
|
+
var _react = _interopRequireDefault(require("react"));
|
|
10
|
+
|
|
11
|
+
var _main = require("../main");
|
|
12
|
+
|
|
13
|
+
jest.mock('@pie-lib/pie-toolbox/text-select', function () {
|
|
14
|
+
return {
|
|
15
|
+
prepareText: jest.fn()
|
|
16
|
+
};
|
|
17
|
+
});
|
|
18
|
+
describe('main', function () {
|
|
19
|
+
var getWrapper = function getWrapper(props) {
|
|
20
|
+
return (0, _enzyme.shallow)( /*#__PURE__*/_react["default"].createElement(_main.Main, (0, _extends2["default"])({
|
|
21
|
+
onSelectionChange: jest.fn(),
|
|
22
|
+
model: {
|
|
23
|
+
text: 'foo',
|
|
24
|
+
tokens: [{
|
|
25
|
+
start: 0,
|
|
26
|
+
end: 1,
|
|
27
|
+
text: 'f'
|
|
28
|
+
}]
|
|
29
|
+
},
|
|
30
|
+
session: {
|
|
31
|
+
selectedTokens: [{
|
|
32
|
+
start: 0,
|
|
33
|
+
end: 1,
|
|
34
|
+
text: 'f'
|
|
35
|
+
}]
|
|
36
|
+
},
|
|
37
|
+
classes: {}
|
|
38
|
+
}, props)));
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
describe('snapshot', function () {
|
|
42
|
+
it('renders', function () {
|
|
43
|
+
var w = getWrapper();
|
|
44
|
+
expect(w).toMatchSnapshot();
|
|
45
|
+
});
|
|
46
|
+
it('renders rationale', function () {
|
|
47
|
+
var w = getWrapper({
|
|
48
|
+
rationale: 'This is rationale '
|
|
49
|
+
});
|
|
50
|
+
expect(w).toMatchSnapshot();
|
|
51
|
+
});
|
|
52
|
+
it('renders showCorrect', function () {
|
|
53
|
+
var w = getWrapper();
|
|
54
|
+
w.instance().toggleShowCorrect();
|
|
55
|
+
expect(w).toMatchSnapshot();
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
describe('logic', function () {
|
|
59
|
+
var w;
|
|
60
|
+
beforeEach(function () {
|
|
61
|
+
w = getWrapper();
|
|
62
|
+
});
|
|
63
|
+
it('shows correct answer', function () {
|
|
64
|
+
var correctTokens = [{
|
|
65
|
+
start: 0,
|
|
66
|
+
end: 1,
|
|
67
|
+
text: 'f',
|
|
68
|
+
correct: true,
|
|
69
|
+
oldStart: 0,
|
|
70
|
+
oldEnd: 1
|
|
71
|
+
}];
|
|
72
|
+
w.setProps({
|
|
73
|
+
model: {
|
|
74
|
+
text: 'foo',
|
|
75
|
+
tokens: correctTokens
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
var result = w.instance().correctAnswer();
|
|
79
|
+
expect(result).toEqual(correctTokens);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vbWFpbi50ZXN0LmpzeCJdLCJuYW1lcyI6WyJqZXN0IiwibW9jayIsInByZXBhcmVUZXh0IiwiZm4iLCJkZXNjcmliZSIsImdldFdyYXBwZXIiLCJwcm9wcyIsInRleHQiLCJ0b2tlbnMiLCJzdGFydCIsImVuZCIsInNlbGVjdGVkVG9rZW5zIiwiaXQiLCJ3IiwiZXhwZWN0IiwidG9NYXRjaFNuYXBzaG90IiwicmF0aW9uYWxlIiwiaW5zdGFuY2UiLCJ0b2dnbGVTaG93Q29ycmVjdCIsImJlZm9yZUVhY2giLCJjb3JyZWN0VG9rZW5zIiwiY29ycmVjdCIsIm9sZFN0YXJ0Iiwib2xkRW5kIiwic2V0UHJvcHMiLCJtb2RlbCIsInJlc3VsdCIsImNvcnJlY3RBbnN3ZXIiLCJ0b0VxdWFsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFFQUEsSUFBSSxDQUFDQyxJQUFMLENBQVUsa0NBQVYsRUFBOEM7QUFBQSxTQUFPO0FBQ25EQyxJQUFBQSxXQUFXLEVBQUVGLElBQUksQ0FBQ0csRUFBTDtBQURzQyxHQUFQO0FBQUEsQ0FBOUM7QUFJQUMsUUFBUSxDQUFDLE1BQUQsRUFBUyxZQUFNO0FBQ3JCLE1BQU1DLFVBQVUsR0FBRyxTQUFiQSxVQUFhLENBQUNDLEtBQUQsRUFBVztBQUM1QixXQUFPLG1DQUNMLGdDQUFDLFVBQUQ7QUFDRSxNQUFBLGlCQUFpQixFQUFFTixJQUFJLENBQUNHLEVBQUwsRUFEckI7QUFFRSxNQUFBLEtBQUssRUFBRTtBQUNMSSxRQUFBQSxJQUFJLEVBQUUsS0FERDtBQUVMQyxRQUFBQSxNQUFNLEVBQUUsQ0FBQztBQUFFQyxVQUFBQSxLQUFLLEVBQUUsQ0FBVDtBQUFZQyxVQUFBQSxHQUFHLEVBQUUsQ0FBakI7QUFBb0JILFVBQUFBLElBQUksRUFBRTtBQUExQixTQUFEO0FBRkgsT0FGVDtBQU1FLE1BQUEsT0FBTyxFQUFFO0FBQ1BJLFFBQUFBLGNBQWMsRUFBRSxDQUFDO0FBQUVGLFVBQUFBLEtBQUssRUFBRSxDQUFUO0FBQVlDLFVBQUFBLEdBQUcsRUFBRSxDQUFqQjtBQUFvQkgsVUFBQUEsSUFBSSxFQUFFO0FBQTFCLFNBQUQ7QUFEVCxPQU5YO0FBU0UsTUFBQSxPQUFPLEVBQUU7QUFUWCxPQVVNRCxLQVZOLEVBREssQ0FBUDtBQWNELEdBZkQ7O0FBaUJBRixFQUFBQSxRQUFRLENBQUMsVUFBRCxFQUFhLFlBQU07QUFDekJRLElBQUFBLEVBQUUsQ0FBQyxTQUFELEVBQVksWUFBTTtBQUNsQixVQUFNQyxDQUFDLEdBQUdSLFVBQVUsRUFBcEI7QUFDQVMsTUFBQUEsTUFBTSxDQUFDRCxDQUFELENBQU4sQ0FBVUUsZUFBVjtBQUNELEtBSEMsQ0FBRjtBQUtBSCxJQUFBQSxFQUFFLENBQUMsbUJBQUQsRUFBc0IsWUFBTTtBQUM1QixVQUFNQyxDQUFDLEdBQUdSLFVBQVUsQ0FBQztBQUFFVyxRQUFBQSxTQUFTLEVBQUU7QUFBYixPQUFELENBQXBCO0FBQ0FGLE1BQUFBLE1BQU0sQ0FBQ0QsQ0FBRCxDQUFOLENBQVVFLGVBQVY7QUFDRCxLQUhDLENBQUY7QUFLQUgsSUFBQUEsRUFBRSxDQUFDLHFCQUFELEVBQXdCLFlBQU07QUFDOUIsVUFBTUMsQ0FBQyxHQUFHUixVQUFVLEVBQXBCO0FBQ0FRLE1BQUFBLENBQUMsQ0FBQ0ksUUFBRixHQUFhQyxpQkFBYjtBQUNBSixNQUFBQSxNQUFNLENBQUNELENBQUQsQ0FBTixDQUFVRSxlQUFWO0FBQ0QsS0FKQyxDQUFGO0FBS0QsR0FoQk8sQ0FBUjtBQWtCQVgsRUFBQUEsUUFBUSxDQUFDLE9BQUQsRUFBVSxZQUFNO0FBQ3RCLFFBQUlTLENBQUo7QUFFQU0sSUFBQUEsVUFBVSxDQUFDLFlBQU07QUFDZk4sTUFBQUEsQ0FBQyxHQUFHUixVQUFVLEVBQWQ7QUFDRCxLQUZTLENBQVY7QUFJQU8sSUFBQUEsRUFBRSxDQUFDLHNCQUFELEVBQXlCLFlBQU07QUFDL0IsVUFBTVEsYUFBYSxHQUFHLENBQUM7QUFBRVgsUUFBQUEsS0FBSyxFQUFFLENBQVQ7QUFBWUMsUUFBQUEsR0FBRyxFQUFFLENBQWpCO0FBQW9CSCxRQUFBQSxJQUFJLEVBQUUsR0FBMUI7QUFBK0JjLFFBQUFBLE9BQU8sRUFBRSxJQUF4QztBQUE4Q0MsUUFBQUEsUUFBUSxFQUFFLENBQXhEO0FBQTJEQyxRQUFBQSxNQUFNLEVBQUU7QUFBbkUsT0FBRCxDQUF0QjtBQUNBVixNQUFBQSxDQUFDLENBQUNXLFFBQUYsQ0FBVztBQUNUQyxRQUFBQSxLQUFLLEVBQUU7QUFBRWxCLFVBQUFBLElBQUksRUFBRSxLQUFSO0FBQWVDLFVBQUFBLE1BQU0sRUFBRVk7QUFBdkI7QUFERSxPQUFYO0FBR0EsVUFBTU0sTUFBTSxHQUFHYixDQUFDLENBQUNJLFFBQUYsR0FBYVUsYUFBYixFQUFmO0FBQ0FiLE1BQUFBLE1BQU0sQ0FBQ1ksTUFBRCxDQUFOLENBQWVFLE9BQWYsQ0FBdUJSLGFBQXZCO0FBQ0QsS0FQQyxDQUFGO0FBUUQsR0FmTyxDQUFSO0FBZ0JELENBcERPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzaGFsbG93IH0gZnJvbSAnZW56eW1lJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBNYWluIH0gZnJvbSAnLi4vbWFpbic7XG5cbmplc3QubW9jaygnQHBpZS1saWIvcGllLXRvb2xib3gvdGV4dC1zZWxlY3QnLCAoKSA9PiAoe1xuICBwcmVwYXJlVGV4dDogamVzdC5mbigpLFxufSkpO1xuXG5kZXNjcmliZSgnbWFpbicsICgpID0+IHtcbiAgY29uc3QgZ2V0V3JhcHBlciA9IChwcm9wcykgPT4ge1xuICAgIHJldHVybiBzaGFsbG93KFxuICAgICAgPE1haW5cbiAgICAgICAgb25TZWxlY3Rpb25DaGFuZ2U9e2plc3QuZm4oKX1cbiAgICAgICAgbW9kZWw9e3tcbiAgICAgICAgICB0ZXh0OiAnZm9vJyxcbiAgICAgICAgICB0b2tlbnM6IFt7IHN0YXJ0OiAwLCBlbmQ6IDEsIHRleHQ6ICdmJyB9XSxcbiAgICAgICAgfX1cbiAgICAgICAgc2Vzc2lvbj17e1xuICAgICAgICAgIHNlbGVjdGVkVG9rZW5zOiBbeyBzdGFydDogMCwgZW5kOiAxLCB0ZXh0OiAnZicgfV0sXG4gICAgICAgIH19XG4gICAgICAgIGNsYXNzZXM9e3t9fVxuICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAvPixcbiAgICApO1xuICB9O1xuXG4gIGRlc2NyaWJlKCdzbmFwc2hvdCcsICgpID0+IHtcbiAgICBpdCgncmVuZGVycycsICgpID0+IHtcbiAgICAgIGNvbnN0IHcgPSBnZXRXcmFwcGVyKCk7XG4gICAgICBleHBlY3QodykudG9NYXRjaFNuYXBzaG90KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyByYXRpb25hbGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3ID0gZ2V0V3JhcHBlcih7IHJhdGlvbmFsZTogJ1RoaXMgaXMgcmF0aW9uYWxlICcgfSk7XG4gICAgICBleHBlY3QodykudG9NYXRjaFNuYXBzaG90KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBzaG93Q29ycmVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHcgPSBnZXRXcmFwcGVyKCk7XG4gICAgICB3Lmluc3RhbmNlKCkudG9nZ2xlU2hvd0NvcnJlY3QoKTtcbiAgICAgIGV4cGVjdCh3KS50b01hdGNoU25hcHNob3QoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2xvZ2ljJywgKCkgPT4ge1xuICAgIGxldCB3O1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICB3ID0gZ2V0V3JhcHBlcigpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3dzIGNvcnJlY3QgYW5zd2VyJywgKCkgPT4ge1xuICAgICAgY29uc3QgY29ycmVjdFRva2VucyA9IFt7IHN0YXJ0OiAwLCBlbmQ6IDEsIHRleHQ6ICdmJywgY29ycmVjdDogdHJ1ZSwgb2xkU3RhcnQ6IDAsIG9sZEVuZDogMSB9XTtcbiAgICAgIHcuc2V0UHJvcHMoe1xuICAgICAgICBtb2RlbDogeyB0ZXh0OiAnZm9vJywgdG9rZW5zOiBjb3JyZWN0VG9rZW5zIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHcuaW5zdGFuY2UoKS5jb3JyZWN0QW5zd2VyKCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGNvcnJlY3RUb2tlbnMpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
package/lib/main.js
CHANGED
|
@@ -35,6 +35,8 @@ var _styles = require("@material-ui/core/styles");
|
|
|
35
35
|
|
|
36
36
|
var _utils = _interopRequireDefault(require("./utils"));
|
|
37
37
|
|
|
38
|
+
var _classnames = _interopRequireDefault(require("classnames"));
|
|
39
|
+
|
|
38
40
|
var _debug = _interopRequireDefault(require("debug"));
|
|
39
41
|
|
|
40
42
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
@@ -73,9 +75,26 @@ var Main = /*#__PURE__*/function (_React$Component) {
|
|
|
73
75
|
return t.correct;
|
|
74
76
|
});
|
|
75
77
|
});
|
|
78
|
+
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "initializeTokenizedText", function (html, onClick) {
|
|
79
|
+
var classes = _this.props.classes;
|
|
80
|
+
var container = document.createElement('div');
|
|
81
|
+
container.innerHTML = html;
|
|
82
|
+
var spans = container.querySelectorAll('span');
|
|
83
|
+
spans.forEach(function (span) {
|
|
84
|
+
span.className = (0, _classnames["default"])(classes.token); // span.addEventListener('click', (e) => onClick(e));
|
|
85
|
+
});
|
|
86
|
+
return container.innerHTML;
|
|
87
|
+
});
|
|
88
|
+
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleTokenClick", function (event) {
|
|
89
|
+
console.log('event click', event.target.id);
|
|
90
|
+
event.target.classList.toggle('selected');
|
|
91
|
+
});
|
|
76
92
|
_this.state = {
|
|
77
93
|
showCorrectAnswer: _this.props.model.alwaysShowCorrect || false,
|
|
78
|
-
model: (0, _utils["default"])(props.model)
|
|
94
|
+
model: _objectSpread(_objectSpread({}, (0, _utils["default"])(props.model)), {}, {
|
|
95
|
+
tokenizedText: _this.initializeTokenizedText(props.model.tokenizedText || props.model.text, _this.handleTokenClick)
|
|
96
|
+
}),
|
|
97
|
+
selectedTokens: []
|
|
79
98
|
};
|
|
80
99
|
return _this;
|
|
81
100
|
}
|
|
@@ -85,7 +104,9 @@ var Main = /*#__PURE__*/function (_React$Component) {
|
|
|
85
104
|
value: function UNSAFE_componentWillReceiveProps(nextProps) {
|
|
86
105
|
this.setState({
|
|
87
106
|
showCorrectAnswer: !!nextProps.model.alwaysShowCorrect,
|
|
88
|
-
model: (0, _utils["default"])(nextProps.model)
|
|
107
|
+
model: _objectSpread(_objectSpread({}, (0, _utils["default"])(nextProps.model)), {}, {
|
|
108
|
+
tokenizedText: this.initializeTokenizedText(nextProps.model.tokenizedText || nextProps.model.text, this.handleTokenClick)
|
|
109
|
+
})
|
|
89
110
|
});
|
|
90
111
|
}
|
|
91
112
|
}, {
|
|
@@ -135,7 +156,7 @@ var Main = /*#__PURE__*/function (_React$Component) {
|
|
|
135
156
|
}), /*#__PURE__*/_react["default"].createElement(_textSelect.TextSelect, {
|
|
136
157
|
className: classes.textSelect,
|
|
137
158
|
disabled: model.disabled,
|
|
138
|
-
text: model.text,
|
|
159
|
+
text: model.tokenizedText || model.text,
|
|
139
160
|
tokens: model.tokens,
|
|
140
161
|
selectedTokens: selectedTokens,
|
|
141
162
|
onChange: function onChange(selection) {
|
|
@@ -158,8 +179,7 @@ var Main = /*#__PURE__*/function (_React$Component) {
|
|
|
158
179
|
maxNoOfSelections: model.maxSelections,
|
|
159
180
|
animationsDisabled: model.animationsDisabled
|
|
160
181
|
}), mode === 'evaluate' && /*#__PURE__*/_react["default"].createElement(_textSelect.Legend, {
|
|
161
|
-
language: model.language
|
|
162
|
-
showOnlyCorrect: showCorrectAnswer
|
|
182
|
+
language: model.language
|
|
163
183
|
}), showRationale && (!model.animationsDisabled ? /*#__PURE__*/_react["default"].createElement(_renderUi.Collapsible, {
|
|
164
184
|
labels: {
|
|
165
185
|
hidden: 'Show Rationale',
|
|
@@ -203,6 +223,20 @@ var StyledMain = (0, _styles.withStyles)(function (theme) {
|
|
|
203
223
|
},
|
|
204
224
|
collapsible: {
|
|
205
225
|
marginBottom: theme.spacing.unit * 2
|
|
226
|
+
},
|
|
227
|
+
token: {
|
|
228
|
+
position: 'relative',
|
|
229
|
+
cursor: 'pointer',
|
|
230
|
+
border: 'dashed 2px grey',
|
|
231
|
+
lineHeight: '24px',
|
|
232
|
+
// backgroundColor: '#fff9c4',
|
|
233
|
+
'&:hover': {
|
|
234
|
+
backgroundColor: '#9fa8da'
|
|
235
|
+
},
|
|
236
|
+
'&.selected': {
|
|
237
|
+
backgroundColor: '#9fa8da',
|
|
238
|
+
border: 'none'
|
|
239
|
+
}
|
|
206
240
|
}
|
|
207
241
|
};
|
|
208
242
|
})(Main);
|
|
@@ -261,4 +295,4 @@ var Stateful = /*#__PURE__*/function (_React$Component2) {
|
|
|
261
295
|
|
|
262
296
|
exports["default"] = Stateful;
|
|
263
297
|
(0, _defineProperty2["default"])(Stateful, "propTypes", Types);
|
|
264
|
-
//# sourceMappingURL=main.js.map
|
|
298
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYWluLmpzeCJdLCJuYW1lcyI6WyJsb2ciLCJUeXBlcyIsIm1vZGVsIiwiUHJvcFR5cGVzIiwib2JqZWN0Iiwic2Vzc2lvbiIsIm9uU2VsZWN0aW9uQ2hhbmdlIiwiZnVuYyIsImlzUmVxdWlyZWQiLCJNYWluIiwicHJvcHMiLCJzZXRTdGF0ZSIsInNob3dDb3JyZWN0QW5zd2VyIiwic3RhdGUiLCJ0b2tlbnMiLCJmaWx0ZXIiLCJ0IiwiY29ycmVjdCIsImh0bWwiLCJvbkNsaWNrIiwiY2xhc3NlcyIsImNvbnRhaW5lciIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImlubmVySFRNTCIsInNwYW5zIiwicXVlcnlTZWxlY3RvckFsbCIsImZvckVhY2giLCJzcGFuIiwiY2xhc3NOYW1lIiwidG9rZW4iLCJldmVudCIsImNvbnNvbGUiLCJ0YXJnZXQiLCJpZCIsImNsYXNzTGlzdCIsInRvZ2dsZSIsImFsd2F5c1Nob3dDb3JyZWN0IiwidG9rZW5pemVkVGV4dCIsImluaXRpYWxpemVUb2tlbml6ZWRUZXh0IiwidGV4dCIsImhhbmRsZVRva2VuQ2xpY2siLCJzZWxlY3RlZFRva2VucyIsIm5leHRQcm9wcyIsImVudiIsImV4dHJhQ1NTUnVsZXMiLCJtb2RlIiwiY29ycmVjdEFuc3dlciIsInNob3dSYXRpb25hbGUiLCJyYXRpb25hbGUiLCJzaG93VGVhY2hlckluc3RydWN0aW9ucyIsInRlYWNoZXJJbnN0cnVjdGlvbnMiLCJtYWluQ29udGFpbmVyIiwiYW5pbWF0aW9uc0Rpc2FibGVkIiwiaGlkZGVuIiwidmlzaWJsZSIsImNvbGxhcHNpYmxlIiwicHJvbXB0IiwiZGlzYWJsZWQiLCJpbmNvcnJlY3QiLCJ0b2dnbGVTaG93Q29ycmVjdCIsImxhbmd1YWdlIiwidGV4dFNlbGVjdCIsInNlbGVjdGlvbiIsIm5ld1NlbGVjdGlvbnMiLCJtYXAiLCJzZWxlY3QiLCJmaW5kIiwic3RhcnQiLCJlbmQiLCJoaWdobGlnaHRDaG9pY2VzIiwibWF4U2VsZWN0aW9ucyIsImNvcnJlY3RuZXNzIiwiZmVlZGJhY2siLCJSZWFjdCIsIkNvbXBvbmVudCIsIlN0eWxlZE1haW4iLCJ0aGVtZSIsImNvbG9yIiwiYmFja2dyb3VuZENvbG9yIiwiYmFja2dyb3VuZCIsIm1hcmdpbkJvdHRvbSIsInNwYWNpbmciLCJ1bml0IiwibWFyZ2luVG9wIiwid2hpdGVTcGFjZSIsInZlcnRpY2FsQWxpZ24iLCJwb3NpdGlvbiIsImN1cnNvciIsImJvcmRlciIsImxpbmVIZWlnaHQiLCJTdGF0ZWZ1bCIsImNoYW5nZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFTQTs7QUFDQTs7QUFDQTs7QUFFQTs7Ozs7Ozs7OztBQUVBLElBQU1BLEdBQUcsR0FBRyx1QkFBTSxxQkFBTixDQUFaO0FBRUEsSUFBTUMsS0FBSyxHQUFHO0FBQ1pDLEVBQUFBLEtBQUssRUFBRUMsc0JBQVVDLE1BREw7QUFFWkMsRUFBQUEsT0FBTyxFQUFFRixzQkFBVUMsTUFGUDtBQUdaRSxFQUFBQSxpQkFBaUIsRUFBRUgsc0JBQVVJLElBQVYsQ0FBZUM7QUFIdEIsQ0FBZDs7SUFNYUMsSTs7Ozs7QUFLWCxnQkFBWUMsS0FBWixFQUFtQjtBQUFBOztBQUFBO0FBQ2pCLDhCQUFNQSxLQUFOO0FBRGlCLDBHQTZCQyxZQUFNO0FBQ3hCLFlBQUtDLFFBQUwsQ0FBYztBQUFFQyxRQUFBQSxpQkFBaUIsRUFBRSxDQUFDLE1BQUtDLEtBQUwsQ0FBV0Q7QUFBakMsT0FBZDtBQUNELEtBL0JrQjtBQUFBLHNHQWlDSCxZQUFNO0FBQ3BCLFVBQVFWLEtBQVIsR0FBa0IsTUFBS1csS0FBdkIsQ0FBUVgsS0FBUjtBQUVBLGFBQU9BLEtBQUssQ0FBQ1ksTUFBTixDQUFhQyxNQUFiLENBQW9CLFVBQUNDLENBQUQ7QUFBQSxlQUFPQSxDQUFDLENBQUNDLE9BQVQ7QUFBQSxPQUFwQixDQUFQO0FBQ0QsS0FyQ2tCO0FBQUEsZ0hBdUNPLFVBQUNDLElBQUQs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TCxDQUFXSixpQkFBWCxDQUE2QixPQUFLTyxLQUFMLENBQVdSLE9BQVgsQ0FBbUJxQyxjQUFoRDtBQUNELE9BRkQ7QUFHRCxLQWpCa0I7QUFFakIsV0FBSzdCLEtBQUwsR0FBYTtBQUNYWCxNQUFBQSxLQUFLLEVBQUVRLEtBQUssQ0FBQ1IsS0FERjtBQUVYRyxNQUFBQSxPQUFPLEVBQUVLLEtBQUssQ0FBQ0w7QUFGSixLQUFiO0FBRmlCO0FBTWxCOzs7O1dBRUQsMENBQWlDc0MsU0FBakMsRUFBNEM7QUFDMUMsV0FBS2hDLFFBQUwsQ0FBYztBQUFFVCxRQUFBQSxLQUFLLEVBQUV5QyxTQUFTLENBQUN6QyxLQUFuQjtBQUEwQkcsUUFBQUEsT0FBTyxFQUFFc0MsU0FBUyxDQUFDdEM7QUFBN0MsT0FBZDtBQUNEOzs7V0FTRCxrQkFBUztBQUNQLHlCQUEyQixLQUFLUSxLQUFoQztBQUFBLFVBQVFYLEtBQVIsZ0JBQVFBLEtBQVI7QUFBQSxVQUFlRyxPQUFmLGdCQUFlQSxPQUFmO0FBQ0EsMEJBQU8sZ0NBQUMsVUFBRDtBQUFZLFFBQUEsS0FBSyxFQUFFSCxLQUFuQjtBQUEwQixRQUFBLE9BQU8sRUFBRUcsT0FBbkM7QUFBNEMsUUFBQSxpQkFBaUIsRUFBRSxLQUFLdUY7QUFBcEUsUUFBUDtBQUNEOzs7RUF6Qm1DbEIsa0JBQU1DLFM7OztpQ0FBdkJnQixRLGVBQ0ExRixLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBUZXh0U2VsZWN0LCBMZWdlbmQgfSBmcm9tICdAcGllLWxpYi9waWUtdG9vbGJveC90ZXh0LXNlbGVjdCc7XG5pbXBvcnQgeyBDb3JyZWN0QW5zd2VyVG9nZ2xlIH0gZnJvbSAnQHBpZS1saWIvcGllLXRvb2xib3gvY29ycmVjdC1hbnN3ZXItdG9nZ2xlJztcbmltcG9ydCB7XG4gIGNvbG9yLFxuICBGZWVkYmFjayxcbiAgQ29sbGFwc2libGUsXG4gIGhhc1RleHQsXG4gIGhhc01lZGlhLFxuICBQcmV2aWV3UHJvbXB0LFxuICBVaUxheW91dCxcbn0gZnJvbSAnQHBpZS1saWIvcGllLXRvb2xib3gvcmVuZGVyLXVpJztcbmltcG9ydCB7IHdpdGhTdHlsZXMgfSBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9zdHlsZXMnO1xuaW1wb3J0IGdlbmVyYXRlTW9kZWwgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcblxuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcblxuY29uc3QgbG9nID0gZGVidWcoJ0BwaWUtdWk6c2VsZWN0LXRleHQnKTtcblxuY29uc3QgVHlwZXMgPSB7XG4gIG1vZGVsOiBQcm9wVHlwZXMub2JqZWN0LFxuICBzZXNzaW9uOiBQcm9wVHlwZXMub2JqZWN0LFxuICBvblNlbGVjdGlvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbn07XG5cbmV4cG9ydCBjbGFzcyBNYWluIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHsgLi4uVHlwZXMsIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCB9O1xuXG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7fTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBzaG93Q29ycmVjdEFuc3dlcjogdGhpcy5wcm9wcy5tb2RlbC5hbHdheXNTaG93Q29ycmVjdCB8fCBmYWxzZSxcbiAgICAgIG1vZGVsOiB7XG4gICAgICAgIC4uLmdlbmVyYXRlTW9kZWwocHJvcHMubW9kZWwpLFxuICAgICAgICB0b2tlbml6ZWRUZXh0OiB0aGlzLmluaXRpYWxpemVUb2tlbml6ZWRUZXh0KFxuICAgICAgICAgIHByb3BzLm1vZGVsLnRva2VuaXplZFRleHQgfHwgcHJvcHMubW9kZWwudGV4dCxcbiAgICAgICAgICB0aGlzLmhhbmRsZVRva2VuQ2xpY2ssXG4gICAgICAgICksXG4gICAgICB9LFxuICAgICAgc2VsZWN0ZWRUb2tlbnM6IFtdLFxuICAgIH07XG4gIH1cblxuICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHNob3dDb3JyZWN0QW5zd2VyOiAhIW5leHRQcm9wcy5tb2RlbC5hbHdheXNTaG93Q29ycmVjdCxcbiAgICAgIG1vZGVsOiB7XG4gICAgICAgIC4uLmdlbmVyYXRlTW9kZWwobmV4dFByb3BzLm1vZGVsKSxcbiAgICAgICAgdG9rZW5pemVkVGV4dDogdGhpcy5pbml0aWFsaXplVG9rZW5pemVkVGV4dChcbiAgICAgICAgICBuZXh0UHJvcHMubW9kZWwudG9rZW5pemVkVGV4dCB8fCBuZXh0UHJvcHMubW9kZWwudGV4dCxcbiAgICAgICAgICB0aGlzLmhhbmRsZVRva2VuQ2xpY2ssXG4gICAgICAgICksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgdG9nZ2xlU2hvd0NvcnJlY3QgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IHNob3dDb3JyZWN0QW5zd2VyOiAhdGhpcy5zdGF0ZS5zaG93Q29ycmVjdEFuc3dlciB9KTtcbiAgfTtcblxuICBjb3JyZWN0QW5zd2VyID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgbW9kZWwgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICByZXR1cm4gbW9kZWwudG9rZW5zLmZpbHRlcigodCkgPT4gdC5jb3JyZWN0KTtcbiAgfTtcblxuICBpbml0aWFsaXplVG9rZW5pemVkVGV4dCA9IChodG1sLCBvbkNsaWNrKSA9PiB7XG4gICAgY29uc3QgeyBjbGFzc2VzIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgY29uc3Qgc3BhbnMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnc3BhbicpO1xuXG4gICAgc3BhbnMuZm9yRWFjaCgoc3BhbikgPT4ge1xuICAgICAgc3Bhbi5jbGFzc05hbWUgPSBjbGFzc05hbWVzKGNsYXNzZXMudG9rZW4pO1xuICAgICAgLy8gc3Bhbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiBvbkNsaWNrKGUpKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBjb250YWluZXIuaW5uZXJIVE1MO1xuICB9O1xuXG4gIGhhbmRsZVRva2VuQ2xpY2sgPSAoZXZlbnQpID0+IHtcbiAgICBjb25zb2xlLmxvZygnZXZlbnQgY2xpY2snLCBldmVudC50YXJnZXQuaWQpO1xuXG4gICAgZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC50b2dnbGUoJ3NlbGVjdGVkJyk7XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHsgc2Vzc2lvbiwgb25TZWxlY3Rpb25DaGFuZ2UsIGNsYXNzZXMgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgeyBzaG93Q29ycmVjdEFuc3dlciwgbW9kZWwgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgeyBlbnYsIGV4dHJhQ1NTUnVsZXMgfSA9IG1vZGVsO1xuICAgIGNvbnN0IHsgbW9kZSB9ID0gZW52IHx8IHt9O1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRUb2tlbnMgPSBzaG93Q29ycmVjdEFuc3dlciA/IHRoaXMuY29ycmVjdEFuc3dlcigpIDogc2Vzc2lvbi5zZWxlY3RlZFRva2VucztcbiAgICBjb25zdCBzaG93UmF0aW9uYWxlID0gbW9kZWwucmF0aW9uYWxlICYmIChoYXNUZXh0KG1vZGVsLnJhdGlvbmFsZSkgfHwgaGFzTWVkaWEobW9kZWwucmF0aW9uYWxlKSk7XG4gICAgY29uc3Qgc2hvd1RlYWNoZXJJbnN0cnVjdGlvbnMgPVxuICAgICAgbW9kZWwudGVhY2hlckluc3RydWN0aW9ucyAmJiAoaGFzVGV4dChtb2RlbC50ZWFjaGVySW5zdHJ1Y3Rpb25zKSB8fCBoYXNNZWRpYShtb2RlbC50ZWFjaGVySW5zdHJ1Y3Rpb25zKSk7XG5cbiAgICBsb2coJ1tyZW5kZXJdIHNlbGVjdGVkVG9rZW5zOicsIHNlbGVjdGVkVG9rZW5zKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8VWlMYXlvdXQgZXh0cmFDU1NSdWxlcz17ZXh0cmFDU1NSdWxlc30gY2xhc3NOYW1lPXtjbGFzc2VzLm1haW5Db250YWluZXJ9PlxuICAgICAgICB7c2hvd1RlYWNoZXJJbnN0cnVjdGlvbnMgJiZcbiAgICAgICAgICAoIW1vZGVsLmFuaW1hdGlvbnNEaXNhYmxlZCA/IChcbiAgICAgICAgICAgIDxDb2xsYXBzaWJsZVxuICAgICAgICAgICAgICBsYWJlbHM9e3sgaGlkZGVuOiAnU2hvdyBUZWFjaGVyIEluc3RydWN0aW9ucycsIHZpc2libGU6ICdIaWRlIFRlYWNoZXIgSW5zdHJ1Y3Rpb25zJyB9fVxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMuY29sbGFwc2libGV9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxQcmV2aWV3UHJvbXB0IHByb21wdD17bW9kZWwudGVhY2hlckluc3RydWN0aW9uc30gLz5cbiAgICAgICAgICAgIDwvQ29sbGFwc2libGU+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbGFzc2VzLnByb21wdH0+XG4gICAgICAgICAgICAgIDxQcmV2aWV3UHJvbXB0IHByb21wdD17bW9kZWwudGVhY2hlckluc3RydWN0aW9uc30gLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkpfVxuXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbGFzc2VzLnByb21wdH0+XG4gICAgICAgICAgPFByZXZpZXdQcm9tcHQgcHJvbXB0PXttb2RlbC5wcm9tcHR9IC8+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIHshbW9kZWwuYWx3YXlzU2hvd0NvcnJlY3QgJiYgKFxuICAgICAgICAgIDxDb3JyZWN0QW5zd2VyVG9nZ2xlXG4gICAgICAgICAgICBzaG93PXttb2RlbC5kaXNhYmxlZCAmJiBtb2RlbC5pbmNvcnJlY3R9XG4gICAgICAgICAgICB0b2dnbGVkPXtzaG93Q29ycmVjdEFuc3dlcn1cbiAgICAgICAgICAgIG9uVG9nZ2xlPXt0aGlzLnRvZ2dsZVNob3dDb3JyZWN0fVxuICAgICAgICAgICAgbGFuZ3VhZ2U9e21vZGVsLmxhbmd1YWdlfVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG5cbiAgICAgICAgPFRleHRTZWxlY3RcbiAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMudGV4dFNlbGVjdH1cbiAgICAgICAgICBkaXNhYmxlZD17bW9kZWwuZGlzYWJsZWR9XG4gICAgICAgICAgdGV4dD17bW9kZWwudG9rZW5pemVkVGV4dCB8fCBtb2RlbC50ZXh0fVxuICAgICAgICAgIHRva2Vucz17bW9kZWwudG9rZW5zfVxuICAgICAgICAgIHNlbGVjdGVkVG9rZW5zPXtzZWxlY3RlZFRva2Vuc31cbiAgICAgICAgICBvbkNoYW5nZT17KHNlbGVjdGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9ucyA9IHNlbGVjdGlvbi5tYXAoKHNlbGVjdCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB0b2tlbiA9IG1vZGVsLnRva2Vucy5maW5kKCh7IHN0YXJ0LCBlbmQgfSkgPT4gc2VsZWN0LnN0YXJ0ID09PSBzdGFydCAmJiBzZWxlY3QuZW5kID09PSBlbmQpO1xuXG4gICAgICAgICAgICAgIC8vIG5lZWRlZCBmb3IgZ2V0U2NvcmUgd2hlbiB0b2tlbnMgcG9zaXRpb24gaXMgcmVjYWxjdWxhdGVkLCB0byBrZWVwIG9sZFN0YXJ0IGFuZCBvbGRFbmRcbiAgICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBvblNlbGVjdGlvbkNoYW5nZShuZXdTZWxlY3Rpb25zKTtcbiAgICAgICAgICB9fVxuICAgICAgICAgIGhpZ2hsaWdodENob2ljZXM9e21vZGVsLmhpZ2hsaWdodENob2ljZXN9XG4gICAgICAgICAgbWF4Tm9PZlNlbGVjdGlvbnM9e21vZGVsLm1heFNlbGVjdGlvbnN9XG4gICAgICAgICAgYW5pbWF0aW9uc0Rpc2FibGVkPXttb2RlbC5hbmltYXRpb25zRGlzYWJsZWR9XG4gICAgICAgIC8+XG4gICAgICAgIHttb2RlID09PSAnZXZhbHVhdGUnICYmIDxMZWdlbmQgbGFuZ3VhZ2U9e21vZGVsLmxhbmd1YWdlfSAvPn1cblxuICAgICAgICB7c2hvd1JhdGlvbmFsZSAmJlxuICAgICAgICAgICghbW9kZWwuYW5pbWF0aW9uc0Rpc2FibGVkID8gKFxuICAgICAgICAgICAgPENvbGxhcHNpYmxlXG4gICAgICAgICAgICAgIGxhYmVscz17eyBoaWRkZW46ICdTaG93IFJhdGlvbmFsZScsIHZpc2libGU6ICdIaWRlIFJhdGlvbmFsZScgfX1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzLmNvbGxhcHNpYmxlfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8UHJldmlld1Byb21wdCBwcm9tcHQ9e21vZGVsLnJhdGlvbmFsZX0gLz5cbiAgICAgICAgICAgIDwvQ29sbGFwc2libGU+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbGFzc2VzLnByb21wdH0+XG4gICAgICAgICAgICAgIDxQcmV2aWV3UHJvbXB0IHByb21wdD17bW9kZWwucmF0aW9uYWxlfSAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSl9XG5cbiAgICAgICAge21vZGVsLmNvcnJlY3RuZXNzICYmIG1vZGVsLmZlZWRiYWNrICYmICFzaG93Q29ycmVjdEFuc3dlciAmJiAoXG4gICAgICAgICAgPEZlZWRiYWNrIGNvcnJlY3RuZXNzPXttb2RlbC5jb3JyZWN0bmVzc30gZmVlZGJhY2s9e21vZGVsLmZlZWRiYWNrfSAvPlxuICAgICAgICApfVxuICAgICAgPC9VaUxheW91dD5cbiAgICApO1xuICB9XG59XG5cbmNvbnN0IFN0eWxlZE1haW4gPSB3aXRoU3R5bGVzKCh0aGVtZSkgPT4gKHtcbiAgbWFpbkNvbnRhaW5lcjoge1xuICAgIGNvbG9yOiBjb2xvci50ZXh0KCksXG4gICAgYmFja2dyb3VuZENvbG9yOiBjb2xvci5iYWNrZ3JvdW5kKCksXG4gIH0sXG4gIHRleHRTZWxlY3Q6IHtcbiAgICBtYXJnaW5Cb3R0b206IHRoZW1lLnNwYWNpbmcudW5pdCxcbiAgICBtYXJnaW5Ub3A6IHRoZW1lLnNwYWNpbmcudW5pdCAqIDIsXG4gICAgd2hpdGVTcGFjZTogJ25vcm1hbCcsXG4gIH0sXG4gIHByb21wdDoge1xuICAgIHZlcnRpY2FsQWxpZ246ICdtaWRkbGUnLFxuICAgIG1hcmdpbkJvdHRvbTogdGhlbWUuc3BhY2luZy51bml0LFxuICB9LFxuICBjb2xsYXBzaWJsZToge1xuICAgIG1hcmdpbkJvdHRvbTogdGhlbWUuc3BhY2luZy51bml0ICogMixcbiAgfSxcbiAgdG9rZW46IHtcbiAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICBib3JkZXI6ICdkYXNoZWQgMnB4IGdyZXknLFxuICAgIGxpbmVIZWlnaHQ6ICcyNHB4JyxcbiAgICAvLyBiYWNrZ3JvdW5kQ29sb3I6ICcjZmZmOWM0JyxcblxuICAgICcmOmhvdmVyJzoge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiAnIzlmYThkYScsXG4gICAgfSxcblxuICAgICcmLnNlbGVjdGVkJzoge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiAnIzlmYThkYScsXG4gICAgICBib3JkZXI6ICdub25lJyxcbiAgICB9LFxuICB9LFxufSkpKE1haW4pO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0ZWZ1bCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSBUeXBlcztcblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgbW9kZWw6IHByb3BzLm1vZGVsLFxuICAgICAgc2Vzc2lvbjogcHJvcHMuc2Vzc2lvbixcbiAgICB9O1xuICB9XG5cbiAgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IG1vZGVsOiBuZXh0UHJvcHMubW9kZWwsIHNlc3Npb246IG5leHRQcm9wcy5zZXNzaW9uIH0pO1xuICB9XG5cbiAgY2hhbmdlID0gKHNlbGVjdGVkVG9rZW5zKSA9PiB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IHsgLi4udGhpcy5zdGF0ZS5zZXNzaW9uLCBzZWxlY3RlZFRva2VucyB9O1xuICAgIHRoaXMuc2V0U3RhdGUoeyBzZXNzaW9uIH0sICgpID0+IHtcbiAgICAgIHRoaXMucHJvcHMub25TZWxlY3Rpb25DaGFuZ2UodGhpcy5zdGF0ZS5zZXNzaW9uLnNlbGVjdGVkVG9rZW5zKTtcbiAgICB9KTtcbiAgfTtcblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgeyBtb2RlbCwgc2Vzc2lvbiB9ID0gdGhpcy5zdGF0ZTtcbiAgICByZXR1cm4gPFN0eWxlZE1haW4gbW9kZWw9e21vZGVsfSBzZXNzaW9uPXtzZXNzaW9ufSBvblNlbGVjdGlvbkNoYW5nZT17dGhpcy5jaGFuZ2V9IC8+O1xuICB9XG59XG4iXX0=
|