Moving element getting to classes

This commit is contained in:
YourFriendlyNeighborhoodDealer 2019-03-13 08:23:38 +01:00
parent 4e4c5c723a
commit da7eac9e56

473
main.js
View file

@ -28,19 +28,19 @@ const serverAdress = "https://qmining.tk/";
// forcing pages for testing. unless you test, do not set these to true! // forcing pages for testing. unless you test, do not set these to true!
// only one of these should be true for testing // only one of these should be true for testing
const forceTestPage = false; const forceTestPage = true;
const forceResultPage = false; const forceResultPage = false;
const forceDefaultPage = false; const forceDefaultPage = false;
const logElementGetting = false; const logElementGetting = false;
const log = true; const log = true;
const motdShowCount = 3; const motdShowCount = 3; /* Ammount of times to show motd */
var motd = ""; var motd = "";
var lastestVersion = ""; var lastestVersion = "";
const minMatchAmmount = 55; const minMatchAmmount = 55; /* Minimum ammount to consider that two questions match during answering */
const minResultMatchPercent = 99; const minResultMatchPercent = 99; /* Minimum ammount to consider that two questions match during saving */
const lengthDiffMultiplier = 10; const lengthDiffMultiplier = 10; /* Percent minus for length difference */
//: Class descriptions {{{ //: Class descriptions {{{
class Question { class Question {
@ -280,7 +280,9 @@ function Main() {
// all dom getting stuff are in this sections, so on // all dom getting stuff are in this sections, so on
// moodle dom change, stuff breaks here // moodle dom change, stuff breaks here
function GetAllQuestionsDropdown() { class QuestionsPageModell {
GetAllQuestionsDropdown() {
if (logElementGetting) if (logElementGetting)
Log("getting dropdown question"); Log("getting dropdown question");
let items = document.getElementById("responseform").getElementsByTagName("p")[0].childNodes; let items = document.getElementById("responseform").getElementsByTagName("p")[0].childNodes;
@ -291,239 +293,52 @@ function GetAllQuestionsDropdown() {
}); });
return r; return r;
} }
function GetAllQuestionsQtext() { GetAllQuestionsQtext() {
if (logElementGetting) if (logElementGetting)
Log("getting all questions qtext"); Log("getting all questions qtext");
return document.getElementById("responseform").getElementsByClassName("qtext"); // getting questions return document.getElementById("responseform").getElementsByClassName("qtext"); // getting questions
} }
function GetAllQuestionsP() { GetAllQuestionsP() {
if (logElementGetting) if (logElementGetting)
Log("getting all questions by tag p"); Log("getting all questions by tag p");
return document.getElementById("responseform").getElementsByTagName("p"); return document.getElementById("responseform").getElementsByTagName("p");
} }
function GetFormulationClearfix() { GetFormulationClearfix() {
if (logElementGetting) if (logElementGetting)
Log("getting formulation clearfix lol"); Log("getting formulation clearfix lol");
return document.getElementsByClassName("formulation clearfix"); return document.getElementsByClassName("formulation clearfix");
} }
function GetAnswerOptions() { GetAnswerOptions() {
if (logElementGetting) if (logElementGetting)
Log("getting all answer options"); Log("getting all answer options");
return GetFormulationClearfix()[0].childNodes[3].innerText; return GetFormulationClearfix()[0].childNodes[3].innerText;
} }
function GetQuestionImages() { GetQuestionImages() {
if (logElementGetting) if (logElementGetting)
Log("getting question images"); Log("getting question images");
return GetFormulationClearfix()[0].getElementsByTagName("img"); return GetFormulationClearfix()[0].getElementsByTagName("img");
}
function GetCurrentSubjectName() {
if (logElementGetting)
Log("getting current subjects name");
return document.getElementById("page-header").innerText.split("\n")[0];
}
function GetVideo() {
if (logElementGetting)
Log("getting video stuff");
return document.getElementsByTagName("video")[0];
}
function GetVideoElement() {
if (logElementGetting)
Log("getting video element");
return document.getElementById("videoElement").parentNode;
}
function GetAllAnswer(index) {
if (logElementGetting)
Log("getting all answers, ind: " + index);
return document.getElementsByClassName("answer")[index].childNodes;
}
function GetInputType(answers, i) {
if (logElementGetting)
Log("getting input type");
return answers[i].getElementsByTagName("input")[0].type;
}
function GetFormResult() {
if (logElementGetting)
Log("getting form result");
var t = document.getElementsByTagName("form")[0].childNodes[0].childNodes;
if (t.length > 0 && t[0].tagName == undefined) // debreceni moodle
return document.getElementsByTagName("form")[1].childNodes[0].childNodes;
else
return t;
}
function GetQText(i) {
if (logElementGetting)
Log("getting qtext by index: " + i);
var results = GetFormResult(); // getting results element
return results[i].getElementsByClassName("qtext");
}
function GetDropboxes(i) {
if (logElementGetting)
Log("getting dropboxes by index: " + i);
var results = GetFormResult(); // getting results element
return results[i].getElementsByTagName("select");
}
function GetCurrQuestion(i) {
if (logElementGetting)
Log("getting curr questions by index: " + i);
return document.getElementsByTagName("form")[0].childNodes[0].childNodes[i].childNodes[1].childNodes[
0].innerText;
}
function GetCurrentAnswer(i) {
if (logElementGetting)
Log("getting curr answer by index: " + i);
var results = GetFormResult(); // getting results element
var t = results[i].getElementsByClassName("formulation clearfix")[0].getElementsByTagName("span");
if (t.length > 2)
return t[1].innerHTML.split("<br>")[1];
}
function GetSelectAnswer() {
if (logElementGetting)
Log("getting selected answer");
var t = document.getElementsByTagName("select");
if (t.length > 0)
return t[0].options[document.getElementsByTagName("select")[
0].selectedIndex].innerText;
}
function GetAnswerNode(i) {
if (logElementGetting)
Log("getting answer node");
var results = GetFormResult(); // getting results element
var r = results[i].getElementsByClassName("answer")[0].childNodes;
var ret = [];
for (var j = 0; j < r.length; j++)
if (r[j].tagName != undefined && r[j].tagName.toLowerCase() == "div")
ret.push(r[j]);
let qtype = DetermineQuestionType(ret);
return {
nodes: ret,
type: qtype
};
}
function DetermineQuestionType(nodes) {
let qtype = "";
let i = 0;
while (i < nodes.length && qtype == "") {
let inps = nodes[i].getElementsByTagName("input");
if (inps.length > 0) {
qtype = inps[0].type;
} }
i++; // this function should return the question, posible answers, and image names
} GetQuestionFromTest() {
return qtype;
}
function GetPossibleAnswers(i) {
if (logElementGetting)
Log("getting possible answers");
var results = GetFormResult(); // getting results element
var items = GetFormResult()[i].getElementsByTagName("label");
var r = [];
for (var j = 0; j < items.length; j++) {
function TryGetCorrect(j) {
var cn = items[j].parentNode.className;
if (cn.includes("correct"))
return cn.includes("correct") && !cn.includes("incorrect");
}
r.push({
value: items[j].innerText,
iscorrect: TryGetCorrect(j)
});
}
return r;
}
function GetRightAnswerIfCorrectShown(i) {
if (logElementGetting)
Log("getting right answer if correct shown");
var results = GetFormResult(); // getting results element
return results[i].getElementsByClassName("rightanswer");
}
function GetWrongAnswerIfCorrectNotShown(i) {
if (logElementGetting)
Log("getting wrong answer if correct not shown");
var results = GetFormResult(); // getting results element
var n = results[i].getElementsByTagName("i")[0].parentNode;
if (n.className.includes("incorrect"))
return results[i].getElementsByTagName("i")[0].parentNode.innerText;
else
return "";
}
function GetRightAnswerIfCorrectNotShown(i) {
if (logElementGetting)
Log("Getting right answer if correct not shown");
var results = GetFormResult(); // getting results element
var n = results[i].getElementsByTagName("i")[0].parentNode;
if (n.className.includes("correct") && !n.className.includes("incorrect"))
return results[i].getElementsByTagName("i")[0].parentNode.innerText;
else
return "";
}
function GetFormCFOfResult(result) {
if (logElementGetting)
Log("getting formulation clearfix");
return result.getElementsByClassName("formulation clearfix")[0];
}
function GetResultText(i) {
if (logElementGetting)
Log("getting result text");
var results = GetFormResult(); // getting results element
return GetFormCFOfResult(results[i]).getElementsByTagName("p");
}
function GetResultImage(i) {
if (logElementGetting)
Log("getting result image");
var results = GetFormResult(); // getting results element
return GetFormCFOfResult(results[i]).getElementsByTagName("img");
}
// this function should return the question, posible answers, and image names
function GetQuestionFromTest() {
var questions; // the important questions var questions; // the important questions
var allQuestions; // all questions var allQuestions; // all questions
try // trying to get tha current questions try // trying to get tha current questions
{ {
allQuestions = GetAllQuestionsQtext(); // getting questions allQuestions = this.GetAllQuestionsQtext(); // getting questions
if (allQuestions.length == 0) // if there are no found questions if (allQuestions.length == 0) // if there are no found questions
{ {
var ddq = GetAllQuestionsDropdown(); var ddq = GetAllQuestionsDropdown();
if (EmptyOrWhiteSpace(ddq)) { if (EmptyOrWhiteSpace(ddq)) {
var questionData = ""; var questionData = "";
for (var j = 0; j < allQuestions.length; j++) { for (var j = 0; j < allQuestions.length; j++) {
allQuestions = GetAllQuestionsQtext()[j].childNodes; allQuestions = this.GetAllQuestionsQtext()[j].childNodes;
for (var i = 0; i < allQuestions.length; i++) { for (var i = 0; i < allQuestions.length; i++) {
if (allQuestions[i].data != undefined && !EmptyOrWhiteSpace(allQuestions[i].data)) // if the current element has some text data to add if (allQuestions[i].data != undefined && !EmptyOrWhiteSpace(allQuestions[i].data)) // if the current element has some text data to add
{ {
@ -562,11 +377,92 @@ function GetQuestionFromTest() {
allQ: allQuestions, allQ: allQuestions,
q: questions q: questions
}; };
}
} }
// gets the question from the result page class ResultsPageModell {
// i is the index of the question
function GetQuestionFromResult(i) { GetAllAnswer(index) {
if (logElementGetting)
Log("getting all answers, ind: " + index);
return document.getElementsByClassName("answer")[index].childNodes;
}
GetPossibleAnswers(i) {
if (logElementGetting)
Log("getting possible answers");
var results = GetFormResult(); // getting results element
var items = GetFormResult()[i].getElementsByTagName("label");
var r = [];
for (var j = 0; j < items.length; j++) {
function TryGetCorrect(j) {
var cn = items[j].parentNode.className;
if (cn.includes("correct"))
return cn.includes("correct") && !cn.includes("incorrect");
}
r.push({
value: items[j].innerText,
iscorrect: TryGetCorrect(j)
});
}
return r;
}
GetRightAnswerIfCorrectShown(i) {
if (logElementGetting)
Log("getting right answer if correct shown");
var results = GetFormResult(); // getting results element
return results[i].getElementsByClassName("rightanswer");
}
GetWrongAnswerIfCorrectNotShown(i) {
if (logElementGetting)
Log("getting wrong answer if correct not shown");
var results = GetFormResult(); // getting results element
var n = results[i].getElementsByTagName("i")[0].parentNode;
if (n.className.includes("incorrect"))
return results[i].getElementsByTagName("i")[0].parentNode.innerText;
else
return "";
}
GetRightAnswerIfCorrectNotShown(i) {
if (logElementGetting)
Log("Getting right answer if correct not shown");
var results = GetFormResult(); // getting results element
var n = results[i].getElementsByTagName("i")[0].parentNode;
if (n.className.includes("correct") && !n.className.includes("incorrect"))
return results[i].getElementsByTagName("i")[0].parentNode.innerText;
else
return "";
}
GetFormCFOfResult(result) {
if (logElementGetting)
Log("getting formulation clearfix");
return result.getElementsByClassName("formulation clearfix")[0];
}
GetResultText(i) {
if (logElementGetting)
Log("getting result text");
var results = GetFormResult(); // getting results element
return GetFormCFOfResult(results[i]).getElementsByTagName("p");
}
GetResultImage(i) {
if (logElementGetting)
Log("getting result image");
var results = GetFormResult(); // getting results element
return GetFormCFOfResult(results[i]).getElementsByTagName("img");
}
// gets the question from the result page
// i is the index of the question
GetQuestionFromResult(i) {
var temp = GetQText(i); var temp = GetQText(i);
var currQuestion = ""; var currQuestion = "";
if (temp.length > 0) // if the qtext element is not 0 length if (temp.length > 0) // if the qtext element is not 0 length
@ -595,11 +491,11 @@ function GetQuestionFromResult(i) {
} }
} }
return currQuestion; return currQuestion;
} }
// tries to get right answer from result page // tries to get right answer from result page
// i is the index of the question // i is the index of the question
function GetRightAnswerFromResult(i) { GetRightAnswerFromResult(i) {
var fun = []; var fun = [];
// the basic type of getting answers // the basic type of getting answers
@ -649,11 +545,11 @@ function GetRightAnswerFromResult(i) {
} }
return currAnswer; return currAnswer;
} }
// version 2 of getting right answer from result page // version 2 of getting right answer from result page
// i is the index of the question // i is the index of the question
function GetRightAnswerFromResultv2(i) { GetRightAnswerFromResultv2(i) {
try { try {
var answerNodes = GetAnswerNode(i); var answerNodes = GetAnswerNode(i);
let items = answerNodes.nodes; let items = answerNodes.nodes;
@ -676,10 +572,130 @@ function GetRightAnswerFromResultv2(i) {
} catch (e) { } catch (e) {
Log("error at new nodegetting, trying the oldschool way"); Log("error at new nodegetting, trying the oldschool way");
} }
}
}
class MiscPageModell {
GetCurrentSubjectName() {
if (logElementGetting)
Log("getting current subjects name");
return document.getElementById("page-header").innerText.split("\n")[0];
}
GetVideo() {
if (logElementGetting)
Log("getting video stuff");
return document.getElementsByTagName("video")[0];
}
GetVideoElement() {
if (logElementGetting)
Log("getting video element");
return document.getElementById("videoElement").parentNode;
}
GetInputType(answers, i) {
if (logElementGetting)
Log("getting input type");
return answers[i].getElementsByTagName("input")[0].type;
}
GetFormResult() {
if (logElementGetting)
Log("getting form result");
var t = document.getElementsByTagName("form")[0].childNodes[0].childNodes;
if (t.length > 0 && t[0].tagName == undefined) // debreceni moodle
return document.getElementsByTagName("form")[1].childNodes[0].childNodes;
else
return t;
}
GetQText(i) {
if (logElementGetting)
Log("getting qtext by index: " + i);
var results = GetFormResult(); // getting results element
return results[i].getElementsByClassName("qtext");
}
GetDropboxes(i) {
if (logElementGetting)
Log("getting dropboxes by index: " + i);
var results = GetFormResult(); // getting results element
return results[i].getElementsByTagName("select");
}
GetCurrQuestion(i) {
if (logElementGetting)
Log("getting curr questions by index: " + i);
return document.getElementsByTagName("form")[0].childNodes[0].childNodes[i].childNodes[1].childNodes[
0].innerText;
}
GetCurrentAnswer(i) {
if (logElementGetting)
Log("getting curr answer by index: " + i);
var results = GetFormResult(); // getting results element
var t = results[i].getElementsByClassName("formulation clearfix")[0].getElementsByTagName("span");
if (t.length > 2)
return t[1].innerHTML.split("<br>")[1];
}
GetSelectAnswer() {
if (logElementGetting)
Log("getting selected answer");
var t = document.getElementsByTagName("select");
if (t.length > 0)
return t[0].options[document.getElementsByTagName("select")[
0].selectedIndex].innerText;
}
GetAnswerNode(i) {
if (logElementGetting)
Log("getting answer node");
var results = GetFormResult(); // getting results element
var r = results[i].getElementsByClassName("answer")[0].childNodes;
var ret = [];
for (var j = 0; j < r.length; j++)
if (r[j].tagName != undefined && r[j].tagName.toLowerCase() == "div")
ret.push(r[j]);
let qtype = DetermineQuestionType(ret);
return {
nodes: ret,
type: qtype
};
}
DetermineQuestionType(nodes) {
let qtype = "";
let i = 0;
while (i < nodes.length && qtype == "") {
let inps = nodes[i].getElementsByTagName("input");
if (inps.length > 0) {
qtype = inps[0].type;
}
i++;
}
return qtype;
}
} }
//: }}} //: }}}
var QPM = new QuestionsPageModell();
var RPM = new ResultsPageModell();
var MPM = new MiscPageModell();
//: Main logic stuff {{{ //: Main logic stuff {{{
//: Loading {{{ //: Loading {{{
@ -794,10 +810,14 @@ function Version161() {
//: }}} //: }}}
var GetFileData = () => {
return GM_getResourceText("data");
};
function ReadFile(cwith) { function ReadFile(cwith) {
var resource = ""; var resource = "";
try { try {
resource = GM_getResourceText("data"); // getting data from txt resource = GetFileData(); // getting data from txt
if (resource == undefined) { if (resource == undefined) {
ShowMessage({ ShowMessage({
@ -1022,8 +1042,8 @@ function NLoad(resource, cwith) {
while (i < data.length && !GM_getValue("Is" + i + "Active")) { while (i < data.length && !GM_getValue("Is" + i + "Active")) {
i++; i++;
} }
if (i >= data.length)
document.getElementById("HelperMenuButton").style.background = "yellow"; AlertOnNoQuestion(i);
} catch (e) { } catch (e) {
Exception(e, "script error at loading:"); Exception(e, "script error at loading:");
@ -1032,6 +1052,13 @@ function NLoad(resource, cwith) {
cwith(count, subjCount); cwith(count, subjCount);
} }
var AlertOnNoQuestion = (i) => {
try {
if (i >= data.length)
document.getElementById("HelperMenuButton").style.background = "yellow";
} catch (e) {}
};
//: }}} //: }}}
//: UI handling {{{ //: UI handling {{{
@ -1059,7 +1086,7 @@ function HandleUI(url, count, subjCount) {
greetMsg = "Moodle/Elearning/KMOOC segéd v. " + GM_info.script.version + ". "; greetMsg = "Moodle/Elearning/KMOOC segéd v. " + GM_info.script.version + ". ";
if (lastestVersion != undefined && GM_info.script.version != lastestVersion) { if (lastestVersion != undefined && GM_info.script.version != lastestVersion) {
greetMsg += "Új verzió elérhető: " + lastestVersion + " "; greetMsg += "Új verzió elérhető: " + lastestVersion + "\n";
timeout = undefined; timeout = undefined;
} }
greetMsg += count + " kérdés és " + subjCount + " tárgy betöltve. (click for help)."; greetMsg += count + " kérdés és " + subjCount + " tárgy betöltve. (click for help).";
@ -1129,7 +1156,7 @@ function HandleUI(url, count, subjCount) {
//: Answering stuffs {{{ //: Answering stuffs {{{
function HandleQuiz() { function HandleQuiz() {
var q = GetQuestionFromTest(); var q = QPM.GetQuestionFromTest();
var questions = q.q; var questions = q.q;
var allQuestions = q.allQ; var allQuestions = q.allQ;
var imgNodes = q.imgnodes; var imgNodes = q.imgnodes;