mirror of
https://gitlab.com/MrFry/moodle-test-userscript
synced 2025-04-01 20:22:48 +02:00
hash images
This commit is contained in:
parent
a1d9f5e154
commit
2ae514b1fc
1 changed files with 109 additions and 44 deletions
153
stable.user.js
153
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) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue