Question / answer getting imporvements, code refactoring

This commit is contained in:
mrfry 2020-11-19 13:38:18 +01:00
parent 2a612c1bd5
commit 46e83e2f1e

View file

@ -157,6 +157,9 @@
// ---------------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------------
// Result page processing functions // Result page processing functions
// ---------------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------------
const uniq = a => [...new Set(a)]
function getQuiz() { function getQuiz() {
return new Promise(resolve => { return new Promise(resolve => {
let promises = [] let promises = []
@ -176,88 +179,157 @@
// "type": "simple" // "type": "simple"
// } // }
// }] // }]
Promise.all(promises).then(result => { Promise.all(promises)
console.log(result) .then(result => {
resolve(result) console.log(result)
}) resolve(result)
})
.catch(err => {
console.warn('Error in getQuiz()')
console.warn(err)
})
}) })
} }
function getData(image) { function getPromisesThatMeetsRequirements(getters, node) {
if (image) { let res
Object.keys(getters).some(key => {
const getter = getters[key]
if (getter.requirement(node)) {
res = getter.getterFunction(node)
return true
} else {
Log(`${getter.description} did not pass`)
}
})
return res
}
function getQuizFromNode(node) {
return new Promise(resolve => {
const questionPromises = getPromisesThatMeetsRequirements(
questionGetters,
node
)
const answerPromises = getPromisesThatMeetsRequirements(
answerGetters,
node
)
if (!answerPromises || !questionPromises) {
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]])
images = uniq(images)
resolve({
A: removeUnnecesarySpaces(answerText),
Q: removeUnnecesarySpaces(questionText),
data: getData(images),
success: true,
})
})
.catch(err => {
console.warn('Error in getQuizFromNode()')
console.warn(err)
})
})
}
function getData(images) {
if (!images || images.length === 0) {
return { return {
type: 'simple', type: 'simple',
} }
} else { } else {
return { return {
type: 'image', type: 'image',
src: image, images: images,
} }
} }
} }
function getAnswerPromisesFromNode(node) { const questionGetters = {
let answer = node.getElementsByClassName('rightanswer') getSimpleQuestion: {
if (answer.length === 0) { description: 'Basic question getter',
console.warn('NO ANSWER FOR ANSWER') index: 0,
} requirement: node => {
answer = answer[0] return node.getElementsByClassName('qtext').length > 0
const promises = [] },
getterFunction: node => {
let question = node.getElementsByClassName('qtext')[0]
const promises = []
Array.from(answer.childNodes).forEach(elem => { Array.from(question.childNodes).forEach(elem => {
if (elem.tagName === 'IMG') { if (elem.tagName === 'IMG') {
promises.push(digestMessage(getBase64Image(elem))) promises.push(digestMessage(getBase64Image(elem)))
} else { } else if (elem.tagName === undefined) {
promises.push({ type: 'txt', val: elem.nodeValue }) promises.push({ type: 'txt', val: elem.nodeValue })
} } else {
}) promises.push({ type: 'txt', val: elem.innerText })
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,
}) })
}) return promises
}) },
},
} }
function getQuestionFromNode(node) { const answerGetters = {
let question = node.getElementsByClassName('qtext') getSimpleAnswer: {
if (question.length === 0) { description: 'Basic answer getter',
console.warn('NO QUESTION FOR QTEXT') index: 0,
} requirement: node => {
question = question[0].innerText return node.getElementsByClassName('rightanswer').length > 0
return removeUnnecesarySpaces(question) },
} getterFunction: node => {
let answer = node.getElementsByClassName('rightanswer')[0]
const promises = []
function getBase64Image(img) { Array.from(answer.childNodes).forEach(elem => {
let canvas = document.createElement('canvas') if (elem.tagName === 'IMG') {
canvas.width = img.width promises.push(digestMessage(getBase64Image(elem)))
canvas.height = img.height } else if (elem.tagName === undefined) {
let ctx = canvas.getContext('2d') promises.push({ type: 'txt', val: elem.nodeValue })
ctx.drawImage(img, 0, 0) } else {
let dataURL = canvas.toDataURL('image/png') promises.push({ type: 'txt', val: elem.innerText })
return dataURL.replace(/^data:image\/(png|jpg);base64,/, '') }
})
return promises
},
},
getDropdownAnswer: {
description: 'Dropdown answer getter',
index: 1,
requirement: node => {
return false
},
getterFunction: node => {
// TODO dropdown kérdés.html
return 'asd'
},
},
} }
function digestMessage(message) { function digestMessage(message) {
@ -275,6 +347,19 @@
}) })
} }
function getBase64Image(img) {
const copy = document.createElement('img')
copy.src = img.src
copy.crossOrigin = 'Anonymous'
let canvas = document.createElement('canvas')
canvas.width = copy.width
canvas.height = copy.height
let ctx = canvas.getContext('2d')
ctx.drawImage(copy, 0, 0)
let dataURL = canvas.toDataURL('image/png')
return dataURL.replace(/^data:image\/(png|jpg);base64,/, '')
}
// ---------------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------------
// String utils 2 // String utils 2
// ---------------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------------
@ -941,6 +1026,13 @@
function HandleResults(url) { function HandleResults(url) {
getQuiz().then(res => { getQuiz().then(res => {
console.log('\n\n\n')
res.forEach(r => {
console.log(r.Q)
console.log(r.A)
console.log(r.data)
console.log('')
})
SaveQuiz(res, ShowSaveQuizDialog) // saves the quiz questions and answers SaveQuiz(res, ShowSaveQuizDialog) // saves the quiz questions and answers
}) })
} }