User:Seb35/common.js

importScriptURI("//www.mediawiki.org/w/index.php?title=User:Magnus_Manske/wikipic.js&action=raw&ctype=text/javascript");

/* Workaround some bug on my account in the count of the new messages whose minimum is 1 */ $( function { var r = /^(.*) \((\d*)\)$/.exec( $('#pt-newmessages').text );  if( r == null ) r = [ $('#pt-newmessages').text, $('#pt-newmessages').text, '0' ];  if( r[2] == '1' ) $('#pt-newmessages a').text( r[1] );  else $('#pt-newmessages a').text( r[1] + ' (' + (parseInt(r[2])-1) + ')' ); } );

/** * MultiNexus * (Latin : plusieurs liens / many links) * * Auteur : Seb35 * Version : 2.0 * Date : 2014-01-01 * * Note : en cours de test par moi-même (2014-01-01), je demanderai à la gadgétiser si tout fonctionne bien quelque temps * Note: in testing by myself (2014-01-01), I will ask some gadgetisation in some time if all works correctly * * Ce gadget permet d’ajouter de nombreux liens regroupés en items déroulants dans les menus de navigation, configurés par l’utilisateur. * Configuration en cliquant sur le lien MultiNexus dans la boîte à outils sur votre page utilisateur * Pour plus d’informations, voir fr:Utilisateur:Seb35/Scripts * * This gadget permits the addition of many links groupped by rolling items in the sidebar, configured by the user. * Configuration by clicking on the link MultiNexus in the toolbox on your user page * For futher informations, please see fr:Utilisateur:Seb35/Scripts */

// Dépendances : JQuery, JQuery UI Dialog, objets MediaWiki mw.loader.using( 'jquery.ui.dialog' );

$( function {	// For your wiki language, please translate the month names in your language if your want to be able to use the #time function in this script	var months = [ 'janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre' ];	var genmonths = months; // these are genitive forms; if your language need it, please translate it also if needed	/*.-ˉ-_-ˉ-_-ˉ-_-ˉ-_+	 D     Code       S	 *././././././././.*/	// Variables externes : $, mw	// Variables internes : months, genmonths, config, defaultConfig, timer, html, htmlise, timeParserFunction, installLive, installConfigLink	var config,		defaultConfig = { enable: true, time: 300, pages: {	'p-navigation': [		  [ 'Log', 'Special:Log' ],		  [ 'Patrol', [		    'RC',        'Special:Recentchanges',		    'New pages', 'Special:Newpages' ] ] ] }		},		timer,		html,		htmlise = function( pages ) { // Crée le code HTML pour chaque menu // Variables externes : mw, $ // Variables internes : pages, i, j, m, menu, html, proto, link var i, j, m, menu, html = {}, proto = RegExp( '^(' + mw.config.get('wgUrlProtocols') + ')' ), link = function(l,t,c) { return '' + t + ''; };			if( !$.isPlainObject(pages) ) return null; for( m in pages ) { // Pour chaque menu menu = pages[m]; html[m] = ''; for( i = 0; i' + menu[i][0] + ' '; for( j = 0; j'; }				}			}			return html; },		timeParserFunction = function( text ) { // Émule partiellement la fonction parser #time // Variables externes : months, genmonths // Variables internes : text, timeExpr var timeExpr = RegExp( '{{#time:([^\\|}]*)(?:\\| *([-\\+a-z0-9]*))? *}}', 'g' ); return text.replace( timeExpr, function( expr0, expr1, expr2 ) {				// Variables externes : months, genmonths				// Variables internes : expr0, expr1, expr2, s, to, res, i, e, t, sp, pad, replaces				var s, to, res, i, e,					t = new Date,					sp = function( n ) { var i, r = ; for( i=0; i<n; i++ ) r += ' '; return r; },					pad = function( a ) { return a<10 ? '0'+a : +a; };				// Obtenir la date demandée				expr2 = (expr2 || ).replace( /now */,  );				if( !expr2 );				else if( s =   /-(\d*) *days?/.exec(expr2) ) t = new Date( t.getTime-86400000*parseInt(s[1]) );				else if( s =  /\+?(\d*) *days?/.exec(expr2) ) t = new Date( t.getTime+86400000*parseInt(s[1]) );				else if( s =    /-(\d*) *hours?/.exec(expr2) ) t = new Date( t.getTime-3600000*parseInt(s[1]) );				else if( s =  /\+?(\d*) *hours?/.exec(expr2) ) t = new Date( t.getTime+3600000*parseInt(s[1]) );				else if( s =    /-(\d*) *minutes?/.exec(expr2) ) t = new Date( t.getTime-60000*parseInt(s[1]) ); else if( s = /\+?(\d*) *minutes?/.exec(expr2) ) t = new Date( t.getTime+60000*parseInt(s[1]) ); else if( s =    /-(\d*) *seconds?/.exec(expr2) ) t = new Date( t.getTime-1000*parseInt(s[1]) ); else if( s =  /\+?(\d*) *seconds?/.exec(expr2) ) t = new Date( t.getTime+1000*parseInt(s[1]) ); else if( !isNaN(Date.parse(expr2)) ) t = new Date( Date.parse(expr2) ); // Liste des remplacements possibles, ordonnés pour tenir compte des ordres de remplacement to = pad(Math.floor(Math.abs(t.getTimezoneOffset/60)))+pad(Math.abs(t.getTimezoneOffset)-60*Math.floor(Math.abs(t.getTimezoneOffset/60))) var replaces = [ { 'xg': genmonths[t.getMonth] }, { 'Y': t.getFullYear, 'y': String(t.getFullYear).substr(2), 'L': (t.getFullYear%4==0 && t.getFullYear%100!=0 || t.getFullYear%400==0 ? 1 : 0), 'n': t.getMonth+1, 'm': pad(t.getMonth+1), 'F': months[t.getMonth], 'j': t.getDate, 'd': pad(t.getDate), 'a': (t.getHours<12 ? 'am' : 'pm'), 'A': (t.getHours<12 ? 'AM' : 'PM'), 'g': (t.getHours-1)%12+1, 'h': pad((t.getHours-1)%12+1), 'G': t.getHours, 'H': pad(t.getHours), 'i': t.getMinutes, 's': pad(t.getMinutes), 'U': t.getTime, '0': (t.getTimezoneOffset<=0?'+':'-')+to, 'P': (t.getTimezoneOffset<=0?'+':'-')+to.substr(0,2)+':'+to.substr(2), 'Z': t.getTimezoneOffset, 'Z': t.toISOString.substr(0,19)+'+00:00' } ]; // Remplacements effectifs ; la conservation de expr1 et le calcul en parallèle des deux variables // permet de ne pas faire « trop » de remplacements (en remplaçant des caractères du résultat) res = expr1; for( i=0; i<replaces.length; i++ ) { for( e in replaces[i] ) { expr1 = expr1.replace( RegExp(e,'g'), function(s,j) {							res = res.substr(0,j) + replaces[i][s] + res.substr(j+s.length);							return sp(String(replaces[i][s]).length);						} ); }				}				return res; } );		},		installLive = function( html ) {			// Installer les menus			// Variables externes : $, timer, config, timeParserFunction			// Variables internes : html, m			// Retirer les items existants le cas échéant			$( '.multinexus-menu' ).remove;			// Installer les menus			for( m in html )				$( '#' + m + ' ul' ).append( timeParserFunction( html[m] ) );			// Installer les événements			$( 'a.collapsable-menu' ).click( function { clearTimeout( timer ); $(this).parent.find('div').toggleClass( 'multinexus-hidden' ); }).mouseenter( function { if( $(this).parent.find('div').hasClass( 'multinexus-hidden' ) ) timer = setTimeout( function(e) { $(e).parent.find('div').removeClass( 'multinexus-hidden' ); }, (config.time || 300), this ); }).mouseleave( function { clearTimeout( timer ); });		},		installConfigLink = function {			// Sur la page de l’utilisateur, installer un lien de configuration			// Variables externes : $, mw, config, defaultConfig, installLive			// Variables internes : e			var e;			// N’ajouter le lien que si le navigateur supporte localStorage			if( typeof localStorage != 'undefined' && mw.config.get('wgNamespaceNumber') == 2 && mw.config.get('wgTitle') == mw.config.get('wgUserName') ) {				// Ajout du lien dans la boîte d’outils				$('#p-tb ul').append( $(' ').wrapInner( $( 'MultiNexus' ).click( function { // Lorsqu’on clique sur le lien, ouvrir la boîte de dialogue de configuration config = JSON.parse( localStorage.getItem('gdmwMultiNexus') ) || defaultConfig; delete config['@cache']; $('body').append( ' ' + (JSON.stringify(config)||defaultConfig) + ' ' ); $('#multinexusconfig').focus( function { $('#multinexus').parent.find('button').css('background','linear-gradient(to bottom, #FFFFFF 0px, #DDDDDD 90%) !important'); } ); $('#multinexus').dialog( { title: 'MultiNexus', minWidth: 600, closeOnEscape: false, buttons: [ { text: 'Ok', click: function {						// Lorsqu’on enregistre : vérifier la configuration entrée (refuser en cas de problème de syntaxe) et mettre en œuvre le résultat						if( !$('#multinexusconfig').val ) localStorage.removeItem('gdmwMultiNexus');						else {							try {								config = JSON.parse($('#multinexusconfig').val);							}							catch(e) {								$(this).parent.find('button').css('background','linear-gradient(to bottom, #FFFFFF 0px, #FF0000 90%) transparent !important');								return false;							}							config['@cache'] = htmlise( config.pages );							if( !config['@cache'] ) config.enable = false;							else installLive( config['@cache'] );							localStorage.setItem( 'gdmwMultiNexus', JSON.stringify(config) );						}						$( this ).dialog( 'destroy' );						$('#multinexus').remove; } } ] } );				} ) ) );			}		};	// Ajouter le CSS mw.util.addCSS( '.multinexus-hidden { display: none; }' );

// Chercher et lire la configuration config = (typeof localStorage != 'undefined' && JSON.parse(localStorage.getItem('gdmwMultiNexus'))) || (typeof gdmwMultiNexus != 'undefined' && gdmwMultiNexus) || defaultConfig; // Ajouter le possible lien vers la configuration if( typeof installConfigLink != 'undefined' ) installConfigLink; // Quitter en cas d’erreur ou de non-activation if( !$.isPlainObject(config) || $.isEmpty(config) || !config.enable || !$.isPlainObject(config.pages) || $.isEmpty(config.pages) ) return; // Obtenir le HTML html = config['@cache'] || htmlise( config.pages ); // Mettre en place le HTML installLive( html ); } );