diff --git a/stable.user.js b/stable.user.js index 022eae6..0740376 100755 --- a/stable.user.js +++ b/stable.user.js @@ -158,39 +158,29 @@ // Result page processing functions // ---------------------------------------------------------------------------------------------- function getQuiz() { - let result = [] - let i = 1 - let containerNode = document.getElementById(`q${i}`) - do { - const question = getQuestionFromNode(containerNode) - const answer = getAnswerFromNode(containerNode) - const image = getImageFromNode(containerNode) - result = [ - ...result, - { - Q: question, - A: answer, - data: getData(image), - }, - ] - console.log(question) - console.log(answer) - console.log(image) - console.log('') - console.log('') + return new Promise(resolve => { + let promises = [] + let i = 1 + let containerNode = document.getElementById(`q${i}`) + do { + promises.push(getQuizFromNode(containerNode)) - i++ - containerNode = document.getElementById(`q${i}`) - } while (containerNode) + i++ + containerNode = document.getElementById(`q${i}`) + } while (containerNode) - // [{ - // "Q": "Mekkora tényezővel kell számolnunk, ha 100.000 Ft jelenértékét keressük 24% kamatláb, havi tőkésítés és 2,5 éves futamidő mellett?\n\n\n", - // "A": "c.\n\n0,552\n", - // "data": { - // "type": "simple" - // } - // }] - return result + // [{ + // "Q": "Mekkora tényezővel kell számolnunk, ha 100.000 Ft jelenértékét keressük 24% kamatláb, havi tőkésítés és 2,5 éves futamidő mellett?\n\n\n", + // "A": "c.\n\n0,552\n", + // "data": { + // "type": "simple" + // } + // }] + Promise.all(promises).then(result => { + console.log(result) + resolve(result) + }) + }) } function getData(image) { @@ -206,24 +196,49 @@ } } - function getImageFromNode(node) { - const img = node.getElementsByTagName('img') - if (img.length === 0) { - return [] - } - return Array.from(img).map(image => { - return image.src - }) - } - - function getAnswerFromNode(node) { + function getAnswerPromisesFromNode(node) { let answer = node.getElementsByClassName('rightanswer') if (answer.length === 0) { console.warn('NO ANSWER FOR ANSWER') } answer = answer[0] + const promises = [] - return SUtils.RemoveUnnecesarySpaces(answer.innerHTML) + Array.from(answer.childNodes).forEach(elem => { + if (elem.tagName === 'IMG') { + promises.push(digestMessage(getBase64Image(elem))) + } else { + promises.push({ type: 'txt', val: elem.nodeValue }) + } + }) + return promises + } + + function getQuizFromNode(node) { + return new Promise(resolve => { + const promises = getAnswerPromisesFromNode(node) + + Promise.all(promises).then(res => { + const images = [] + const question = getQuestionFromNode(node) + const solution = res + .map(i => { + if (i.type === 'img') { + images.push(i.val) + return '[' + i.val + ']' + } else { + return i.val + } + }) + .join(' ') + + resolve({ + A: removeUnnecesarySpaces(solution), + Q: question, + images, + }) + }) + }) } function getQuestionFromNode(node) { @@ -235,6 +250,54 @@ return SUtils.RemoveUnnecesarySpaces(question) } + function getBase64Image(img) { + let canvas = document.createElement('canvas') + canvas.width = img.width + canvas.height = img.height + let ctx = canvas.getContext('2d') + ctx.drawImage(img, 0, 0) + let dataURL = canvas.toDataURL('image/png') + return dataURL.replace(/^data:image\/(png|jpg);base64,/, '') + } + + function digestMessage(message) { + return new Promise(resolve => { + const encoder = new TextEncoder() + const data = encoder.encode(message) + const hash = crypto.subtle.digest('SHA-256', data).then(buf => { + let res = String.fromCharCode.apply(null, new Uint8Array(buf)) + res = btoa(res) + .replace(/=/g, '') + .replace(/\+/g, '-') + .replace(/\//g, '_') + resolve({ type: 'img', val: res }) + }) + }) + } + + // ---------------------------------------------------------------------------------------------- + // String utils 2 + // ---------------------------------------------------------------------------------------------- + + function removeUnnecesarySpaces(toremove) { + assert(toremove) + + toremove = normalizeSpaces(toremove).replace(/\t/g, '') + while (toremove.includes(' ')) { + toremove = toremove.replace(/ {2}/g, ' ') + } + while (toremove.includes('\n\n')) { + toremove = toremove.replace(/\n{2}/g, ' ') + } + return toremove.trim() + } + + function normalizeSpaces(input) { + assert(input) + + return input.replace(/\s/g, ' ') + } + // ---------------------------------------------------------------------------------------------- class StringUtils { @@ -1072,7 +1135,9 @@ // : Quiz saving {{{ function HandleResults(url) { - SaveQuiz(getQuiz(), ShowSaveQuizDialog) // saves the quiz questions and answers + getQuiz().then(res => { + SaveQuiz(res, ShowSaveQuizDialog) // saves the quiz questions and answers + }) } function ShowSaveQuizDialog(sendResult, sentData, newQuestions) {