mirror of
https://gitlab.com/MrFry/moodle-test-userscript
synced 2025-04-01 20:22:48 +02:00
Question / answer getting imporvements, code refactoring
This commit is contained in:
parent
2a612c1bd5
commit
46e83e2f1e
1 changed files with 156 additions and 64 deletions
204
stable.user.js
204
stable.user.js
|
@ -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)
|
||||||
|
.then(result => {
|
||||||
console.log(result)
|
console.log(result)
|
||||||
resolve(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 => {
|
||||||
|
return node.getElementsByClassName('qtext').length > 0
|
||||||
|
},
|
||||||
|
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 })
|
||||||
}
|
}
|
||||||
answer = answer[0]
|
})
|
||||||
|
return promises
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
const answerGetters = {
|
||||||
|
getSimpleAnswer: {
|
||||||
|
description: 'Basic answer getter',
|
||||||
|
index: 0,
|
||||||
|
requirement: node => {
|
||||||
|
return node.getElementsByClassName('rightanswer').length > 0
|
||||||
|
},
|
||||||
|
getterFunction: node => {
|
||||||
|
let answer = node.getElementsByClassName('rightanswer')[0]
|
||||||
const promises = []
|
const promises = []
|
||||||
|
|
||||||
Array.from(answer.childNodes).forEach(elem => {
|
Array.from(answer.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
|
return promises
|
||||||
}
|
},
|
||||||
|
},
|
||||||
function getQuizFromNode(node) {
|
getDropdownAnswer: {
|
||||||
return new Promise(resolve => {
|
description: 'Dropdown answer getter',
|
||||||
const promises = getAnswerPromisesFromNode(node)
|
index: 1,
|
||||||
|
requirement: node => {
|
||||||
Promise.all(promises).then(res => {
|
return false
|
||||||
const images = []
|
},
|
||||||
const question = getQuestionFromNode(node)
|
getterFunction: node => {
|
||||||
const solution = res
|
// TODO dropdown kérdés.html
|
||||||
.map(i => {
|
return 'asd'
|
||||||
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) {
|
|
||||||
let question = node.getElementsByClassName('qtext')
|
|
||||||
if (question.length === 0) {
|
|
||||||
console.warn('NO QUESTION FOR QTEXT')
|
|
||||||
}
|
|
||||||
question = question[0].innerText
|
|
||||||
return 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) {
|
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
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue