From c987a27ee3c7fb8f1e9b646c8c0b21c25ff9a4fb Mon Sep 17 00:00:00 2001 From: mrfry Date: Thu, 19 Nov 2020 16:49:20 +0100 Subject: [PATCH] Basic test page handling --- stable.user.js | 288 +++++++++++++++++++++++++++++++------------------ 1 file changed, 186 insertions(+), 102 deletions(-) diff --git a/stable.user.js b/stable.user.js index f061245..bbaa20f 100755 --- a/stable.user.js +++ b/stable.user.js @@ -85,8 +85,8 @@ // forcing pages for testing. unless you test, do not set these to true! // only one of these should be true for testing setVal('ISDEVEL', true) - const forceTestPage = false - const forceResultPage = true + const forceTestPage = true + const forceResultPage = false const forceDefaultPage = false const logElementGetting = false const log = true @@ -160,10 +160,161 @@ } // ---------------------------------------------------------------------------------------------- - // Result page processing functions + // Basic processing helpers // ---------------------------------------------------------------------------------------------- - const uniq = a => [...new Set(a)] + function getTextPromisesFromNode(node) { + const promises = [] + Array.from(node.childNodes).forEach(elem => { + if (elem.tagName === 'IMG') { + promises.push(digestMessage(getBase64Image(elem))) + } else if (elem.tagName === undefined) { + promises.push({ type: 'txt', val: elem.nodeValue }) + } else { + promises.push({ type: 'txt', val: elem.innerText }) + } + }) + return promises + } + + function makeTextFromElements(item) { + // TODO! + // if (emptyOrWhiteSpace(item)) { + // return '' + // } + + if (item.type === 'img') { + return '[' + item.val + ']' + } else { + return item.val + } + } + + function getImagesFromElements(elements) { + return elements.reduce((acc, element) => { + if (element.type === 'img') { + acc.push(element.val) + } + return acc + }, []) + } + + function getCurrentSubjectName() { + if (logElementGetting) { + Log('getting current subjects name') + } + return document.getElementById('page-header').innerText.split('\n')[0] || '' + } + + function uniq(a) { + return [...new Set(a)] + } + + // ---------------------------------------------------------------------------------------------- + // Test page processing functions + // ---------------------------------------------------------------------------------------------- + + function handleQuiz() { + // TODO: dropdown in question + // TODO: multiple selects, img in question + // TODO: + const promises = [] + const subjName = getCurrentSubjectName() + const questionNodes = Array.from( + document.getElementsByTagName('form')[0].childNodes[0].childNodes + ) + + let i = 0 + while ( + i < questionNodes.length && + questionNodes[i].tagName === 'DIV' && + questionNodes[i].className !== 'submitbtns' + ) { + promises.push(getQuestionPromiseForSingleQuestion(questionNodes[i])) + i++ + } + + Promise.all(promises) + .then(res => { + console.log(res) + }) + .catch(err => { + console.warn('Error in handleQuiz()') + console.warn(err) + }) + } + + function getPossibleAnswersFromTest(node) { + const promises = [] + const answers = Array.from( + node.getElementsByClassName('answer')[0].childNodes + ) + + answers.forEach(answer => { + if (answer.tagName) { + promises.push(getTextPromisesFromNode(answer)) + } + }) + + return promises + } + + function getQuestionPromiseForSingleQuestion(node) { + return new Promise(resolve => { + const qtextNode = node.getElementsByClassName('qtext')[0] + + const questionPromises = getTextPromisesFromNode(qtextNode) + const possibleAnswerPromises = getPossibleAnswersFromTest(node) + + Promise.all([ + Promise.all(questionPromises), + Promise.all(possibleAnswerPromises), + ]) + .then(([question, possibleAnswerArray]) => { + const questionText = question.map(makeTextFromElements).join(' ') + const images = getImagesFromElements(question) + const data = getDataFromTest(images) + const possibleAnswers = possibleAnswerArray.map(x => { + return removeUnnecesarySpaces(x.map(makeTextFromElements).join(' ')) + }) + + console.log('\n\n\n') + console.log(questionText) + console.log(images) + possibleAnswers.forEach(x => { + console.log(x) + }) + + resolve({ + question: questionText, + possibleAnswers, + images, + data, + }) + }) + .catch(err => { + console.warn('Error in getQuestionPromiseForSingleQuestion()') + console.warn(err) + }) + }) + } + + function getDataFromTest(images) { + if (images.length > 0) { + return { + type: 'image', + images: images, + } + } else { + return { + type: 'simple', + } + } + } + + // ---------------------------------------------------------------------------------------------- + // Result page processing functions + // ---------------------------------------------------------------------------------------------- function getQuiz() { return new Promise(resolve => { @@ -187,7 +338,6 @@ // }] Promise.all(promises) .then(result => { - console.log(result) resolve(result) }) .catch(err => { @@ -207,7 +357,6 @@ return true } catch (e) { Log(`${key} failed`) - console.log(e) } } else { Log(`${key} did not pass`) @@ -233,28 +382,11 @@ resolve({ success: false }) } - const makeTextFromElements = element => { - if (element.type === 'img') { - return '[' + element.val + ']' - } else { - return element.val - } - } - - const getImagesFromElements = elements => { - return elements.reduce((acc, element) => { - if (element.type === 'img') { - acc.push(element.val) - } - return acc - }, []) - } - Promise.all([Promise.all(questionPromises), Promise.all(answerPromises)]) - .then(res => { - const questionText = res[0].map(makeTextFromElements).join(' ') - const answerText = res[1].map(makeTextFromElements).join(' ') - let images = getImagesFromElements([...res[0], ...res[1]]) + .then(([question, answer]) => { + const questionText = question.map(makeTextFromElements).join(' ') + const answerText = answer.map(makeTextFromElements).join(' ') + let images = getImagesFromElements([...question, ...answer]) images = uniq(images) resolve({ @@ -293,18 +425,7 @@ }, getterFunction: node => { let question = node.getElementsByClassName('qtext')[0] - const promises = [] - - Array.from(question.childNodes).forEach(elem => { - if (elem.tagName === 'IMG') { - promises.push(digestMessage(getBase64Image(elem))) - } else if (elem.tagName === undefined) { - promises.push({ type: 'txt', val: elem.nodeValue }) - } else { - promises.push({ type: 'txt', val: elem.innerText }) - } - }) - return promises + return getTextPromisesFromNode(question) }, }, } @@ -318,29 +439,7 @@ }, getterFunction: node => { let answer = node.getElementsByClassName('rightanswer')[0] - const promises = [] - - Array.from(answer.childNodes).forEach(elem => { - if (elem.tagName === 'IMG') { - promises.push(digestMessage(getBase64Image(elem))) - } else if (elem.tagName === undefined) { - promises.push({ type: 'txt', val: elem.nodeValue }) - } else { - promises.push({ type: 'txt', val: elem.innerText }) - } - }) - return promises - }, - }, - getDropdownAnswer: { - description: 'Dropdown answer getter', - index: 1, - requirement: node => { - return false - }, - getterFunction: node => { - // TODO dropdown kérdés.html - return 'asd' + return getTextPromisesFromNode(answer) }, }, noCorrect: { @@ -378,6 +477,28 @@ } }, }, + getDropdownAnswer: { + description: 'Dropdown answer getter', + index: 1, + requirement: node => { + return false + }, + getterFunction: node => { + // TODO dropdown kérdés.html + return 'asd' + }, + }, + getTextareaAnswer: { + description: 'Get complex answer', + index: 1, + requirement: node => { + return false + }, + getterFunction: node => { + // TODO Ugrás... bug.html + return 'asd' + }, + }, } function getIfSolutionIsCorrect(node) { @@ -620,13 +741,6 @@ // Misc // ---------------------------------------------------------------------------------------------- - function getCurrentSubjectName() { - if (logElementGetting) { - Log('getting current subjects name') - } - return document.getElementById('page-header').innerText.split('\n')[0] || '' - } - function getVideo() { if (logElementGetting) { Log('getting video stuff') @@ -680,7 +794,7 @@ forceTestPage ) { // if the current page is a test - HandleQuiz() + handleQuiz() } else if ( (url.includes('/quiz/') && url.includes('review.php')) || forceResultPage @@ -1014,38 +1128,7 @@ // : Answering stuffs {{{ - function HandleQuiz() { - // TODO - // var q = QPM.GetQuestionFromTest() - // var questions = q.q - // var imgNodes = q.imgnodes - // // ------------------------------------------------------------------------------------------------------ - // let promises = [] - // questions.forEach(x => { - // let question = SUtils.EmptyOrWhiteSpace(x) - // ? '' - // : SUtils.RemoveUnnecesarySpaces(x) // simplifying question - // promises.push( - // GetXHRQuestionAnswer({ - // q: question, - // data: GetImageDataFromImgNodes(imgNodes), - // subj: MPM.GetCurrentSubjectName(), - // }) - // ) - // }) - // Promise.all(promises).then(res => { - // let answers = [] - // res.forEach((result, j) => { - // var r = PrepareAnswers(result, j) - // if (r !== undefined) { - // answers.push(r) - // } - // HighLightAnswer(result, j) // highlights the answer for the current result - // }) - // ShowAnswers(answers, q.q) - // }) - } - + // TODO function PrepareAnswers(result, j) { assert(result) @@ -1077,6 +1160,7 @@ } } + // TODO function ShowAnswers(answers, question) { assert(answers)