MediaWiki:Gadget-FusionContribs.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.
/**
 * Fusion d'historiques
 *
 * Fusionne les historiques de plusieurs contributeurs
 *
 * Auteur : Marc Mongenet
 * Dernière révision : 24 mai 2007
 * {{Catégorisation JS|FusionContribs}}
 */

// Fusion display of Wikipedia user contributions history
// Copyright 2006, 2007, Marc Mongenet
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// See http://www.gnu.org/licenses/gpl.html

// TODO: Special:Log

var fusioncontribsFus = new Object(); // fusioncontribsFus is used as namespace.
fusioncontribsFus.main_contributor = undefined; // main contributor name
fusioncontribsFus.contributors_list = new Object(); // XHTML list of contributors
fusioncontribsFus.contribs_limit = 0; // 0 means default value
fusioncontribsFus.count = 0; // number of fusionned contribs
fusioncontribsFus.colors = [ "", "#FFB", "#FBF", "#BFF", "#DDF", "#DFD", "#FDD",
                             "#EEA", "#EAE", "#AEE", "#CCE", "#CEC", "#ECC",
                             "#DD9", "#D9D", "#9DD", "#BBD", "#BDB", "#DBB" ];

fusioncontribsFus.contributors_list.init = function() {
        this.elm = document.createElement("ol");
};

fusioncontribsFus.contributors_list.add = function(contributor) {
        // UI components
        var li = document.createElement("li");
        li.fusioncontribsFus = new Object();
        li.fusioncontribsFus.contributor = contributor;
        li.style.backgroundColor = fusioncontribsFus.colors[fusioncontribsFus.count];

        var aContributor = document.createElement("a");
        aContributor.href = mw.util.getUrl(mw.config.get('wgFormattedNamespaces')[2] + ":" + contributor);
        aContributor.title = mw.config.get('wgFormattedNamespaces')[2] + ":" + contributor;
        aContributor.textContent = contributor;

        var aTalk = document.createElement("a");
        aTalk.href = mw.util.getUrl(mw.config.get('wgFormattedNamespaces')[3] + ":" + contributor);
        aTalk.title = mw.config.get('wgFormattedNamespaces')[3] + ":" + contributor;
        aTalk.textContent = "d";

        var aContribs = document.createElement("a");
        aContribs.href = mw.util.getUrl(mw.config.get('wgFormattedNamespaces')[-1] + ":Contributions/" + contributor);
        aContribs.title = mw.config.get('wgFormattedNamespaces')[-1] + ":Contributions/" + contributor;
        aContribs.textContent = "c";

        var aEditcount = document.createElement("a");
        aEditcount.href = "//tools.wmflabs.org/xtools/pcount/index.php?lang=fr&wiki=wikipedia&name=" + encodeURIComponent(contributor);
        aEditcount.title = "Editcount de " + contributor;
        aEditcount.textContent = "e";

        li.append(aContributor);
        li.append(" (");
        li.append(aTalk);
        li.append("|");
        li.append(aContribs);
        li.append("|");
        li.append(aEditcount);
        li.append(")");
        this.elm.append(li);
};

fusioncontribsFus.monthNameToNum = function(m) {
        if (m == "janvier") return 0;
        if (m == "février") return 1;
        if (m == "mars") return 2;
        if (m == "avril") return 3;
        if (m == "mai") return 4;
        if (m == "juin") return 5;
        if (m == "juillet") return 6;
        if (m == "août") return 7;
        if (m == "septembre") return 8;
        if (m == "octobre") return 9;
        if (m == "novembre") return 10;
        if (m == "décembre") return 11;
        return 12;
};


// Return Date of contribution listed in this li element.
fusioncontribsFus.parseContribTime = function(li) {
        var text = li.querySelector('.mw-changeslist-date').textContent; // généralement <a>, mais <span> pour les discussions Flow
        var datetime = text.match(/(\d+)\s+(\S+)\s+(\d{4})\D+(\d+)\D+(\d{2})/);
        if(datetime==null) alert("Erreur lors de la récupération de date : \nContacter le Projet:Scripts et gadgets\n\n"+text);
        datetime[2] = fusioncontribsFus.monthNameToNum(datetime[2]);
        return new Date(parseInt(datetime[3]),
                            datetime[2],
                        parseInt(datetime[1]),
                        parseInt(datetime[4], 10),
                        parseInt(datetime[5], 10));
};

fusioncontribsFus.fuse = function(ul1, ul2, contributor, color) {
        contributor = " --\xA0" + contributor;
        var li1 = ul1.firstChild;
        for (var li22 = ul2.firstChild; li22; li22 = li22.nextSibling) {
                if (li22.nodeType == 1) {
                        var li2 = li22.cloneNode(true);
                        li2.append(contributor);
                        if (typeof li2.style === "undefined") {
                                li2.style = new Object();
                        }
                        li2.style.backgroundColor = color;
                        var time2 = fusioncontribsFus.parseContribTime(li2).getTime();

                        while (li1) {
                                if (li1.nodeType == 1) {
                                        var time1 = fusioncontribsFus.parseContribTime(li1).getTime();
                                        if (time1 <= time2) {
                                                if (time1 == time2) {
                                                        li1.style.borderLeftWidth = li2.style.borderLeftWidth = "0.25em";
                                                        li1.style.borderLeftStyle = li2.style.borderLeftStyle = "solid";
                                                        li1.style.borderLeftColor = li2.style.borderLeftColor = "red";
                                                }
                                                break;
                                        }
                                }
                                li1 = li1.nextSibling;
                        }
                        ul1.insertBefore(li2, li1);
                }
        }
};

fusioncontribsFus.getElementById = function(elm, id) {
        var res = null;
        if (elm.id == id) res = elm;
        for (var child = elm.firstChild; !res && child; child = child.nextSibling)
                if (child.nodeType == 1)
                        res = fusioncontribsFus.getElementById(child, id);
        return res;
};

fusioncontribsFus.onFusionWith = function(contributor) {
        ++fusioncontribsFus.count;
        fusioncontribsFus.contributors_list.add(contributor);

        var ul1 = $('.mw-contributions-list')[0];

        if (!ul1) {
                // Create a list when the script is executed on root page [[Special:Contributions]]
                var $fallbackList = $('<ul class="mw-contributions-list"></ul>');
                var $content = $('#mw-content-text');
                var $contentBottom = $content.find('.printfooter');
                if ($contentBottom.length) {
                        $fallbackList.insertBefore($contentBottom);
                } else {
                        $fallbackList.appendTo($content);
                }
                ul1 = $fallbackList[0];
        }

        $.get(mw.util.getUrl(mw.config.get('wgFormattedNamespaces')[-1] + ':Contributions', {target: contributor, limit: fusioncontribsFus.contribs_limit}), function (result) {
                var ul2 = $(result).find('.mw-contributions-list')[0];
                if (ul2) {
                        fusioncontribsFus.fuse(ul1, ul2, contributor, fusioncontribsFus.colors[fusioncontribsFus.count]);
                }
        });
};

fusioncontribsFus.onContribPage = function() {
        fusioncontribsFus.main_contributor = mw.config.get('wgRelevantUserName');
        fusioncontribsFus.contribs_limit = mw.util.getParamValue('limit') || 0;

        // UI components
        fusioncontribsFus.contributors_list.init();
        if (fusioncontribsFus.main_contributor) {
                fusioncontribsFus.contributors_list.add(fusioncontribsFus.main_contributor);
        }

        var input = document.createElement("input");
        input.type = "text";

        var submit = document.createElement("input");
        submit.type = "submit";

        var form = document.createElement("form");
        form.onsubmit = function (e) {
                e.preventDefault();
                var targetUser = decodeURIComponent(input.value); // si copié-collé depuis la barre d'adresse du navigateur
                targetUser = targetUser.trim().replace(/^(Utilisateur|Utilisatrice|User):/i, '').replaceAll('_', ' ');
                if (targetUser !== '') {
                        fusioncontribsFus.onFusionWith(targetUser);
                }
        };

        // UI components layout
        submit.value = "Fusionner";
        form.append("Fusionner avec les contributions de ");
        form.append(input);
        form.append(submit);
        var bodyContent = document.getElementById("bodyContent");
        bodyContent.prepend(form);
        bodyContent.prepend(fusioncontribsFus.contributors_list.elm);
};

if (mw.config.get('wgCanonicalSpecialPageName') == "Contributions") {
        mw.loader.using('mediawiki.util', function () {
                $(function () {
                        fusioncontribsFus.onContribPage();
                });
        });
}