Utilisateur:Pre7/Gadget-ponctuavref.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.
/* jshint esversion: 6 */
/* globals mw, $ */

/* <nowiki> */

mw.loader.using(['mediawiki.util', 'mediawiki.user', 'mediawiki.api'], function() {
    $(function() {
        console.log("Script démarré");
        var api = new mw.Api();

        // Liste des modèles de référence
        const referenceTemplates = new Set([
            "Article",
            "Chapitre",
            "Citation ACMH",
            "Citation DANFS",
            "Citation épisode",
            "Citation jeu vidéo",
            "Citation NVR",
            "Citer doi",
            "Jugement",
            "Lien DOI",
            "Lien PMID",
            "Lien vidéo",
            "Lien web",
            "Livret album",
            "Loi",
            "Note",
            "Ouvrage"
        ]);

        // Fonction principale
        function retraitPonctuationAvantReferences() {
            console.log("Fonction retraitPonctuationAvantReferences appelée");
            var titre = mw.config.get('wgPageName');
            console.log("Titre de la page:", titre);

            api.get({
                action: 'query',
                prop: 'revisions',
                titles: titre,
                rvprop: 'content',
                rvslots: 'main',
                formatversion: 2
            }).done(function(data) {
                console.log("Contenu de la page récupéré avec succès");
                var page = data.query.pages[0];
                var contenu = page.revisions[0].slots.main.content;
                console.log("Longueur du contenu:", contenu.length);

                var lignes = contenu.split('\n');
                console.log("Nombre de lignes:", lignes.length);
                var lignesModifiees = lignes.map(traiterLigne);
                var nouveauContenu = lignesModifiees.join('\n');

                if (nouveauContenu === contenu) {
                    console.log("Aucune modification nécessaire");
                    mw.notify("Aucune modification de ponctuation nécessaire.", { type: 'warn' });
                    return;
                }

                console.log("Modifications détectées, envoi de l'édition");
                api.postWithToken('csrf', {
                    action: 'edit',
                    title: titre,
                    text: nouveauContenu,
                    summary: 'Retrait automatique de la ponctuation avant les références',
                    minor: true,
                    bot: true
                }).done(function () {
                    console.log("Modification enregistrée avec succès");
                    mw.notify("Modification enregistrée avec succès !", { type: 'success' });
                    location.reload();
                }).fail(function (error) {
                    console.error("Erreur lors de la modification:", error);
                    mw.notify("Erreur lors de la modification de la page.", { type: 'error' });
                });
            }).fail(function (error) {
                console.error("Erreur lors de la récupération du contenu:", error);
                mw.notify("Erreur lors de la récupération du contenu de la page.", { type: 'error' });
            });
        }

        // Fonction pour traiter chaque ligne
        function traiterLigne(ligne) {
            const ligneTrim = ligne.trim();
        
            // Liste des caractères de début de ligne à ignorer
            const ignoreDebut = ['*', '=', '[', '{', '#', ';', ':', '!', ' ', '<', '\t'];
        
            // Si la ligne commence par un caractère à ignorer ou est vide, on ne la modifie pas
            if (ignoreDebut.some(character => ligne.startsWith(character)) || ligneTrim.length === 0) {
                return ligne;
            }
        
            // Expression régulière qui détecte uniquement un point suivi d'éventuels espaces
            // uniquement s'il précède immédiatement une référence sous forme de template ou de <ref...>
            const regexPointRef = new RegExp(
                "(\\.)\\s*(?=(\\{\\{(?:" + Array.from(referenceTemplates).join('|') + ")[^}]*\\}\\})|<ref[^>]*>)",
                "g"
            );
        
            let ligneModifiee = ligneTrim;
            let pointDetecte = false;
        
            // Utilisation d'une fonction de remplacement avec capture
            ligneModifiee = ligneTrim.replace(regexPointRef, (match, capturedPoint, offset, string) => {
                // Vérification si le point détecté est à l'intérieur d'accolades
                let countOpenBraces = 0;
                for (let i = 0; i < offset; i++) {
                    if (string[i] === '{') countOpenBraces++;
                    if (string[i] === '}') countOpenBraces--;
                }
                
                // Si le point est à l'intérieur d'accolades, on ne le modifie pas
                if (countOpenBraces > 0) {
                    return match;
                }
        
                pointDetecte = true;
                return ''; // On remplace le point par une chaîne vide
            });
        
            if (pointDetecte) {
                console.log("Point retiré avant référence. Nouvelle ligne:", ligneModifiee);
                return ligneModifiee;
            } else {
                return ligne;
            }
        }               

        // Ajoute un lien dans la barre d'outils pour lancer la modification
        function ajouterLienBarreOutils() {
            console.log("Ajout du lien dans la barre d'outils");
            var $lien = $('<li>')
                .addClass('mw-list-item')
                .append($('<a>')
                    .attr('href', '#')
                    .append($('<span>').text('Ponctuations AVref'))
                    .click(function (e) {
                        e.preventDefault();
                        console.log("Lien cliqué");
                        if (confirm("Voulez-vous vraiment supprimer la ponctuation avant les références ?")) {
                            retraitPonctuationAvantReferences();
                        }
                    })
                );

            $('#p-cactions ul').append($lien);
            console.log("Lien ajouté avec succès");
        }

        ajouterLienBarreOutils();
        console.log("Script terminé");
    });
});

/* </nowiki> */