Aller au contenu

MediaWiki:Gadget-Toolbar2017.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.
/*jshint strict:false*/
/**
 * Adaptation de MediaWiki:Gadget-MonobookToolbar.js pour fonctionner avec l'éditeur de wikicode 2017
 * 
 */
 
if ( typeof window.gadgetToolbar2017 === 'undefined' ) {  // Test anti-double inclusion
	
	var gadgetToolbar2017 = {
		'buttons' : [],
		'fonctions' : {},
		'toolbarId' : 'gadgetToolbar2017',
		'contentSelector' : '#content',
		'textareaSelector' : '.ve-ce-documentNode',
		'timeout' : 250
	};
	window.gadgetToolbar2017 = gadgetToolbar2017;
	
	console.log( 'création objet gadgetToolbar2017' );
	console.log( 'MonobookToolbar', typeof MonobookToolbar );
	
	gadgetToolbar2017.fonctions.Init = function( $ ) {
		console.log( 'init' );
		console.log( mw.user.options.get( 'visualeditor-newwikitext' ) );
		if ( mw.user.options.get( 'visualeditor-newwikitext' ) !== '1' ) {
			console.log( 'exit Init' );
			return;
		}
	
		console.log( '$toolbar' );
		var $toolbar = $( '<div>' );
		$toolbar.attr( 'id', gadgetToolbar2017.toolbarId );
		$( gadgetToolbar2017.contentSelector ).prepend( $toolbar );
		console.log( 'toolbar créée' );
		if ( typeof gadgetToolbar2017_UserCustom === 'function' ) {
			gadgetToolbar2017_UserCustom();
		}
		gadgetToolbar2017.fonctions.InitButtons();
	};
	
	gadgetToolbar2017.fonctions.InitButtons = function () {
		console.log( 'InitButtons' );
		var a;
		for ( a = 0; a < gadgetToolbar2017.buttons.length; a++ ) {
			gadgetToolbar2017.fonctions.InsertButton( a );
		}
		if ( typeof MonobookToolbar === "object" ) {
			for ( a = 0; a < MonobookToolbar.buttons.length; a++ ) {
				gadgetToolbar2017.fonctions.InsertButton( a, MonobookToolbar );
			}
		}
	};
	
	gadgetToolbar2017.fonctions.InsertButton = function ( index, old ) {
		var parent = document.getElementById(gadgetToolbar2017.toolbarId);
		var item = gadgetToolbar2017.buttons[ index ];
		if ( old ) {
			item = old.buttons[ index ];
		}
		if ( !parent || !item ) {
			console.log( 'Button exit' );
			return false;
		}
		if ( item.imageId ) {
			var oldImage = document.getElementById( item.imageId );
			if ( oldImage ) {
				oldImage.parentNode.removeChild( oldImage );
			}
		}
		var image = document.createElement( 'img' );
		image.width = 23;
		image.height = 22;
		if ( item.imageId ) {
			image.id = item.imageId;
		}
		image.src = item.imageFile;
		image.border = 0;
		image.alt = item.speedTip;
		image.className = "mw-toolbar-editbutton";
		image.title = item.speedTip;
		image.onclick = function () {
			gadgetToolbar2017.fonctions.insertTags( item.tagOpen, item.tagClose, item.sampleText );
			return false;
		};
		parent.appendChild( image );
		return true;
	};
	
	gadgetToolbar2017.fonctions.insertTags = function( tagOpen, tagClose, sampleText ) {
		console.log( 'insertTags' );
		var txtarea = $( gadgetToolbar2017.textareaSelector )[0];
		if ( !txtarea ) {
			console.log( 'exit insertTags' );
			return;
		}
		txtarea.focus();
		
		var endPos,
			sel = window.getSelection(),
			range = sel.getRangeAt(0);
		
		// setText ajoute text à node entre position et position2
		function setText( node, text, position, position2 ) {
			position2 = position2 || position;
			var nV = node.nodeValue;
			if ( nV ) {
				node.nodeValue = nV.substr( 0, position ) + text + nV.substr( position2) ;
			} else {
				node.appendChild( document.createTextNode( text ) );
			}  
		}
		// setPos repositionne le curseur, avec une timeout de 200 ms pour laisser à l'éditeur le temps de prendre en compte les opération précédentes
		function setPos( node, position ) {
			var tempRange = document.createRange();
			if ( node.nodeType === 1 ) {
				for ( i = 0; i < node.childNodes.length; i++ ) {
					if ( node.childNodes[i].nodeType === 3 ) {
						node = node.childNodes[i];
						position = position - 1;
						break;
					}
				}
			}
			console.log( node.nodeType, position );
			tempRange.setStart( node, position );
			tempRange.collapse(true);
			setTimeout( function() {
				sel.removeAllRanges();
				sel.addRange( tempRange );
			}, gadgetToolbar2017.timeout );
		}
		
		if ( range.collapsed ) {
			// pas de sélection
			console.log( 'pas de sélection' );
			endPos = range.endOffset + tagOpen.length + tagClose.length + sampleText.length;
			setText( range.startContainer, tagOpen + sampleText + tagClose, range.startOffset );
			setPos( range.startContainer, endPos );
		} else if ( range.startContainer.isSameNode( range.endContainer ) ) {
			// sélection sur une seule ligne
			console.log( 'une ligne' );
			endPos = range.endOffset + tagOpen.length + tagClose.length;
			setText( range.endContainer, tagOpen + range.toString() + tagClose, range.startOffset, range.endOffset );
			setPos( range.endContainer, endPos );
		} else if ( sel.focusNode.isSameNode( range.endContainer ) ) {  
			// sélection sur plusieurs ligne, avec la fin de la sélection arpès le début
			console.log( 'sélection avant' );
			var endRangeElement = range.endContainer,
				endRangePosistion = range.endOffset;
			setText( range.startContainer, tagOpen, range.startOffset );
			setTimeout( function () {
				sel.collapseToEnd();
				setTimeout( function() {
					setText( endRangeElement, tagClose, endRangePosistion );
					setPos( endRangeElement, endRangePosistion + tagClose.length );
				}, gadgetToolbar2017.timeout );   
			}, gadgetToolbar2017.timeout );
		} else {
			// sélection sur plusieurs ligne, avec la fin de la sélection avant le début
			console.log( 'sélection arrière' );
			var startRangeElement = range.startContainer,
				startRangePosistion = range.startOffset;
			setText( range.endContainer, tagClose, range.endOffset );
			setTimeout( function () {
				sel.collapseToStart();
				setTimeout( function() {
					setText( startRangeElement, tagOpen, startRangePosistion );
					setPos( startRangeElement, startRangePosistion + tagOpen.length );
				}, gadgetToolbar2017.timeout );   
			}, gadgetToolbar2017.timeout );
		}
		
		// fonction pour le moment inutilisée, mais qui devrait être utile pur améliorer le gadget
		function checkSelectedText() {
			if ( !selText ) {
				selText = sampleText;
				isSample = true;
			} else if ( selText.charAt( selText.length - 1 ) == ' ' ) { //exclude ending space char
				selText = selText.substring( 0, selText.length - 1 );
				tagClose += ' ';
			}
		}
	};
	
	gadgetToolbar2017.fonctions.CreateButton = function( imageFile, speedTip, tagOpen, tagClose, sampleText, imageId ) {
		var NewIndex = gadgetToolbar2017.buttons.length;
		gadgetToolbar2017.buttons[ NewIndex ] = {
			'imageId': imageId,
			'imageFile': imageFile,
			'speedTip': speedTip,
			'tagOpen': tagOpen,
			'tagClose': tagClose,
			'sampleText': sampleText
		};
		if ( document.getElementById( gadgetToolbar2017.toolbarId ) ) {
			if ( imageId ) {
				gadgetToolbar2017.fonctions.InsertButton( NewIndex );
			}
		}
	};
	
	/* le lancement de la fonction est retardé car mw.user.options.get( 'visualeditor-newwikitext' ) 
		n'est pas toujours immédiatement disponible (sans doute parceque fonction béta), 
		et qu'il n'y a aucune urgence à initialisé. */
	$( function() { setTimeout( window.gadgetToolbar2017.fonctions.Init, 1000, $ ); } );

}  // Fin test anti-double inclusion