Note : après avoir enregistré vos modifications, il se peut que vous deviez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

  • Firefox / Safari : Maintenez la touche Maj (Shift) en cliquant sur le bouton Actualiser ou pressez Ctrl-F5 ou Ctrl-R (⌘-R sur un Mac) ;
  • Google Chrome : Appuyez sur Ctrl-Maj-R (⌘-Shift-R sur un Mac) ;
  • Internet Explorer : Maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5 ;
  • Opera : Allez dans Menu → Settings (Opera → Préférences sur un Mac) et ensuite à Confidentialité & sécurité → Effacer les données d'exploration → Images et fichiers en cache.
// 1111 ) Boutons supplémentaires dans le menu 'Avancé'
// 2222 ) Boutons supplémentaires dans le menu 'Avancé' permettant de modifier le texte sélectionné
// 3333 ) Remplacement 'à la volée' pour certaines lettres accentuées et autres caractères spéciaux
// 4444 ) Actions déclenchées par CTRL ou ALT + <un caractère> (BEGIN pour l'instant)
//=================================================================================================

// 1111 ///////////////////////////// Boutons supplémentaires dans le menu 'Avancé'
/**
 * Extra buttons in toolbar
 * @stats [[File:Krinkle_InsertWikiEditorButton.js]]
 */

/**
 * krInsertWikiEditorButton
 *
 * @param options {Object} An object with options:
 * - section {String} (optional) The name of the section in the WikiEditor. Defaults to 'main'
 * - group {String} (optional) The name of the group in the WikiEditor. Defaults to 'insert'
 * - id {String} (required) Unique id (ie. 'my-button')
 * - icon {String} (recommended) URL to the icon, should be square about 21 to 22px
 * - label {String} (required) Tooltip displayed when hovering button
 * - insertBefore {String} (optional) Wikitext to be inserted before the cursor on-click
 * - sampleText {String} (optional) Text inserted in place of the cursor if no text was selected
 * - insertAfter {String} (optional) Wikitext to be inserted after the cursor on-click
 * - callback {Function} (optional) Called when the button is clicked
 * - autoSummary {mixed} (optional) Null or an Object with the following properties:
 *   - summary {String} (required) Edit summary that should be used
 *   - position {String} (optional) 'append', 'prepend' or 'replace'
 *   - delimiter {String} (optional) delimiter between the (possibly) current summary and the to-be-inserted summary
 */

$.ajax({
	url: 'https://meta.wikimedia.org/w/index.php?title=User:Krinkle/Scripts/InsertWikiEditorButton.js&action=raw&ctype=text/javascript',
	dataType: 'script',
	cache: true
}).done(function () {

	// modèle lpl ; exemple : {{lpl|d=|p=|ep=Mémoires d’outre-tombe/=|l=|a=}}
	krInsertWikiEditorButton({
		section: "advanced",
		group: "insert",
		id: "mw-customeditbutton-lpl",
		icon: '//upload.wikimedia.org/wikipedia/commons/4/4e/VisualEditor_-_Icon_-_Bold_L.svg',
		label: 'Insérer {{lpl}}',
		insertBefore: '{{lpl|d=|p=|ep=Mémoires d’outre-tombe/=|l=|a=',
		insertAfter: '}}',
		sampleText: 'lien lpl',
	});

	// modèle ancre ; exemple : {{ancre|texte}}
	krInsertWikiEditorButton({
		section: "advanced",
		group: "insert",
		id: 'mw-customeditbutton-ancre',
		icon: '//upload.wikimedia.org/wikipedia/commons/4/46/VisualEditor_-_Icon_-_Bold-a.svg',
		label: 'Insérer {{ancre}}',
		insertBefore: '{{ancre|',
		insertAfter: '}}',
		sampleText: 'Happy face'
	});
});

// 2222 ///////////////////////////// Boutons supplémentaires dans le menu 'Avancé' permettant de modifier le texte sélectionné
// https://en.wikipedia.org/wiki/User:V111P/js/Templates/Textarea1.js

(function () {
	"use strict";

	// CHANGE THIS! It must be a unique id on the page, so make sure it's not something trivial either.
	var buttonId = 'chroll_lpl_button'; // the id of the toolbar button

	if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) == -1 )
		return;	 // abort if not currently editing an article
 
	mw.loader.using('jquery.textSelection'); // seems to be loaded by default, but just in case

	// This is the script that adds the toolbar button for your script above the textarea
	var addToolbarButtons_scriptUrl = '//en.wikipedia.org/w/index.php?title='
		+ 'User:V111P/js/addToolbarButtons.js&action=raw'
		+ '&ctype=text/javascript'; // [[User:V111P/js/addToolbarButtons.js]]

	// see User:V111P/js/addToolbarButtons for information on how to customize your button
	// you should at least change the icon and the tooltip
	var toolbarButtonProps = {
		id: 'chroll_lpl_button',
		tooltip: 'Test pour {{lpl|',
		section: 'advanced',
		group: 'insert',
		callback: changeTexteSel
	};

	if (mediaWiki.libs.addToolbarButtons)
		mediaWiki.libs.addToolbarButtons(toolbarButtonProps); // addToolbarButtons.js already loaded
	else {
		// When it is first loaded, addToolbarButtons.js looks in the array window.toolbarButtonsToAdd
		//  to determine which buttons to create. First we create the array if it doesn't exist, then
		//  we add our button properties to it. Then we call $.ajax to load addToolbarButtons.js
		var tbs = window.toolbarButtonsToAdd = window.toolbarButtonsToAdd || [];
		tbs.push(toolbarButtonProps);
		$.ajax( { url: addToolbarButtons_scriptUrl, dataType: 'script', cache: true } );
	}

	var textArea = $('#wpTextbox1');

	// The function called when the toolbar button is pressed.
	// The name of this function must match the value of the callback property
	//  of the toolbarButtonProps object above.
	function changeTexteSel() {
		var sel = textArea.textSelection('getSelection');
		var rempl;
		alert("TITRE:" + $("#firstHeading").html());
		// affiche ceci : Modification de Page:Chateaubriand - Mémoires d’outre-tombe t1.djvu/65
		rempl = "[[[[[" + sel + "]]]]]";
		sel = rempl;
		textArea.textSelection('encapsulateSelection', {pre: sel, replace: true});
	}

})();

// 3333 ///////////////////////////// Remplacement 'à la volée' pour certaines lettres accentuées
/*-----------------------------------------------------------------
 Remplacement à la volée de certains caractères lors de l'édition.
 Optimisé pour ce qui manque au clavier AZERTY français
 pour taper le français.
-------------------------------------------------------------------
 Auteur initial : ThomasV
 Version remaniée pour le Wiktionnaire : ArséniureDeGallium
 https://fr.wiktionary.org/wiki/MediaWiki:Gadget-specialchars.js
-----------------------------------------------------------------*/

// hookage de la fonction, sauf sur les pages en JS ou CSS
// (ce gadget serait une nuisance sur de telles pages)

//var P3 = wgTitle.substring(wgTitle.length - 3);
//var P4 = wgTitle.substring(wgTitle.length - 4);
//if((P3 != ".js") && (P4 != ".css")) addOnloadHook(SpecChar_Main);

//-----------------------------------------------------------------------
// remplacement des séquences de caractères
//-----------------------------------------------------------------------

function SpecChar_Main(){
	tb = document.getElementById("wpTextbox1");
	if(!tb)
		return;

	tb.onkeyup = function(e) {
		var key = (window.event) ? event.keyCode : e.keyCode;

		startPos = tb.selectionStart;
		endPos = tb.selectionEnd;

		if( endPos == startPos && (key >= 32 && key <= 255) ) {
			m = tb.value.substring(startPos - 2, startPos);
			m3 = tb.value.substring(startPos - 3, startPos);
			f = tb.value.substring(startPos);
			todo = true;
			i = 2;

			switch(m) { //traitement des séquences de 2 caractères
				case "<<": m="«"; break;
				case ">>": m="»"; break;

				case "$.": m="…"; break; // E2 80 A6 U+2026 ou \u2026, points de suspension
				case "$'": m="’"; break;
				case "$-": m="–"; break; // E2 80 93 U+2013 ou \u2013 demi cadratin
				case "$_": m="—"; break; // E2 80 94 U+2014 ou \u2014 cadratin
							// !!! attention la différence entre les 2 ne se voit pas à l'édition

				case "$à": m="À"; break;
				case "$é": m="É"; break;
				case "$è": m="È"; break;
				case "$ç": m="Ç"; break;
				case "$ù": m="Ù"; break;

				// A lancer à chaque édition de page NE FCT PAS				
				// case "::": fenetreTexte(); addOnloadHook(SpecChar_Main); break;

				// modèles
				case ":f": m="{{formatnum:}}"; break;
				case ":h": alert("Aide à écrire ici"); todo=false; break;
				case ":i": m="{{interligne|1em}}\n"; break;
				case ":m": m="{{||}}"; break; // pour insérer un modèle
				case ":n": m="<nowiki />"; break;
				case ":o": m="{{o}}"; break; // indice °
				case ":t": m="{{tiret||}}"; break; // tiret désormais non indispensable mais utile pour la recherche
				default: todo = false;
			}
			if(!todo) {     //traitement des séquences de 3 caractères
				m = m3; todo = true; i = 3;
				switch(m) {
					case "$oe": m = "œ"; break;
					case "$ae": m = "æ"; break;
					case "$OE": m = "Œ"; break;
					case "$AE": m = "Æ"; break;
					case "...": m = "…"; break; // id "$."
					default: todo = false;
				}
			}

			if(todo) {
				var textScroll = tb.scrollTop;
				h = tb.value.substring(0, startPos - i);
				tb.value = h + m + f;
				tb.selectionStart = startPos - i + m.length;
				tb.selectionEnd = tb.selectionStart;
				tb.scrollTop = textScroll;
			}
		}
	};
}

// 4444 ///////////////////////////// Action déclenchées par CTRL + <un caractère>
//
// Ce qui suit vient de : Utilisateur:Pyb/common.js
// ne fonctionne pas bien à cause des raccourcis Firefox
//

/**********************************************************/
/* shortcuts   */
/* Sources
/* http://darkoneko.wordpress.com/2009/11/01/personnalisons-wikipedia-ajouter-des-raccourcis-clavier/ */
/* LIEN MORT http://www.lyxia.org/blog/developpement/javascriptajax/raccourcis-claviers-en-javascript-214 */
/* http://keycode.info/ pour voir tous les codes de touches
/**********************************************************/

function keyboardShortcuts() {

	var isCtrl = false;
	var isAlt = false;
	var isAltGr = false;
	var is2pts = false;

	/* A CREUSER : var wikEdConfig = {}; wikEdConfig.buttonKey = { 26: [] // clear the existing interfering 'b' button definition	};*/
	// pour avoir les codes de touches :
	//   https://keycode.info
	//   https://css-tricks.com/snippets/javascript/javascript-keycodes/	
	document.onkeyup = function(e) { // l'utilisateur relâche la touche ctrl. La variable passe à False
		if(e.which == 17) {
			isCtrl = false;
		}
		else if(e.which == 18) {
			isAlt = false;
		}
		else if(e.which == 225) {
			isAltGr = false;
		}
	};

	document.onkeydown = function(e) { // l'utilisateur appuie sur la touche ctrl. La variable passe à True
		if(e.which == 17) { 
			isCtrl = true; // false true
			return;
		}
		else if(e.which == 18) { 
			isAlt = true;
			return;
		}
		else if(e.which == 58) {  // ':'
			is2pts = true;
			return;
		}
		else if(e.which == 225) { 
			isAltGr = true;
			return;
		}

		//gestion des CTRL + lettre que l'on veux ajouter.
		if( isCtrl === true ) {
			isCtrl = false; // avec CTRL et ALT gérées (pas appuyées simultanément) la variable reste à true, ceci permet de débloquer la situation
			switch (e.which) { //quelle touche a été enfoncée ?
				case 66: //b bold
					insertTags("[CtrlB", "]", '');
					return false;
				case 69: //e exposant
					insertTags("[CtrlE", "]", '');
					return false;
				case 71: //g guillemets
					insertTags("[CtrlG", "]", '');
				 	return false;
				case 73: //i italique
					insertTags("[CtrlI", "]", '');
					return false;
				case 78: //n alinéa négatif ==> RESERVE
					insertTags("[CtrlN", "]", '');
					return false;
			}
		}

		//gestion des ALT + lettre que l'on veux ajouter.
		else if( isAlt === true ) {
			isAlt = false; // voir au-dessus pour isCtrl
			switch (e.which) { //quelle touche a été enfoncée ?
				case 66: //b
					insertTags("[AltB", "]", '');
					return false;
				case 69: //e
					insertTags("[AltE", "]", '');
					return false;
				case 70: //f NE FCT PAS (raccourcis Firefox)
					insertTags("{{formatnum:", "}}", '');
					return false;
				case 71: //g
					insertTags("[AltG", "]", '');
				 	return false;
				case 73: //i
					insertTags("[AltI", "]", '');
					return false;
				case 78: //n
					insertTags("[AltN", "]", '');
					return false;
				case 79: //o ° de numero, in 8°, ...
					selRempl("{{o}}");
					return false;
				case 87: //w
					fenetreTexte();
					addOnloadHook(SpecChar_Main);
					return false;
			}
		}
		//gestion des ALT Gr + lettre que l'on veux ajouter.
		else if( isAltGr === true ) {
			isAltGr = false; // voir au-dessus pour isCtrl
			switch (e.which) { //quelle touche a été enfoncée ?
				case 70: //f
					insertTags("{{formatnum:", "}}", '');
					return false;
			}
		}
		else if( is2pts === true ) {
			is2pts = false; // voir au-dessus pour isCtrl
			switch (e.which) { //quelle touche a été enfoncée ?
				case 70: //f
					insertTags("{{forMATnum:", "}}", '');
					return false;
			}
		}
	};

	return true;
}

function selRempl(ch_remplacement) { //  ICICICI
	var ok = true;
	var page;
	var deb = $('#wpTextbox1').prop("selectionStart");
	var fin = $('#wpTextbox1').prop("selectionEnd");

	if(deb == fin) {
		alert("selRmpl: aucun texte n'est sélectionné");
		ok = false;
	}
	else {
		page = wpTextbox1.value; // .value donne la page complète, .value.substring(deb, fin); donne le texte sélectionné 
		var nouv = page.substring(0, deb) + ch_remplacement + page.substring(fin, page.length);
		wpTextbox1.value = nouv;
	}
	return ok;
}
 
/*
function main_didasc(str){
  var toinsert1="{{didascalie|";
  var toinsert2="}}";
  var start = $('#wpTextbox1').prop("selectionStart");
  var end = $('#wpTextbox1').prop("selectionEnd");
  // chargement du texte original dans une variable de travail wstr
  sel=str.substring(start,end);
  //wstr=str.substring(0,start)+toinsert+str.substring(end,str.length);
  wstr=str.substring(0,start)+toinsert1+sel+toinsert2+str.substring(end,str.length);
  return wstr;
}

function didasc() {
    var txt = document.editform.wpTextbox1;
    var start = $('#wpTextbox1').prop("selectionStart");
    var end = $('#wpTextbox1').prop("selectionEnd");
    txt.value = main_didasc(txt.value);
    pos = parseInt(start) + 15 + parseInt(end) - parseInt(start);
	$('#wpTextbox1').focus();
    $('#wpTextbox1').prop("selectionStart",pos);
    $('#wpTextbox1').prop("selectionEnd",pos);
    
}

*/

function fenetreTexte() {
	// la plupart du temps, le fenêtre subit un décalage dès qu'on la sélectionne
	// quelque soient les paramètres 'height' et 'rows'
	$('.wikiEditor-ui-view').offset({top : 150}); // OK
	$('#wpTextbox1').attr({style : 'height: 599px;', rows : 35}); // OK
}

// la fonction qui gère tous les appels de fonctions (du moins dans mes divers billets :)
//!\ CELA VEUX DIRE QU'IL FAUT FUSIONNER AVEC LA FONCTION main() EXISTANTE, SI VOUS EN AVEZ UNE /!\

function main() {
	// [...  autres fonctions  ... ]
	var P3 = wgTitle.substring(wgTitle.length - 3);
	var P4 = wgTitle.substring(wgTitle.length - 4);

	if (wgAction == "edit" || wgAction == "submit")  { //à n'appeller que si en mode edition, sinon c'est inutile
		keyboardShortcuts();
		if((P3 != ".js") && (P4 != ".css")) 
			SpecChar_Main();
	}
}

$(document).ready(function(){
	addOnloadHook(main);
});