diff --git a/stable.user.js b/stable.user.js index 0da4ef0..9d01736 100755 --- a/stable.user.js +++ b/stable.user.js @@ -46,7 +46,7 @@ // : Script header {{{ // ==UserScript== // @name Moodle/Elearning/KMOOC test help -// @version 2.1.1.1 +// @version 2.1.1.2 // @description Online Moodle/Elearning/KMOOC test help // @author MrFry // @match https://elearning.uni-obuda.hu/* @@ -110,11 +110,12 @@ // Devel vars // ------------------------------------------------------------------------------ // forcing pages for testing. unless you test, do not set these to true! - setVal('ISDEVEL', false) + const isDevel = false + setVal('ISDEVEL', isDevel) // only one of these should be true for testing - const forceTestPage = false - const forceResultPage = false - const forceDefaultPage = false + const forceTestPage = isDevel && false + const forceResultPage = isDevel && false + const forceDefaultPage = isDevel && false // ------------------------------------------------------------------------------ const logElementGetting = false @@ -246,6 +247,7 @@ const select = elem.tagName ? elem.getElementsByTagName('select') : [] if (select.length > 0) { + // test: 2c1d92a7-0ea2-4990-9451-7f19299bbbe4 const question = [] Array.from(elem.childNodes).forEach(cn => { if (cn.nodeValue) { @@ -483,9 +485,11 @@ return promises } else if (answerRoot.tagName === 'TABLE') { const answers = Array.from(answerRoot.childNodes[0].childNodes) + // test: 002203ca-581b-445c-b45d-85374f212e8e NOT WORING answers.forEach(answer => { if (answer.tagName) { + // test: 817434df-a103-4edc-870e-c9ac953404dc promises.push( getTextPromisesFromNode(answer.getElementsByClassName('text')[0]) ) @@ -519,15 +523,71 @@ }, []) } + const rootVariants = { + qtext: { + criteria: node => { + return node.getElementsByClassName('qtext').length > 0 + }, + getter: node => { + return node.getElementsByClassName('qtext')[0] + }, + }, + subquestion: { + criteria: node => { + return node.getElementsByClassName('subquestion').length > 0 + }, + getter: node => { + return node.getElementsByClassName('subquestion')[0].parentNode + }, + }, + content: { + // test: 002203ca-581b-445c-b45d-85374f212e8e + criteria: node => { + return node.getElementsByClassName('content').length > 0 + }, + getter: node => { + const content = node.getElementsByClassName('content')[0].childNodes[0] + const pNodes = Array.from(content.childNodes).filter(node => { + return node.tagName === 'P' + }) + + const parent = document.createElement('div') + pNodes.forEach(node => { + parent.appendChild(node.cloneNode(true)) + }) + + return pNodes[0] + }, + }, + } + + function getQuestionRootNode(node) { + try { + let qtextNode + Object.keys(rootVariants).some(key => { + const variant = rootVariants[key] + if (variant.criteria(node)) { + qtextNode = variant.getter(node) + if (!qtextNode) { + warn( + `question root node ${key} criteria was true, but result is null` + ) + } else { + return true + } + } + }) + return qtextNode + } catch (e) { + warn('Error in getQuestionRootNode') + warn(e) + } + } + function getQuestionPromiseForSingleQuestion(node) { return new Promise(resolve => { try { - let qtextNode = node.getElementsByClassName('qtext')[0] - if (!qtextNode) { - qtextNode = node.getElementsByClassName('subquestion')[0] - qtextNode = qtextNode.parentNode - } - + const qtextNode = getQuestionRootNode(node) const questionPromises = getTextPromisesFromNode(qtextNode) const possibleAnswerPromises = getPossibleAnswersFromTest(node) @@ -560,13 +620,17 @@ ...question, ...possibleAnswerArray, ]) - const data = getDataFromTest(images, getLegacyImageID(imageNodes)) + const data = getDataFromTest( + node, + images, + getLegacyImageID(imageNodes) + ) resolve({ question: questionText, - possibleAnswers, - images, - data, + possibleAnswers: possibleAnswers, + images: images, + data: data, success: true, }) }) @@ -583,7 +647,7 @@ }) } - function getDataFromTest(hashedImages, legacyImages) { + function getDataFromTest(node, hashedImages, legacyImages) { if (hashedImages.length > 0) { return { type: 'image',