Aller au contenu

Utilisateur:Pre7/Gadget-subst.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) ;

Firefox (sur GNU/Linux) / Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
mw.loader.using(['mediawiki.api', 'mediawiki.util', 'oojs-ui-core', 'oojs-ui-windows']).then(function() {
    $(document).ready(function() {
        // Ne s'exécute que sur les pages de contenu en mode vue
        if (mw.config.get('wgAction') !== 'view' || !mw.config.get('wgIsArticle')) return;

        // Templates à détecter
        const config = {
            templatesToDetect: ["Admissibilité/initialise/intro", "Admissibilité/initialise/preload", "Années au Canada/initialisation", "Années au Québec/initialisation", "Années en Argentine/initialisation", "Années en Écosse/initialisation", "Article templates/libraries/preload", "Article templates/libraries/user palette preload", "Article templates/preload", "Avertissement question Oracle/Formulaire", "Brouillon/chargement", "Cite pmid/preload", "Composition RAW/commentaires/preload", "Composition RAW/commentaires/preload/en-tête", "Demande de renommage", "Documentation d'image complétée/Preload", "Documentation de carte complétée/Preload", "Documentation de carte complétée/Preload Géolocdual", "Documentation de carte complétée/Preload Géolocdual Documentation", "Documentation de modèle de point/Information/Preload", "Documentation de modèle de point/Preload", "Documentation paramétrage de carte/Preload", "Documentation/Preload", "Documentation/Preload2", "Documentation/Preload3", "Documentation/PreloadModule", "Documentation/PreloadModule2", "Faux positifs filtre", "Faux positifs filtre 2", "Formulaire Module:Langue/Data", "GeoTemplate/Group", "Initialiser catégorie d'évaluation", "Initialiser catégorie d'évaluation/bandeau", "Initialiser Comité de lecture", "Initialiser Évaluation", "Initialiser Évaluation/contenu", "Initialiser LANN", "Initialiser non vérifiable", "Initialiser page de contestation", "Initialiser PàP", "Initialiser PàV", "Initialiser PàV/droit", "Initialiser PCP", "Laisser un message/signature", "Onglets portail/preload", "Onglets Utilisateur/preload", "Préchargement Appel à Commentaire utilisateur", "Préchargement autre RA", "Préchargement AWB", "Préchargement CC 2019", "Préchargement controverse de neutralité", "Préchargement de nouveau modèle", "Préchargement DPH", "Préchargement DR", "Préchargement Image à Supprimer", "Préchargement MWS Blacklist", "Préchargement MWS Whitelist", "Préchargement pages soupçonnées de violation de copyright", "Préchargement pour Bac à sable", "Préchargement pour Bac à sable/brouillon", "Préchargement pour déclaration", "Préchargement pour demande d exemption de blocage", "Préchargement pour demande d exemption de blocage/modèle", "Préchargement pour demande d'usurpation", "Préchargement pour demande de fusion", "Préchargement pour demande de relecture", "Préchargement pour demande de renommage", "Préchargement pour demande de restauration", "Préchargement pour demande de traduction article Pays basque", "Préchargement pour Discussion Bac à sable", "Préchargement pour modèle Bac à sable", "Préchargement pour modèle Boîte utilisateur", "Préchargement pour requête d'intervention sur une page protégée", "Préchargement pour requête d'intervention sur une page protégée/expert", "Préchargement pour Sélection", "Préchargement Prénom japonais", "Préchargement PSF", "Préchargement RA", "Préload Ambassade WP", "Question Legifer", "Question Oracle", "Requête d'intervention sur un filtre", "Requête d'intervention sur une page Mediawiki", "RequêteCheckUser", "RequêteCheckUserExpert", "Wikiconcours 2007/preload", "Actualités du Wiktionnaire", "Aide Typographie", "AideMeta/Delist", "AideMeta/Promo", "AideMeta/RefLié", "AideMeta/RefSec", "AideMeta/StyleEncyclo", "AideMeta/TI", "Ajout POV", "Ajout Protection de page", "Ajout Protection de page/en", "Anecdote proposée", "AnnCin", "AnnLit", "AnnMus", "Annonce de page à supprimer", "AnnTV", "Article cratère de la lune", "Article formule brute", "Article Wikiconcours/mars 2009", "Article Wikiconcours/mars 2011/équipe 54", "Article Wikiconcours/mars 2013", "Article Wikiconcours/mars 2016", "Article Wikiconcours/mars 2020", "Article Wikiconcours/octobre 2016", "Article Wikiconcours/septembre 2010", "Article Wikiconcours/septembre 2011", "Article Wikiconcours/septembre 2013", "Article Wikiconcours/septembre 2014", "Article Wikiconcours/septembre 2019", "Article Wikiconcours/septembre 2020", "Article Wikiconcours/septembre 2024", "Articles", "Articles/Bac à sable", "Attention image externe", "Avertissement admissibilité à vérifier", "Avertissement admissibilité page radio", "Avertissement admissibilité page web", "Avertissement Bases", "Avertissement bref fusion", "Avertissement contenu généré par IA débattu", "Avertissement Copyvio", "Avertissement Copyvio Synopsis", "Avertissement débat d'admissibilité", "Avertissement fichier sans description", "Avertissement fusion", "Avertissement image incomplète", "Avertissement image orpheline non libre", "Avertissement licence inconnue", "Avertissement permission inconnue", "Avertissement renommage", "Avertissement restauration page", "Avertissement révision page monastère", "Avertissement révision page radio", "Avertissement robot", "Avertissement scission", "Avertissement source inconnue", "Avertissement suppression image", "Avertissement sursis", "Avis déplacé", "Bienvenue article renommé", "Bienvenue autobiographie", "Bienvenue CAOU", "Bienvenue CAOU 2", "Bienvenue copié collé", "Bienvenue IP", "Bienvenue IP méritante", "Bienvenue IP psycho", "Bienvenue nom d'utilisateur", "Bienvenue SI 4", "Bienvenue spammeur", "Bienvenue spammeur 2", "Bienvenue spammeur 3", "Bienvenue spammeur 4", "Bienvenue spammeur livre", "Bienvenue sur ta page", "Bienvenue sur votre page", "Biogéographie", "Blanchiment LANN", "Blocage canular", "Blocage Copyvio", "Bon article rejeté", "Bot sursis", "Bravo admin", "BSI BàS", "BSI CAA", "BSI canular", "BSI Copyvio", "BSI doublon", "BSI langue", "BSI promo", "BSI vandalisme", "Canevas portail flexible", "Canevas projet flexible", "Canular", "Compte à objet unique", "Compte bloqué pour trois jours", "Compte Facebook", "Compte publicitaire", "Connaissances personnelles/Confirmé", "Contributions promotionnelles", "Contributions rémunérées rappel", "Création joueuse de tennis", "Création page utilisateur", "Création tournoi de tennis", "Création tournoi de tennis/Primes et points", "Créer un projet", "Créer un projet/Modèle Cadre", "Créer un projet/Présentation", "CSD-Notification", "Demande RC", "Demande restriction thématique", "Dernier avertissement Copyvio", "Double obèle", "Doute admissibilité", "Durée de blocage", "EAN2ISBN", "Éditeur impliqué dans un arbitrage", "Faites-le", "Faut sourcer", "F", "Avertissement copyvio", "copieur", "ImageSansLicence", "bienvenue copyvio", "Bienvenue copyvio", "Bienvenue Copyvio 1", "Bienvenue Copyvio 2", "Bienvenue Copyvio 3", "Copieurlight", "Bienvenue Copyvio 4", "\"\"", "AdQ rejeté", "Adresse IP bloquée pour trois jours", ],

            // Confirmation de remplacement
            messages: {
                buttonText: 'Subst Templates',
                buttonTitle: 'Remplacer les templates spécifiés par leur version subst',
                editSummary: 'Remplacement automatique des templates par leur version subst',
                success: 'Opération réussie !',
                noTemplates: 'Aucun template à remplacer détecté',
                confirmEdit: 'Êtes-vous sûr de vouloir remplacer les templates ? Cette action modifiera la page.',
                pageNotFound: 'Page introuvable',
                apiError: 'Erreur API: ',
                noEditRights: 'Vous n\'avez pas les droits nécessaires pour éditer cette page.'
            }
        };

        /**
         * Ajoute 'subst:' aux templates spécifiés
         * @param {string} text - Le contenu de la page
         * @param {string[]} templates - Liste des templates à remplacer
         * @return {string} - Le contenu modifié
         */
        function addSubstToTemplates(text, templates) {
            return text.replace(/\{\{\s*([^|}]+)(\s*(?:\|(?:[^{}]|\{\{[^{}]*\}\})*)?)\}\}/g, (match, templateName, params) => {
                if (templates.some(template => templateName.trim().toLowerCase() === template.toLowerCase())) {
                    return `{{subst:${templateName}${params || ''}}}`;
                }
                return match;
            });
        }

        // Ajout du bouton d'action
        const button = mw.util.addPortletLink(
            'p-cactions',
            '#',
            config.messages.buttonText,
            'ca-substtemplates',
            config.messages.buttonTitle
        );

        $(button).on('click', function(e) {
            e.preventDefault();
            processPageContent();
        });

        function processPageContent() {
            if (!mw.config.get('wgUserGroups').includes('autoconfirmed')) {
                showError(config.messages.noEditRights);
                return;
            }

            const api = new mw.Api();
            const title = mw.config.get('wgPageName');

            api.get({
                action: 'query',
                prop: 'revisions',
                titles: title,
                rvprop: 'content',
                rvslots: 'main',
                formatversion: 2
            }).done(function(data) {
                const page = data.query.pages[0];
                if (!page || page.missing) {
                    showError(config.messages.pageNotFound);
                    return;
                }

                const originalContent = page.revisions[0].slots.main.content;
                const modifiedContent = addSubstToTemplates(originalContent, config.templatesToDetect);

                if (originalContent === modifiedContent) {
                    showWarning(config.messages.noTemplates);
                    return;
                }

                OO.ui.confirm(config.messages.confirmEdit).done(function(confirmed) {
                    if (confirmed) {
                        submitEdit(modifiedContent);
                    }
                });
            }).fail(showApiError);
        }

        function submitEdit(content) {
            new mw.Api().postWithEditToken({
                action: 'edit',
                title: mw.config.get('wgPageName'),
                text: content,
                summary: config.messages.editSummary,
                minor: true
            }).done(function() {
                mw.notify(config.messages.success, {
                    type: 'success',
                    tag: 'template-subst-success'
                });
                // Recharge la page pour montrer les changements
                location.reload();
            }).fail(showApiError);
        }

        function showError(message) {
            mw.notify(message, {
                type: 'error',
                tag: 'template-subst-error'
            });
        }

        function showWarning(message) {
            mw.notify(message, {
                type: 'warn',
                tag: 'template-subst-warning'
            });
        }

        function showApiError(error) {
            showError(config.messages.apiError + (error.code || error.info));
        }
    });
});