From de768fb281363a068cd088934ac990d2c711943a Mon Sep 17 00:00:00 2001
From: mrfry <mrfry@airmail.cc>
Date: Thu, 19 Nov 2020 14:30:00 +0100
Subject: [PATCH] Remove menu on middle click, test result page parsing
 improvements: get correct answer even if its not shown

---
 stable.user.js | 96 +++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 83 insertions(+), 13 deletions(-)

diff --git a/stable.user.js b/stable.user.js
index 77456d2..137d052 100755
--- a/stable.user.js
+++ b/stable.user.js
@@ -167,15 +167,16 @@
 
   function getQuiz() {
     return new Promise(resolve => {
-      let promises = []
-      let i = 1
-      let containerNode = document.getElementById(`q${i}`)
-      do {
-        promises.push(getQuizFromNode(containerNode))
+      const promises = []
+      const questionNodes = Array.from(
+        document.getElementsByTagName('form')[0].childNodes[0].childNodes
+      )
 
+      let i = 0
+      while (i < questionNodes.length && questionNodes[i].tagName === 'DIV') {
+        promises.push(getQuizFromNode(questionNodes[i]))
         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",
@@ -201,10 +202,15 @@
     Object.keys(getters).some(key => {
       const getter = getters[key]
       if (getter.requirement(node)) {
-        res = getter.getterFunction(node)
-        return true
+        try {
+          res = getter.getterFunction(node)
+          return true
+        } catch (e) {
+          Log(`${key} failed`)
+          console.log(e)
+        }
       } else {
-        Log(`${getter.description} did not pass`)
+        Log(`${key} did not pass`)
       }
     })
 
@@ -221,7 +227,9 @@
         answerGetters,
         node
       )
+
       if (!answerPromises || !questionPromises) {
+        Log('Answer or question array is empty, skipping question')
         resolve({ success: false })
       }
 
@@ -250,8 +258,8 @@
           images = uniq(images)
 
           resolve({
-            A: removeUnnecesarySpaces(answerText),
             Q: removeUnnecesarySpaces(questionText),
+            A: removeUnnecesarySpaces(answerText),
             data: getData(images),
             success: true,
           })
@@ -335,6 +343,61 @@
         return 'asd'
       },
     },
+    noCorrect: {
+      description: 'Gets correct answer, even if the correct is not shown',
+      index: 2,
+      requirement: node => {
+        return (
+          node.getElementsByClassName('rightanswer').length === 0 &&
+          node.getElementsByClassName('answer').length > 0
+        )
+      },
+      getterFunction: node => {
+        const gradeText = node.getElementsByClassName('grade')[0].innerText
+        const possibleAnswers = getPossibleAnswers(node)
+
+        if (gradeText.includes('0,00')) {
+          if (possibleAnswers.length === 2) {
+            return [
+              {
+                type: 'txt',
+                val: possibleAnswers.find(x => {
+                  return x.selectedByUser === false
+                }).text,
+              },
+            ]
+          }
+        } else {
+          return [
+            {
+              type: 'txt',
+              val: possibleAnswers.find(x => {
+                return x.selectedByUser === true
+              }).text,
+            },
+          ]
+        }
+      },
+    },
+  }
+
+  function getPossibleAnswers(node) {
+    const answerNodes = Array.from(
+      node.getElementsByClassName('answer')[0].childNodes
+    )
+
+    return answerNodes.reduce((acc, answerNode) => {
+      let selectedByUser
+      if (answerNode.childNodes.length > 0) {
+        selectedByUser = answerNode.childNodes[0].checked
+      }
+
+      acc.push({
+        text: answerNode.innerText,
+        selectedByUser: selectedByUser,
+      })
+      return acc
+    }, [])
   }
 
   function digestMessage(message) {
@@ -1041,11 +1104,12 @@
   function HandleResults(url) {
     getQuiz().then(res => {
       console.log('\n\n\n')
-      res.forEach(r => {
+      res.forEach((r, i) => {
+        console.log('')
+        console.log(i + 1)
         console.log(r.Q)
         console.log(r.A)
         console.log(r.data)
-        console.log('')
       })
       SaveQuiz(res, ShowSaveQuizDialog) // saves the quiz questions and answers
     })
@@ -1727,6 +1791,12 @@
 
       // APPEND EVERYTHING
       appedtTo.appendChild(menuButtonDiv)
+
+      addEventListener(menuButtonDiv, 'mousedown', function(e) {
+        if (e.which === 2) {
+          menuButtonDiv.parentNode.removeChild(menuButtonDiv)
+        }
+      })
     } catch (e) {
       Exception(e, 'script error at showing menu:')
     }