Greasy Fork is available in English.

CCTL Relecture

Affiche les couleurs lors de la relecture du CCTL et affiche la note prévisionnel.

// ==UserScript==
// @name         CCTL Relecture
// @namespace    Exia Tools
// @version      2.0
// @description  Affiche les couleurs lors de la relecture du CCTL et affiche la note prévisionnel.
// @author       LynEvans, repris et modifié par Aurélien KLEIN
// @match        https://moodle-examens.cesi.fr/mod/quiz/review.php?attempt=*
// @grant        none
// ==/UserScript==


window.CCTL = {

    questions : {},
    score : 0,
    scoreMax : 0,
    loadQuestions : function(){
        if(this.questions != {}){
            this.questions = {};
        }

        var questionBlocks = document.getElementsByClassName('que');
        for(var id in questionBlocks){
            if(!isNaN(id)){
                var numero = parseInt(questionBlocks[id].querySelector('.qno').innerHTML);
                var qScore = parseFloat(questionBlocks[id].querySelector('.grade').innerHTML.substring(9));
                this.questions[parseInt(id)+1] = this.createQuestion(numero, qScore, questionBlocks[id]);
                this.score += this.questions[parseInt(id)+1].score;
            }
        }
    },

    createQuestion : function(nQuest, scoreQuest, blockQuest, typeQuest){

        CCTL.scoreMax += scoreQuest;
        var feedback = blockQuest.querySelector('.feedback').textContent;
        var result = 0;
        var questionResult = "INCORRECT";

        var typeQuestion = blockQuest.querySelector('.content');

        if(typeQuestion.querySelectorAll("input[type='radio'][name*='answer']").length > 0){
            typeQuestion = this.typeQuestions[2];
        } else if(typeQuestion.querySelectorAll("input[type='checkbox'][name*='choice']").length > 0){
            typeQuestion = this.typeQuestions[0];
        } else if(typeQuestion.querySelectorAll("select").length > 0){
            typeQuestion = this.typeQuestions[1];
        } else if(typeQuestion.querySelectorAll("input[type='text'][name*='answer']").length > 0){
            typeQuestion = this.typeQuestions[3];
        }

        if(feedback.indexOf('Votre réponse est correcte.') > -1){
            result = scoreQuest;
            questionResult = "CORRECT"
        }else if(feedback.indexOf('Votre réponse est partiellement correcte') > -1){
            var nAnswers = 0;
            var nAnswersGood = 0;
            questionResult = "PARTIEL";
            switch (typeQuestion) {
                case "CHOOSE ONE":
                    // Impossible
                    break;
                case "CHOOSE MANY":
                    nAnswers = blockQuest.querySelector('.qtext').textContent;
                    nAnswers = parseInt(nAnswers.substring(nAnswers.lastIndexOf('(')+1, nAnswers.lastIndexOf('réponse')-1));
                    nAnswersGood = blockQuest.querySelector('.numpartscorrect').textContent;
                    nAnswersGood = parseInt(nAnswersGood.substring(nAnswersGood.lastIndexOf('Vous en avez sélectionné correctement')+38, nAnswersGood.lastIndexOf('.')));
                    result = Math.round(((nAnswersGood / nAnswers) * scoreQuest) * 10 ) / 10;
                    break;
                case "FILL BLANK":
                    nAnswers = blockQuest.querySelectorAll('select').length;
                    nAnswersGood = blockQuest.querySelector('.numpartscorrect').textContent;
                    nAnswersGood = parseInt(nAnswersGood.substring(nAnswersGood.lastIndexOf('Vous en avez sélectionné correctement')+38, nAnswersGood.lastIndexOf('.')));
                    result = Math.round(((nAnswersGood*scoreQuest) / nAnswers) * 10 ) / 10;
                    break;
                case "FILL INPUT":
                    //Impossible
                    break;
            }
        }

        return {number : nQuest, grade : scoreQuest, score : result, type : typeQuestion, result : questionResult}
    },
    typeQuestions : ["CHOOSE MANY", "FILL BLANK", "CHOOSE ONE", "FILL INPUT"]

}


document.body.onload = function(){

    CCTL.loadQuestions();

    for(var id in CCTL.questions){
        document.getElementById("q" + id).querySelector('.outcome').style.color = 'black';
        document.getElementById("q" + id).querySelector('.outcome').style.textShadow = '0 0 0 transparent';
        document.getElementById("quiznavbutton" + id).querySelector('.thispageholder').style.backgroundColor = 'cover';
        switch (CCTL.questions[id].result){
            case "CORRECT":
                document.getElementById("q" + id).querySelector('.outcome').style.backgroundColor = '#29ad57';
                document.getElementById("quiznavbutton" + id).querySelector('.trafficlight').style.backgroundColor = '#29ad57';
                break;
            case "PARTIEL":
                document.getElementById("q" + id).querySelector('.outcome').style.backgroundColor = 'rgb(240, 176, 48)';
                document.getElementById("quiznavbutton" + id).querySelector('.trafficlight').style.backgroundColor = 'rgb(240, 176, 48)';
                break;
            case "INCORRECT":
                document.getElementById("q" + id).querySelector('.outcome').style.backgroundColor = 'rgb(192, 48, 48)';
                document.getElementById("quiznavbutton" + id).querySelector('.trafficlight').style.backgroundColor = 'rgb(192, 48, 48)';
                break;
        }
    }

    var ratio = parseFloat(CCTL.score) / parseFloat(CCTL.scoreMax);
    var note = ratio >= 0.75 ? "A" : ratio >= 0.5 ? "B" : ratio >= 0.25 ? "C" : "D";

    document.getElementById("mod_quiz_navblock").innerHTML += "<h4 style='text-align:center;font-weight:bold;'>" + CCTL.score + "/" + CCTL.scoreMax + " => " + note + "</h4>";

}