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!
// only one of these should be true for testing
const forceTestPage = false;
const forceTestPage = true;
const forceResultPage = false;
const forceDefaultPage = false;
const logElementGetting = false;
const log = true;
const motdShowCount = 3;
const motdShowCount = 3; /* Ammount of times to show motd */
var motd = "";
var lastestVersion = "";
const minMatchAmmount = 55;
const minResultMatchPercent = 99;
const lengthDiffMultiplier = 10;
const minMatchAmmount = 55; /* Minimum ammount to consider that two questions match during answering */
const minResultMatchPercent = 99; /* Minimum ammount to consider that two questions match during saving */
const lengthDiffMultiplier = 10; /* Percent minus for length difference */
//: Class descriptions {{{
class Question {
@ -280,7 +280,9 @@ function Main() {
// all dom getting stuff are in this sections, so on
// moodle dom change, stuff breaks here
function GetAllQuestionsDropdown() {
class QuestionsPageModell {
GetAllQuestionsDropdown() {
if (logElementGetting)
Log("getting dropdown question");
let items = document.getElementById("responseform").getElementsByTagName("p")[0].childNodes;
@ -291,239 +293,52 @@ function GetAllQuestionsDropdown() {
});
return r;
}
}
function GetAllQuestionsQtext() {
GetAllQuestionsQtext() {
if (logElementGetting)
Log("getting all questions qtext");
return document.getElementById("responseform").getElementsByClassName("qtext"); // getting questions
}
}
function GetAllQuestionsP() {
GetAllQuestionsP() {
if (logElementGetting)
Log("getting all questions by tag p");
return document.getElementById("responseform").getElementsByTagName("p");
}
}
function GetFormulationClearfix() {
GetFormulationClearfix() {
if (logElementGetting)
Log("getting formulation clearfix lol");
return document.getElementsByClassName("formulation clearfix");
}
}
function GetAnswerOptions() {
GetAnswerOptions() {
if (logElementGetting)
Log("getting all answer options");
return GetFormulationClearfix()[0].childNodes[3].innerText;
}
}
function GetQuestionImages() {
GetQuestionImages() {
if (logElementGetting)
Log("getting question images");
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++;
}
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() {
// this function should return the question, posible answers, and image names
GetQuestionFromTest() {
var questions; // the important questions
var allQuestions; // all 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
{
var ddq = GetAllQuestionsDropdown();
if (EmptyOrWhiteSpace(ddq)) {
var questionData = "";
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++) {
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,
q: questions
};
}
}
// gets the question from the result page
// i is the index of the question
function GetQuestionFromResult(i) {
class ResultsPageModell {
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 currQuestion = "";
if (temp.length > 0) // if the qtext element is not 0 length
@ -595,11 +491,11 @@ function GetQuestionFromResult(i) {
}
}
return currQuestion;
}
}
// tries to get right answer from result page
// i is the index of the question
function GetRightAnswerFromResult(i) {
// tries to get right answer from result page
// i is the index of the question
GetRightAnswerFromResult(i) {
var fun = [];
// the basic type of getting answers
@ -649,11 +545,11 @@ function GetRightAnswerFromResult(i) {
}
return currAnswer;
}
}
// version 2 of getting right answer from result page
// i is the index of the question
function GetRightAnswerFromResultv2(i) {
// version 2 of getting right answer from result page
// i is the index of the question
GetRightAnswerFromResultv2(i) {
try {
var answerNodes = GetAnswerNode(i);
let items = answerNodes.nodes;
@ -676,10 +572,130 @@ function GetRightAnswerFromResultv2(i) {
} catch (e) {
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 {{{
//: Loading {{{
@ -794,10 +810,14 @@ function Version161() {
//: }}}
var GetFileData = () => {
return GM_getResourceText("data");
};
function ReadFile(cwith) {
var resource = "";
try {
resource = GM_getResourceText("data"); // getting data from txt
resource = GetFileData(); // getting data from txt
if (resource == undefined) {
ShowMessage({
@ -1022,8 +1042,8 @@ function NLoad(resource, cwith) {
while (i < data.length && !GM_getValue("Is" + i + "Active")) {
i++;
}
if (i >= data.length)
document.getElementById("HelperMenuButton").style.background = "yellow";
AlertOnNoQuestion(i);
} catch (e) {
Exception(e, "script error at loading:");
@ -1032,6 +1052,13 @@ function NLoad(resource, cwith) {
cwith(count, subjCount);
}
var AlertOnNoQuestion = (i) => {
try {
if (i >= data.length)
document.getElementById("HelperMenuButton").style.background = "yellow";
} catch (e) {}
};
//: }}}
//: UI handling {{{
@ -1059,7 +1086,7 @@ function HandleUI(url, count, subjCount) {
greetMsg = "Moodle/Elearning/KMOOC segéd v. " + GM_info.script.version + ". ";
if (lastestVersion != undefined && GM_info.script.version != lastestVersion) {
greetMsg += "Új verzió elérhető: " + lastestVersion + " ";
greetMsg += "Új verzió elérhető: " + lastestVersion + "\n";
timeout = undefined;
}
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 {{{
function HandleQuiz() {
var q = GetQuestionFromTest();
var q = QPM.GetQuestionFromTest();
var questions = q.q;
var allQuestions = q.allQ;
var imgNodes = q.imgnodes;