MediaWiki:Gadget-Toolbar2017.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) ;
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