Utilisateur:Od1n/iRef.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) ;
Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.//
// Gadget obsolète depuis la résolution de https://phabricator.wikimedia.org/T7984
//
/*
***************************************************************************
** iRef - Affiche les références lors de la prévisualisation même si elles
** ne sont pas présentes dans la section éditée
** Compatibilité : MediaWiki, testé avec monobook et vector
** Support : Discussion Projet:JavaScript/Rapport de bug
** Auteurs : Arkanosis, Od1n & The RedBurn
** Licence : MIT
**
** <!--{{Catégorisation JS|IRef}}-->
*/
/*global mw, $, iRef, qPreview */
/*jslint browser: true, vars: true, plusplus: true */
if ((mw.config.get('wgAction') === 'edit' || mw.config.get('wgAction') === 'submit') && typeof iRef === 'undefined') {
window.iRef = (function () {
'use strict';
var textBox;
var earlyDone;
function cleanMark() {
var position = textBox.scrollTop;
textBox.value = textBox.value
.replace(/\r\n/g, '\n') // IE 6-8
.replace(/\n<!--\[iRef\]-->[\s\S]*<!--\[\/iRef\]-->\n/, '');
textBox.scrollTop = position;
}
function getGroups(source) {
/*jslint regexp: true, continue: true */
var refs = source.match(/<ref [^>]+>/g);
if (!refs) {
return [];
}
var groups = [];
var i, l, attrib;
for (i = 0, l = refs.length; i < l; i++) {
// valeur d'attribut entre double quotes
attrib = /group *= *"([^"]+)"/.exec(refs[i]);
if (attrib && $.inArray(attrib[1], groups) === -1) {
groups.push(attrib[1]);
continue;
}
// valeur d'attribut non encadrée de quotes
attrib = /group *= *([^" >]+)/.exec(refs[i]);
if (attrib && $.inArray(attrib[1], groups) === -1) {
groups.push(attrib[1]);
}
}
return groups;
}
function buildMark(groups) {
var mark = '\n<!--[iRef]-->== <span style="color:red">Références automatiques</span> ==\n<references />';
var i, l;
for (i = 0, l = groups.length; i < l; i++) {
mark += "\n'''groupe « " + groups[i] + " » :'''\n<references group=\"" + groups[i] + '" />';
}
mark += '<!--[/iRef]-->\n';
return mark;
}
function iRefPreview() {
var source = textBox.value;
if (source.indexOf('<ref') === -1) {
return;
}
// Firefox réinitialise la position quand un textarea.value est modifié
var position = textBox.scrollTop;
source = source.replace(/\r\n/g, '\n').replace(/\n+$/, '') + '\n';
textBox.value = source + buildMark(getGroups(source));
textBox.scrollTop = position;
}
function earlyClean() {
textBox = document.getElementById('wpTextbox1');
if (textBox) {
cleanMark();
earlyDone = true;
}
}
function init($) {
if (!earlyDone) {
textBox = document.getElementById('wpTextbox1');
cleanMark(); // il faut toujours purger au chargement, pour le mode non ajax
}
// compatibilité avec l'aperçu rapide : https://git.wikimedia.org/blob/mediawiki%2Fcore.git/HEAD/resources%2Fsrc%2Fmediawiki.action%2Fmediawiki.action.edit.preview.js
if (mw.user.options.get('uselivepreview')) {
// pour déclarer (et donc exécuter) notre 3. après le 2. du preview.js
mw.loader.using('mediawiki.action.edit.preview', function () {
// 1. est toujours exécuté en premier car plus ciblé que les $(document.body).on('click'...)
$('#wpPreview').click(iRefPreview);
// 2. déclenchement aperçu rapide
// dans le preview.js : $(document.body).on('click'... doLivePreview)
// 3. nettoyage immédiat, sans même attendre le résultat ajax
$(document.body).on('click', '#wpPreview', cleanMark);
});
} else {
$('#wpPreview').click(iRefPreview);
}
// compatibilité avec [[MediaWiki:Gadget-QPreview.js]]
// conçu pour fonctionner même si QPreview est chargé plus tard
$('#editform div.editButtons').one('focus', '#btnQPreview', function () {
$(this)
.removeAttr('onclick')
.click(function () {
iRefPreview();
qPreview();
cleanMark();
});
});
// Firefox remet le marqueur iRef lorsque l'on fait "page précédente" après un aperçu non-ajax
// dans ce cas de figure, le javascript n'est pas exécuté à nouveau
// on supprime le marqueur lors de l'enregistrement, à défaut de pouvoir le supprimer du textarea
if (!mw.user.options.get('uselivepreview')) {
$('#wpSave').click(cleanMark);
}
}
return {
earlyClean: earlyClean,
init: init
};
})();
iRef.earlyClean();
$(document).ready(iRef.init);
}