Utilisateur:Louistisserand/Scripts/Portail-Test.js

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) ;

Firefox (sur GNU/Linux) / Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
//var cpeSpecialPage = "Spécial:Portail-éval";
var cpeSpecialPage = "Utilisateur:Louistisserand/Spécial/Portail-éval";

$(function () {
  mw.loader.using( 'mediawiki.util', function () {
    mw.util.addPortletLink('p-tb', mw.config.get("wgArticlePath").replace(/\$1/, cpeSpecialPage), 'Portail-éval', 'r-cpe', 'Portail-éval');
  });
});

if (mw.config.get("wgPageName") == cpeSpecialPage) {

/* Génération de la liste */

function cpeArticleLink(article) {
    return "<a href=\"" + mw.config.get("wgArticlePath").replace(/\$1/, encodeURIComponent(article)) + "\">" + mw.html.escape(article) + "</a>";
}

function cpeReadCat(categ, callbackFun, progressFun) {
    var query = {format: 'json', action: 'query', list: 'categorymembers', cmtitle: categ, cmlimit: 500, rawcontinue: ''};   /* SLD : 500 => 4 = catastrophe */
    var catMembers = [];

    function readCatLoop(obj) {
        $.merge(catMembers, obj.query.categorymembers);
        progressFun(catMembers.length);
        if (obj["query-continue"]) {
            query.cmcontinue = obj["query-continue"].categorymembers.cmcontinue;
            $.getJSON(mw.util.wikiScript('api'), query, readCatLoop);
        } else {
            callbackFun(catMembers);
        }
    }

    $.getJSON(mw.util.wikiScript('api'), query, readCatLoop);
}

function cpeComputeLists(portail, evalCatPrefix, callbackFun) {
    var cpeImp = ["inconnue", "faible", "moyenne", "élevée", "maximum"];
    var cpeListePortail = new Object;
    var cpeListeEval = new Object;

    function initReadInfo(cat) {
        $("#cpeResult").html("Lecture de <tt>" + mw.html.escape(cat) + "</tt> <span id=\"cpeCatReadCount\"></span>");
    }
    function updateReadInfo(size) {
        $("#cpeCatReadCount").text("(" + size + " lus)");
    }

    function listeEval(index) {
        if (index < cpeImp.length) {
            initReadInfo(evalCatPrefix + " d'importance " + cpeImp[index]);
            cpeReadCat(evalCatPrefix + " d'importance " + cpeImp[index],
                function (catMembers) {
                    for (var i = 0; i < catMembers.length; i++) {
                        if (catMembers[i].ns == 1) {
                            var talkTitle = catMembers[i].title;
                            var title = talkTitle.substr(talkTitle.indexOf(":") + 1);
                            cpeListeEval[title] = true;
                        }
                    }
                    listeEval(index + 1);
                }, updateReadInfo
            );
        } else {
            callbackFun(cpeListePortail, cpeListeEval);
        }
    }

    initReadInfo("Catégorie:Portail:" + portail + "/Articles liés");
    cpeReadCat("Catégorie:Portail:" + portail + "/Articles liés",
        function (catMembers) {
            for (var i = 0; i < catMembers.length; i++) {
                cpeListePortail[catMembers[i].title] = true;
            }
            listeEval(0);
        }, updateReadInfo
    );
}

/* Formulaire */

var cpeTimeout = false, cpeUpdateCatId = 0, cpeCatCache = {};

function cpeCompute() {
    var CAT_EVAL_PREFIX = "Catégorie:Article ";
    var portail, catEval;

    portail = $('#cpePortail').val();
    if (portail == "") {
        $("#cpeResult").text("Erreur : le champ 'Portail' est vide.");
        return;
    }
    if ($('#cpeCatTypeAuto').attr('checked')) {
        catEval = $('#cpeCatAuto').text();
        if (catEval.substr(0, CAT_EVAL_PREFIX.length) != CAT_EVAL_PREFIX) {
            $("#cpeResult").text("Erreur : le champ 'Préfixe des catégories' n'est pas valide.");
            return;
        }
    } else {
        catEval = $("#cpeCatManuel").val();
        if (catEval == "") {
            $("#cpeResult").text("Erreur : le champ 'Préfixe des catégories' est vide.");

        }
        catEval = CAT_EVAL_PREFIX + catEval;
    }
    portail = portail.substr(0, 1).toUpperCase() + portail.substr(1);

    $("#cpeCompute").attr("disabled", "disabled");

    cpeComputeLists(portail, catEval,
        function (listePortail, listeEval) {
    	var inputNB = parseInt($('#cpeRequestSize').val());  /* SLT */
    	if (inputNB==NaN || inputNB < 1) inputNB = 6; /* SLT */
            var directLink = location.protocol + mw.config.get("wgServer") + mw.config.get("wgScript")
                + "?title=" + encodeURIComponent(cpeSpecialPage)
                + "&portail=" + encodeURIComponent(portail)
                + "&cateval=" + encodeURIComponent(catEval.substr(CAT_EVAL_PREFIX.length));
            var html = "<p><small>Lien direct pour revenir à cette requête&nbsp;: <a href=\"" + mw.html.escape(directLink) + "\">" + mw.html.escape(directLink) + "</a></small></p>";
            html += '<p><a href="#" id="cpeDisplayWikicode" class="cpe-closed">Version en wikicode à copier-coller</a></p>';
            var list1 = '', list2 = '';
            var wikicodeList1 = '', wikicodeList2 = '';
            var listCount1 = 0, listCount2 = 0, maxListCount = inputNB; //4;   /* SLD : 500 => 4 */
            for (article in listePortail) {
                if (!listeEval[article]) {
                    listCount1++;
                    if (listCount1 <= maxListCount) {
                        list1 += "<li>" + cpeArticleLink(article);
                        wikicodeList1 += '*[[' + article + ']]\n';
                    }
                }
            }
            /***
            for (article in listeEval) {
                if (!listePortail[article]) {
                    listCount2++;
                    if (listCount2 <= maxListCount) {
                        list2 += "<li>" + cpeArticleLink(article);
                        wikicodeList2 += '*[[' + article + ']]\n';
                    }
                }
            }
            ***/

            function formatCount(c) {
                if (c == 0) {
                    return "Aucun article";
                } else if (c == 1) {
                    return "1 article";
                } else if (c <= maxListCount) {
                    return c + " articles";
                } else {
                    return c + " articles (seulement " + maxListCount + " affichés)";
                }
            }

            html += "<h2>Articles du portail non évalués</h2>"
                + "<p>" + formatCount(listCount1) + "</p><ul>" + list1 + "</ul>";
                /***
                + "<h2>Articles évalués sans le portail</h2>"
                + "<p>" + formatCount(listCount2) + "</p><ul>" + list2 + "</ul>";
                ***/

            $("#cpeResult").html(html);
            $("#cpeCompute").prop("disabled", false);
            $("#cpeDisplayWikicode").click(function() {
                var link = $(this);
                link.toggleClass('cpe-closed cpe-opened');
                if (link.hasClass('cpe-opened')) {
                    link.after('<div id="cpeWikicodeDiv"><textarea id="cpeWikicode" cols="80" rows="25" readonly></textarea></div>');
                    $('#cpeWikicode').val('== Articles du portail non évalués ==\n' + wikicodeList1 + '\n== Articles évalués sans le portail ==\n' + wikicodeList2);
                } else {
                    $('#cpeWikicodeDiv').remove();
                }
            });
        }
    );
}

function cpeUpdateCatSpan() {
    var indexSel = $('#cpeCatTypeAuto').attr('checked') ? 0 : 1;
    $("#cpeCatAuto").css("display", indexSel == 0 ? "" : "none");
    $("#cpeCatManuelSpan").css("display", indexSel == 1 ? "" : "none");
}

function cpeInitForm(portail, catEval) {
    $('head').append('<style>'
        + '.cpe-closed {padding: 0 0 0 16px; background: url(//upload.wikimedia.org/wikipedia/commons/4/41/MediaWiki_Vector_skin_right_arrow.png) no-repeat left center;}'
        + '.cpe-opened {padding: 0 0 0 16px; background: url(//upload.wikimedia.org/wikipedia/commons/1/10/MediaWiki_Vector_skin_action_arrow.png) no-repeat left center;}'
        + '</style>');
    html = '<p>Ce formulaire sert à calculer la liste des articles qui ont un portail mais pas une évaluation, et réciproquement.</p>'
        + '<p>Portail (par exemple <i>Chemin de fer</i>)<br /><input id="cpePortail" size="64" value="'
        + mw.html.escape(portail) + '" /></p>'
        + '<p>Taille requete<br /><input id="cpeRequestSize" size="4" value="9" /></p>'
        + '<p>Préfixe des catégories liées à l\'évaluation (la casse doit être respectée ; par exemple <tt>Catégorie:Article <i>ferroviaire</i></tt>)<br />'
        + '<input name="cpeCatType" id="cpeCatTypeAuto" type="radio" ' + (catEval ? '' : 'checked="checked" ') + '/>'
        + '<label for="cpeCatTypeAuto">Automatique</label> '
        + '<input name="cpeCatType" id="cpeCatTypeManuel" type="radio" ' + (catEval ? 'checked="checked" ' : '') + '/>'
        + '<label for="cpeCatTypeManuel">Manuel</label><br />'
        + '<span id="cpeCatAuto" style="display:none"></span><span id="cpeCatManuelSpan" style="display:none"><tt>Catégorie:Article </tt>'
        + '<input size="40" id="cpeCatManuel" value="' + mw.html.escape(catEval) + '" /></span></p>'
        + '<p><input type="button" id="cpeCompute" onclick="cpeCompute();" value="Calculer" /></p><div id="cpeResult"></div>'
    $("#bodyContent").html(html);
    mw.loader.using(["jquery.ui"], function () {
        var inputPortail = $("#cpePortail");
        inputPortail.autocomplete({source:
            function (request, response) {
                if (/[{}|<>\[\]]/.test(request.term)) {
                    response([]);
                    return;
                }
                var prefix = "Portail " + request.term.substr(0, 1).toUpperCase() + request.term.substr(1);
                var query = {format: 'json', action: 'query', list: 'allpages', apprefix: prefix, apnamespace: 10, rawcontinue: ''};
                $.getJSON(mw.util.wikiScript('api'), query, function (obj) {
                    var portails = [];
                    for (var i = 0; i < obj.query.allpages.length; i++) {
                        var portail = obj.query.allpages[i].title;
                        portails.push(portail.substr(portail.indexOf(':') + 9));
                    }
                    if (portails.length == 1 && portails[0] == request.term) {
                        response([]);
                    } else {
                        response(portails);
                    }
                });
            }, select: cpeInvalidateCat});
        inputPortail.bind("change", cpeInvalidateCat);
        $("#cpeCatManuel").bind("change", function() {$("#cpeCatTypeManuel").attr("checked", "checked");});
        $("#cpeCatTypeAuto,#cpeCatTypeManuel").bind("change", cpeUpdateCatSpan);
        if (portail) cpeInvalidateCat();
        cpeUpdateCatSpan();
    });
}

function cpeInvalidateCat() {
    if (cpeTimeout) clearTimeout(cpeTimeout);
    cpeUpdateCatId++;

    var portail = $('#cpePortail').val();
    if (portail == "") {
        $('#cpeCatAuto').text("");
    } else if (cpeCatCache[portail]) {
        $('#cpeCatAuto').html(cpeCatCache[portail]);
    } else {
        $('#cpeCatAuto').text("...");
        cpeTimeout = setTimeout(cpeUpdateCat, 300);
    }
}

function cpeUpdateCat() {
    var portail = $('#cpePortail').val();

    if (/[{}|<>\[\]]/.test(portail)) {
        $('#cpeCatAuto').text('');
        return;
    } else if (cpeCatCache[portail]) {
        $('#cpeCatAuto').html(cpeCatCache[portail]);
        return;
    }

    var initId = cpeUpdateCatId;
    $.getJSON(mw.util.wikiScript('api'),
        {format: 'json', action: 'expandtemplates', text: 'Article du projet {{ucfirst:' + portail + '}}'},
        function(obj) {
            var catPrefix = "Catégorie:" + obj.expandtemplates['*'];
            $.getJSON(mw.util.wikiScript('api'),
                {format: 'json', action: 'query', titles: catPrefix + " d'importance faible", prop: 'revisions', rvprop: 'timestamp'},
                function (obj) {
                    if (initId != cpeUpdateCatId) return;
                    var catPrefixHTML = '<span style="color:red">Impossible de trouver les catégories d\'évaluation</span>';
                    for (var pageId in obj.query.pages) {
                        if (pageId != "-1") {
                            catPrefixHTML = "<tt>" + mw.html.escape(catPrefix) + "</tt>";
                            break;
                        }
                    }
                    cpeCatCache[portail] = catPrefixHTML;
                    $('#cpeCatAuto').html(catPrefixHTML);
                }
            );
        }
    );
}

$(function () {
    var title = "Comparaison portail et articles évalués";
    var portail = "", catEval = ""
    window.document.title = title;
    $('#firstHeading').html(title);

    var params = location.search.substr(1).split("&");
    for (var i = 0; i < params.length; i++) {
        var nameVal = params[i].split("=");
        if (nameVal.length < 2) continue;
        if (nameVal[0] == "portail")
            portail = decodeURIComponent(nameVal[1]);
        else if (nameVal[0] == "cateval")
            catEval = decodeURIComponent(nameVal[1]);
    }
    cpeInitForm(portail, catEval);
});

}