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> */