Utilisateur:Od1n/BoutonsHelpers.js
Apparence
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.// <nowiki>
function BoutonsHelpers($) {
'use strict';
//--------------------------------------------------------------------------
// Bricolage pour avoir un dialog en position fixed :\
//--------------------------------------------------------------------------
function fixedDialog($element, options) {
var immutableOptions = {
autoOpen: false,
dragStop: function (event, ui) {
var $this = $(this);
$this.dialog('option', 'position', [ui.position.left, ui.position.top]);
$this.data('savePosition', [ui.position.left, ui.position.top]);
},
resizeStop: function (event, ui) {
var $this = $(this);
var $doc = $(document);
var scrollLeft = $doc.scrollLeft();
var scrollTop = $doc.scrollTop();
// l'ordre de ces 2 lignes est important :
$this.dialog('option', 'position', [ui.position.left - scrollLeft * 2, ui.position.top - scrollTop * 2]);
$this.parent().css('position', 'fixed');
$this.data('savePosition', [ui.position.left - scrollLeft, ui.position.top - scrollTop]);
},
close: function () {
var $this = $(this);
var savePosition = $this.data('savePosition');
if (savePosition) {
$this.dialog('option', 'position', savePosition);
}
}
};
options = options || {};
var dialogOptions = Object.assign({}, options, immutableOptions);
$element.dialog(dialogOptions);
// l'ordre de ces 2 lignes est important :
$element.parent().css('position', 'fixed');
$element.dialog('open');
}
//--------------------------------------------------------------------------
// Fonctions utilitaires
//--------------------------------------------------------------------------
function toggleDialog($dialog) {
$dialog.dialog($dialog.dialog('isOpen') ? 'close' : 'open');
}
function ucFirst(string) {
return string.charAt(0).toUpperCase() + string.slice(1);
}
//--------------------------------------------------------------------------
// Fabriques
//--------------------------------------------------------------------------
function contentFactory(callback) {
var $entree = $('<input type="text" style="box-sizing:border-box; width:100%">');
var $sortie = $('<input type="text" style="box-sizing:border-box; width:100%">');
var elmEntree = $entree[0];
var elmSortie = $sortie[0];
// cf. http://help.dottoro.com/ljhxklln.php
$entree.on('input', function () {
var result = callback(elmEntree.value.trim());
elmSortie.value = (result || 'input non supporté');
});
return $('<div></div>').append($entree, '<br><br>', $sortie);
}
function buttonFactory(params) {
var $button, $dialog;
function initDialog() {
$dialog = contentFactory(params.callback);
fixedDialog($dialog, {
title: params.titreDialog,
width: params.largeur
});
$button.click(function () {
toggleDialog($dialog);
});
}
$button = $('<button type="button">' + params.titreBouton + '</button>');
$button.one('click', function () {
var dependencies = ['jquery.ui'];
if (params.extraDependencies) {
dependencies.concat(params.extraDependencies);
}
mw.loader.using(dependencies, initDialog); // rappel : le chargement est asynchrone
});
return $button;
}
//--------------------------------------------------------------------------
// Création et insertion DOM de nos boutons
//--------------------------------------------------------------------------
var boutonFullurl = buttonFactory({
titreBouton: 'fullurl',
titreDialog: 'Conversion URL brute vers {{fullurl:}}',
largeur: 340,
extraDependencies: 'mediawiki.util',
callback: function (input) {
var titre = mw.util.getParamValue('title', input);
if (!titre) { return; }
titre = titre.replaceAll('_', ' ');
var debutURL = /^(?:(?:https?:)?\/\/)?([a-z]+)\.wikipedia\.org\/w\/index\.php\?/.exec(input);
if (!debutURL) { return; }
var prefix = (debutURL[1] === 'fr' ? '' : debutURL[1] + ':');
var paramsGetSansTitle = input
.replace(debutURL[0], '')
.replace(/^title=[^&]*&?/, '')
.replace(/&title=[^&]*/, '');
var params = decodeURIComponent(paramsGetSansTitle)
.replaceAll('"', '%22')
.replaceAll('[', '%5B')
.replaceAll(']', '%5D');
return '{{fullurl:' + prefix + titre + '|' + params + '}}';
}
});
var boutonLienModele = buttonFactory({
titreBouton: 'lien modèle',
titreDialog: 'Lien modèle pour résumé de modification',
largeur: 340,
callback: function (input) {
var nomModele = input
.replace(/^\{\{(.+)\}\}$/, '$1')
.replace(/\|.*/, '')
.replace(/^ *(?:Modèle|Template) *: */i, '')
.trim();
return '[[Modèle:' + ucFirst(nomModele) + '|{{' + nomModele + '}}]]';
}
});
var boutonSpecialDiff = buttonFactory({
titreBouton: 'spécial:diff',
titreDialog: 'Lien [[Spécial:Diff]]',
largeur: 340,
extraDependencies: 'mediawiki.util',
callback: function (input) {
if (/^(\d+\/)?\d+$/.test(input)) { // "42" ou "41/42"
return '[[Spécial:Diff/' + input + '|' + input + ']]';
}
if (/^(https?:)?\/\//.test(input)) { // URL entière ; refs [[mw:Manual:Parameters to index.php#View and render]]
var diff = mw.util.getParamValue('diff', input);
var oldid = mw.util.getParamValue('oldid', input);
if (!diff) { return; }
if (oldid && /^\d+$/.test(oldid)) { // oldid est un entier > 0
if (diff === 'prev') { // &diff=prev&oldid=42 ; on génère le wikicode pour "&diff=42" car c'est plus court
return '[[Spécial:Diff/' + oldid + '|' + oldid + ']]';
}
if (/^\d+$/.test(diff) || diff === 'next' || diff === 'cur') { // &diff=42/next/cur&oldid=41
return '[[Spécial:Diff/' + oldid + '/' + diff + '|' + oldid + '/' + diff + ']]';
}
} else {
if (/^\d+$/.test(diff)) { // &diff=42
return '[[Spécial:Diff/' + diff + '|' + diff + ']]';
}
}
}
}
});
$('#editform').find('.editButtons').append(boutonFullurl, boutonLienModele, boutonSpecialDiff);
}
{
let wgAction = mw.config.get('wgAction');
if (wgAction === 'edit' || wgAction === 'submit') {
$(BoutonsHelpers);
}
}
// </nowiki>