MediaWiki:Gadget-verifAncres.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.
/*
 * Vérifie les liés ancrés de la page courante pour déterminer ceux qui sont brisés.
 *
 * {{Catégorisation JS|VerifAncres}}
 */

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

mw.loader.using('mediawiki.util', function () {
    'use strict';

    $(function ($) {
        var node = mw.util.addPortletLink('p-tb', '#', 'Vérif. ancres', 't-ancres', "Vérifier les liens ancrés de cette page");
        $(node).click(function (e) {
            e.preventDefault();
            init();
        });
    });

    var goodLinks = [];
    var goodLinksAncres = [];
    var goodLinksURL = [];
    var badLinksURL = [];

    function init() {
        var Content = $('#mw-content-text').find('.mw-parser-output')[0];
        if (!Content) return;
        var allLinks = Content.getElementsByTagName('a');
        for (var i = 0, l = allLinks.length; i < l; i++) {
            var currentLink = allLinks[i];
            if (
                   currentLink.hash == ''
                || currentLink.parentNode.closest('#toc')
                || currentLink.parentNode.classList.contains('mw-editsection')
                || currentLink.parentNode.classList.contains('cachelinks')
                || currentLink.classList.contains('external')
                || currentLink.href.indexOf('javascript:') == 0
                || currentLink.classList.contains('new')
                || currentLink.classList.contains('mw-file-description')
                || currentLink.parentNode.parentNode.id == 'mw-normal-catlinks'
                || currentLink.parentNode.id == 'mw-normal-catlinks'
                || currentLink.parentNode.classList.contains('subpages')
                || currentLink.parentNode.id == 'contentSub'
                || (currentLink.getAttribute("href") || '').indexOf("#") == 0
                || currentLink.hash.indexOf("#cite_ref-") == 0
                || currentLink.hash.indexOf("#cite_note-") == 0
                || currentLink.hostname != mw.config.get('wgServerName')
                || decodeURIComponent(currentLink.pathname) == mw.config.get('wgArticlePath').replace('$1', mw.config.get('wgPageName'))
                || (currentLink.pathname == mw.config.get('wgScript') && new URL(currentLink.href).searchParams.get('title') == mw.config.get('wgPageName'))
            ) {
                continue;
            }
            var Ancre = decodeURIComponent(currentLink.hash.replace(/^#/, ""));
            if (Ancre != "") {
                goodLinksAncres.push(Ancre);
                goodLinks.push(currentLink);
                goodLinksURL.push(currentLink.href);
            }
        }
        if (goodLinks.length == 0) {
            alert('Cette page ne contient aucun lien ancré'); return;
        } else if (goodLinks.length == 1) {
            if (!confirm(goodLinks.length + " lien va être analysé :\n\n" + goodLinksURL)) return;
        } else {
            if (!confirm(goodLinks.length + " liens vont être analysés :\n\n" + goodLinksURL.join('\n'))) return;
        }
        verifAncres();
    }

    function verifAncres(position) {
        if (!position) position = 0;
        var tempLink = goodLinks[position];
        var tempAncre = goodLinksAncres[position];
        if (!tempLink) {
            endMessage();
            return;
        }
        var tempTitle = tempLink.title;
        var URL = mw.config.get('wgServer') + mw.config.get('wgScript') + "?title=" + encodeURIComponent(tempTitle) + "&action=render";
        var CompleteFunction = function (Aj) {
            var htmlDoc = new DOMParser().parseFromString(Aj.responseText, 'text/html');
            var Good = false;
            var sections = htmlDoc.getElementsByClassName('mw-headline');
            for (var i = 0, l = sections.length; i < l; i++) {
                var ThisAncre = sections[i].id;
                if (ThisAncre == tempAncre) {
                    Good = true;
                    break;
                }
            }
            if (Good) {
                goodLinks[position].style.backgroundColor = '#C8FFC8';
                goodLinks[position].style.border = '1px solid green';
            } else {
                goodLinks[position].style.backgroundColor = '#FFCCCC';
                goodLinks[position].style.border = '1px solid red';
                badLinksURL.push(goodLinks[position].href);
            }
            verifAncres(position + 1);
        };
        $.ajax({url: URL, complete: CompleteFunction});
    }

    function endMessage() {
        var msg;
        if (badLinksURL.length == 0) {
            msg = "Aucun lien ancré brisé n’a été trouvé.";
        } else if (badLinksURL.length == 1) {
            msg = "Un lien ancré brisé a été trouvé.";
        } else {
            msg = badLinksURL.length + " liens ancrés brisés ont été trouvés.";
        }
        if (badLinksURL.length > 0) msg += "\n\n" + badLinksURL.join('\n');

        alert(msg);
    }

});