Utilisateur:Lepticed7/Eval.js

Une page de Wikipédia, l'encyclopédie libre.
Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;

Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
/* adapté de [[MediaWiki:Gadget-Evaluation.js]] (version du 12 septembre 2008) par Chphe
* {{Projet:JavaScript/Script|Evaluation}}
* rajouter l'onglet suivi des users
*
*/
//<source lang="javascript">//<pre><nowiki>

/* jshint laxbreak: true */
/* globals mw, $ */

if (mw.config.get('wgNamespaceNumber') === 0 && mw.config.get('wgAction') === 'view') {
    mw.loader.using(['mediawiki.util', 'mediawiki.api', 'user'], function () {
        $(ev_addEvalTab);
    });
}

function ev_addEvalTab($) {
    let portletLink = mw.util.addPortletLink('p-cactions', '#', 'Évaluer');

    $(portletLink).click(function (e) {
        e.preventDefault();
        ev_launchEval();
    });

    if (window.alwaysEval) {
        ev_launchEval();
    }
}

//initialise les variables
function ev_initVars() {
    if (typeof window.initEvalProjectNames !== "undefined") {
        window.initEvalProjectNames();
    } else {
        window.evalProjectNames = [];
    }

    window.evaluation_multiprojets = {};
    window.evaluation_multiprojets.project = [];
    window.evaluation_multiprojets.importance = [];
    window.evaluation_multiprojets.state = [];
    window.evaluation_multiprojets.avancement_global = "?";
    window.evaluation_multiprojets.autres = {}; // pour ramasser le reste (WP1.0, todo, wikiconcours, ...)
}

function ev_launchEval() {
    if (mw.util.getParamValue('printable') === 'yes') {
        /* version imprimable */
        return;
    }

    var EvalDiv = document.getElementById('EvalDiv');

    if (!EvalDiv) {
        EvalDiv = document.createElement('div');
        EvalDiv.id = "EvalDiv";
        EvalDiv.align = "center";
        $('#mw-content-text').prepend(EvalDiv);
    }

    EvalDiv.innerHTML = "Interrogation de la page de discussion...";

    ev_initVars();

    var params = {
        action: 'query',
        titles: 'Discussion:' + mw.config.get('wgPageName'),
        prop: 'revisions',
        rvprop: 'content',
        rvslots: 'main',
        formatversion: 2,
    };

    new mw.Api()
        .get(params)
        .done(function (results) {
            var page = results.query.pages[0];
            window.evaluation_multiprojets.pdd_existe = !page.missing;
            if (!page.missing) {
                var pageContent = page.revisions[0].slots.main.content;
                ev_ExtractEvaluation(pageContent);
            }
            ev_AddMyProjects();
            ev_drawEvaluation();
        });
}

function ev_addCell(line, html, bgcolor, rowSpan) {
    var cell = line.insertCell();
    cell.innerHTML = html;

    if (bgcolor) {
        cell.style.backgroundColor = "#" + bgcolor;
    }
    if (rowSpan) {
        cell.rowSpan = rowSpan;
    }

    return cell;
}

function ev_getRadioboxHtml(id, selected, n, prop, value) {
    var keyMap = {"ébauche": "1", "BD": "2", "B": "3", "homonymie": "4"};

    if (prop === "avancement_global") {
        return "<input onclick='window.evaluation_multiprojets.avancement_global=\""
            + value
            + "\"'  name='"
            + id
            + "_mp' type='radio'"
            + (keyMap[value] ? " accesskey='" + keyMap[value] + "'" : "")
            + (selected ? " checked='true'/>" : "/>");
    } else {
        return "<input onclick='window.evaluation_multiprojets."
            + prop
            + "["
            + n
            + "]=\""
            + value
            + "\"'  name='"
            + id
            + "_mp' type='radio'"
            + (selected ? " checked='true'/>" : "/>");
    }
}

function ev_addEvalLine(tab, project, im, state, n) {
    var line = tab.insertRow();

    ev_addCell(
        line,
        '<a title="Projet:'
        + mw.html.escape(project)
        + '" href="/wiki/Projet:'
        + encodeURIComponent(project)
        + '">'
        + project
        + "</a>"
    );
    ev_addCell(
        line,
        "<input onclick='window.evaluation_multiprojets.state["
        + n
        + "]=this.checked' type='checkbox'"
        + (state ? " checked='true'/>" : "/>")
    );

    ev_addCell(line, ev_getRadioboxHtml(n + "i", im === "maximum", n, "importance", "maximum"));
    ev_addCell(line, ev_getRadioboxHtml(n + "i", im === "élevée", n, "importance", "élevée"));
    ev_addCell(line, ev_getRadioboxHtml(n + "i", im === "moyenne", n, "importance", "moyenne"));
    ev_addCell(line, ev_getRadioboxHtml(n + "i", im === "faible", n, "importance", "faible"));
    ev_addCell(line, ev_getRadioboxHtml(n + "i", im === "?", n, "importance", "?"));
}

function ev_drawEvaluation() {
    let line;

    let tab = document.createElement("table");
    tab.className = 'wikitable';
    tab.style.textAlign = 'center';
    tab.style.fontSize = '90%';

    line = tab.insertRow();
    ev_addCell(line, "<b>Avancement commun</b>", null, 2);
    ev_addCell(line, "<b>AdQ</b>", "6699FF");
    ev_addCell(line, "<b>BA</b>", "66FF66");
    ev_addCell(line, "<b>A</b>", "66FFFF");
    ev_addCell(line, "<b>B</b>", "FFFF66");
    ev_addCell(line, "<b>BD</b>", "FFAA66");
    ev_addCell(line, "<b>Ébauche</b>", "FF6666");
    ev_addCell(line, "<b>Homonymie</b>", "66FF66");
    ev_addCell(line, "<b>?</b>", "F8F8F8");

    line = tab.insertRow();
    let av = window.evaluation_multiprojets.avancement_global;
    ev_addCell(line, ev_getRadioboxHtml("ag", av === "AdQ", null, "avancement_global", "AdQ"));
    ev_addCell(line, ev_getRadioboxHtml("ag", av === "BA", null, "avancement_global", "BA"));
    ev_addCell(line, ev_getRadioboxHtml("ag", av === "A", null, "avancement_global", "A"));
    ev_addCell(line, ev_getRadioboxHtml("ag", av === "B", null, "avancement_global", "B"));
    ev_addCell(line, ev_getRadioboxHtml("ag", av === "BD", null, "avancement_global", "BD"));
    ev_addCell(line, ev_getRadioboxHtml("ag", av === "ébauche", null, "avancement_global", "ébauche"));
    ev_addCell(line, ev_getRadioboxHtml("ag", av === "homonymie", null, "avancement_global", "homonymie"));
    ev_addCell(line, ev_getRadioboxHtml("ag", av === "?", null, "avancement_global", "?"));

    let tab2 = document.createElement("table");
    tab2.className = 'wikitable';
    tab2.style.textAlign = 'center';
    tab2.style.fontSize = '90%';

    line = tab2.insertRow();
    ev_addCell(line, "<b>Projet</b>", "F8F8F8");
    ev_addCell(line, "<b>Bandeau présent</b>", "F8F8F8");
    ev_addCell(line, "<b>Maximum</b>", "FF00FF");
    ev_addCell(line, "<b>Élevée</b>", "FF88FF");
    ev_addCell(line, "<b>Moyenne</b>", "FFCCFF");
    ev_addCell(line, "<b>Faible</b>", "FFEEFF");
    ev_addCell(line, "<b>?</b>", "F8F8F8");

    for (let i = 0; i < window.evaluation_multiprojets.project.length; i++) {
        ev_addEvalLine(
            tab2,
            window.evaluation_multiprojets.project[i],
            window.evaluation_multiprojets.importance[i],
            window.evaluation_multiprojets.state[i],
            i,
            true
        );
    }

    let project_fd = document.createElement("input");
    project_fd.setAttribute('type', 'text');
    project_fd.onkeyup = (function (e) {
        if (e.key === 'Enter' || e.keyCode === 13) {
            project_add();
        }
    });

    let project_btn = document.createElement("button");
    project_btn.textContent = "Ajouter le projet"

    function project_add() {
        if (project_fd.value !== null && project_fd.value !== "") {
            window.evaluation_multiprojets.project.push(project_fd.value);
            window.evaluation_multiprojets.importance.push("?");
            window.evaluation_multiprojets.state.push(true);
            ev_drawEvaluation();
        }
    }

    project_btn.onclick = project_add;

    let button = document.createElement("button");
    button.textContent = "Sauver";
    button.onclick = ev_setEvaluation;
    button.id = 'EvalButton';

    let button2 = document.createElement("button");
    button2.textContent = "Sauver et quitter";
    button2.accessKey = "s";
    button2.onclick = ev_setEvaluationQuit;
    button2.id = 'EvalButton2';

    $('#EvalDiv')
        .empty()
        .append(tab, tab2, project_fd, project_btn, button, button2);
}

function ev_AddMyProjects() {
    for (let i = 0; i < window.evalProjectNames.length; i++) {
        if (window.evaluation_multiprojets.project.indexOf(window.evalProjectNames[i]) === -1) {
            let t = window.evaluation_multiprojets.project.length;

            window.evaluation_multiprojets.project[t] = window.evalProjectNames[i];
            window.evaluation_multiprojets.importance[t] = "?";
            window.evaluation_multiprojets.state[t] = false;
        }
    }
}

function ev_ExtractEvaluation(discussion) {
    let reg_modele_multiprojet = /{{[wW]ikiprojet\s*\|([^}]*)}}/;
    let m = reg_modele_multiprojet.exec(discussion);
    if (m) {
        let tab = m[1].split("|");
        let i = 0;
        let ind = window.evaluation_multiprojets.project.length;
        while (i < tab.length) {
            let t = tab[i].split("=");
            if (t.length === 2) {
                if (t[0].trim() === "avancement") {
                    window.evaluation_multiprojets.avancement_global = ev_cleanAvancement(t[1].trim());
                } else {
                    window.evaluation_multiprojets.autres[t[0]] = t[1].trim();
                }
            } else if (t.length === 1) {
                window.evaluation_multiprojets.project[ind] = tab[i].trim();
                if (i === tab.length - 1) {
                  alert("Erreur de lecture du modèle {{Wikiprojet}}");
                }
                window.evaluation_multiprojets.importance[ind] = ev_cleanImportance(tab[i + 1].trim());
                window.evaluation_multiprojets.state[ind] = true;
                ind++;
                i++;
            }
            i++;
        }
    }
}

function ev_cleanAvancement(val) {
    val = val.toLowerCase();
    if (val === "adq") {
        return "AdQ";
    }
    if (val === "ba") {
        return "BA";
    }
    if (val === "a") {
        return "A";
    }
    if (val === "b") {
        return "B";
    }
    if (val === "bd") {
        return "BD";
    }
    if (val === "ébauche" || val === "e") {
        return "ébauche";
    }
    if (val === "homonymie") {
        return "homonymie";
    }

    return "?";
}


function ev_cleanImportance(val) {
    val = val.toLowerCase();
    if (val === "maximum" || val === "maximale") {
        return "maximum";
    }
    if (val === "élevée") {
        return "élevée";
    }
    if (val === "moyenne") {
        return "moyenne";
    }
    if (val === "faible") {
        return "faible";
    }

    return "?";
}

function ev_setEvaluation() {
    document.getElementById('EvalButton').disabled = true;
    let talkpage = mw.config.get('wgFormattedNamespaces')[1] + ':' + mw.config.get('wgPageName');
    let summary = '[[MediaWiki:Gadget-Evaluation.js|Évaluation]]: ' + ev_getSummary_multiprojects();
    if (window.evaluation_multiprojets.pdd_existe) {
        new mw.Api()
            .edit(talkpage, function (revision) {
                return {
                    text: ev_processText(revision.content),
                    summary: summary
                };
            })
            .done(ev_doneCallback);
    } else {
        new mw.Api()
            .create(talkpage, {summary: summary}, ev_processText(''))
            .done(ev_doneCallback);
    }
}

function ev_setEvaluationQuit() {
    document.getElementById('EvalButton2').disabled = true;
    var talkpage = 'Discussion:' + mw.config.get('wgPageName');
    var summary = '[[MediaWiki:Gadget-Evaluation.js|Évaluation]]: ' + ev_getSummary_multiprojects();
    if (window.evaluation_multiprojets.pdd_existe) {
        new mw.Api()
            .edit(talkpage, function (revision) {
                return {
                    text: ev_processText(revision.content),
                    summary: summary
                };
            })
            .done(ev_doneCallbackQuit);
    } else {
        new mw.Api()
            .create(talkpage, {summary: summary}, ev_processText(''))
            .done(ev_doneCallbackQuit);
    }
}

function ev_processText(text) {
    text = ev_suppr_anc_eval(text);
    text = ev_process_multiprojects(text);
    text = ev_remise_en_tete(text);
    return text;
}

function ev_doneCallback() {
    document.getElementById('EvalButton').disabled = false;
}

function ev_doneCallbackQuit() {
    document.getElementById('EvalButton2').disabled = false;
    window.close();
}

function ev_getSummary_multiprojects() {
    var summary = " Multiprojet (" + window.evaluation_multiprojets.avancement_global + ")";
    for (var i = 0; i < window.evaluation_multiprojets.project.length; i++) {
        if (window.evaluation_multiprojets.state[i]) {
            summary += " " + window.evaluation_multiprojets.project[i] + "|" + window.evaluation_multiprojets.importance[i];
        }
    }
    return summary + ")";
}

function ev_suppr_anc_eval(text) {
    var regtxt = /\{\{([W|w]ikiprojet [^\}|])[^\}]*\}\}/g;
    return text.replace(regtxt, '');
}

function ev_process_multiprojects(text) {
    var regtxt = /\{\{[wW]ikiprojet\s*\|[^\}]*\}\}/;
    var newtxt = "{{Wikiprojet";
    var regtodo = /\{\{([tT]odo\|?\*?|[àÀ] faire\|?\*?)\}\}/;
    var ok = false;
    var i;
    for (i = 0; i < window.evaluation_multiprojets.project.length; i++) {
        if (window.evaluation_multiprojets.state[i]) {
            newtxt += "\n|{{subst:Wikiprojet/alias|projet="
                + window.evaluation_multiprojets.project[i]
                + "}}|"
                + window.evaluation_multiprojets.importance[i];
            ok = true;
        }
    }
    ok = ok || (window.evaluation_multiprojets.avancement_global !== "?");
    newtxt += "\n|avancement=" + window.evaluation_multiprojets.avancement_global;

    for (i in window.evaluation_multiprojets.autres) {
        newtxt += "\n|" + i + "=" + window.evaluation_multiprojets.autres[i];
    }
    newtxt += "\n}}";

    if (ok) {
        if (regtxt.test(text)) {
            text = text.replace(regtxt, newtxt);
        } else {
            text = newtxt + "\n" + text;
        }
        text = text.replace(regtodo, "");
    }
    return text;
}

function ev_remise_en_tete(text) {
    var reg = /(\{\{[tT]raduit de\s*\|[^}]*\}\})/;
    var m = reg.exec(text);
    if (m) {
        var left = RegExp.leftContext;
        var right = RegExp.rightContext;
        text = m[1]
            + "\n"
            + left.replace(/\s+$/, '')
            + "\n"
            + right.replace(/^\s+/, '');
    }
    return text;
}

//</nowiki></pre></source>