MediaWiki:Gadget-cambusa.js

Versione del 19 ott 2017 alle 08:26 di Rotpunkt (discussione | contributi) (aggiornato extraPages)

Questa pagina definisce alcuni parametri di aspetto e comportamento generale di tutte le pagine. Per personalizzarli vedi Aiuto:Stile utente.


Nota: dopo aver salvato è necessario pulire la cache del proprio browser per vedere i cambiamenti (per le pagine globali è comunque necessario attendere qualche minuto). Per Mozilla / Firefox / Safari: fare clic su Ricarica tenendo premuto il tasto delle maiuscole, oppure premere Ctrl-F5 o Ctrl-R (Command-R su Mac); per Chrome: premere Ctrl-Shift-R (Command-Shift-R su un Mac); per Konqueror: premere il pulsante Ricarica o il tasto F5; per Opera può essere necessario svuotare completamente la cache dal menù Strumenti → Preferenze; per Internet Explorer: mantenere premuto il tasto Ctrl mentre si preme il pulsante Aggiorna o premere Ctrl-F5.

/**
 * Gadget-cambusa.js
 * Aggiunge il link "cambusa" a ogni discussione della pagina, per effettuare
 * lo spostamento della discussione, usando i template cambusa e cambusada.
 *
 * @author [[it:User:Rotpunkt]]
 */
/*jshint unused: false */
/*global mediaWiki, jQuery  */

( function ( mw, $ ) {
	'use strict';

	var inited = false,
		// Le pagine di partenza e destinazione per la cambusa
		// possono appartenere solo ai namespace di discussione,
		// più le pagine qui di seguito configurate:
		extraPages = {
			4: [ 'Officina', 'Oracolo' ],
			12: [ 'Sportello informazioni' ]
		},
		api, $dialog, $alert, $namespace;

	/**
	 * Alert in jQuery UI.
	 */
	function alert( msg, spinner ) {
		if ( !$alert ) {
			$alert = $( '<div>' ).attr( 'id', 'gc-dialog-alert' ).appendTo( 'body' );
		}
		$alert.empty().append( $( '<p>' ).text( msg ) );
		if ( spinner ) {
			$alert.append( '<br/>', $.createSpinner( { size: 'large', type: 'block' } ), '<br/>' );
		}
		$alert.dialog( {
			title: 'Accessorio cambusa',
			modal: true,
			buttons: {
				Ok: function() {
					$( this ).dialog( 'close' );
				}
			}
		} );
	}

	/**
	 * Legge una sezione della pagina corrente.
	 */
	function getSection( section, readHandler ) {
		api.get( {
			action: 'query',
			format: 'json',
			prop: 'revisions',
			titles: mw.config.get( 'wgPageName' ),
			rvprop: 'content',
			rvsection: section,
		} ).done ( function ( data ) {
			var text = data.query.pages[Object.keys( data.query.pages )[0]].revisions[0][ '*' ];
			readHandler( text );
		} ).fail ( function ( code, data ) {
			alert( 'Errore nel leggere la discussione: ' + code );
		} );
	}

	/**
	 * Modifica una sezione della pagina corrente.
	 */
	function setSection( section, text, summary ) {
		api.postWithEditToken( {
			action: 'edit',
			format: 'json',
			title: mw.config.get( 'wgPageName' ),
			section: section,
			text: text,
			summary: summary
		} ).done ( function ( data ) {
			___location.reload();
		} ).fail ( function ( code, data ) {
			alert( 'Errore nel modificare la discussione: ' + code );
		} );
	}

	/**
	 * Aggiunge una sezione a una pagina di discussione.
	 */
	function addSection( title, sectiontitle, text, successHandler ) {
		api.newSection( title, sectiontitle, text )
			.done( function ( data ) {
				successHandler( data.edit.newrevid );
			} )
			.fail ( function ( code, data ) {
				alert( 'Errore nel creare la discussione: ' + data.error.info );
			} );
	}
	
	/**
	 * Ottiene l'anchor dell'ultima discussione di una data versione di una pagina.
	 */
	function getSectionAnchor( oldid, anchorHandler ) {
		api.get( {
			action: 'parse',
			format: 'json',
			oldid: oldid,
			prop: 'sections',
		} ).done ( function ( data ) {
			anchorHandler( data.parse.sections[data.parse.sections.length - 1].anchor );
		} ).fail ( function ( code, data ) {
			alert( 'Errore nel leggere l\'anchor della sezione: ' + code );
		} );
	}

	/**
	 * Aggiunge l'autocompletamento per i titoli delle pagine.
	 */
	function addAutocomplete( inputEl ) {
		inputEl.autocomplete( {
			source: function( request, response ) {
				var ns = $namespace.find( 'option:selected' ).data( 'ns' );
				if ( ns % 2 === 1 ) {
					$.ajax( {
						url: mw.util.wikiScript( 'api' ),
						data: {
							action: 'query',
							list: 'allpages',
							aplimit: '10',
							apprefix: request.term,
							apnamespace: ns - 1,
							format: 'json'
						},
						dataType: 'json'
					} )
						.done( function ( data ) {
							var pages = [];
							$.each( data.query.allpages, function( i, page ) {
								pages.push( page.title.substring( page.title.indexOf( ':' ) + 1 ) );
							});
							response( pages );
						} );
				} else if ( extraPages[ns] )  {
					response( extraPages[ns] );
				}
			},
			change: function ( e, ui ) {
				if ( !ui.item ) {
					e.target.value = '';
				}
			}
		} );
	}

	function addInputText( $fieldset, id, size, label , value ) {
		var $input = $( '<input/>' ).attr( 'id', id ).attr( 'type', 'text' )
			.attr( 'size', size ).val( value );
		if ( label ) {
			$( '<label>' ).attr( 'for', id ).text( label ).appendTo( $fieldset );
			$fieldset.append( '<br/>' );
		}
		$fieldset.append( $input, '<br/>' );
		return $input;
	}

	/**
	 * Visualizza la finestra di dialogo per inserire i dati per la cambusa.
	 */
	function showDialogCambusa( section, sectiontitle, text ) {
		var $fieldset, $dest, $desttitle, $incipit;
		// crea il dialog
		if ( !$dialog ) {
			$dialog = $( '<div>' ).attr( 'id', 'gc-dialog-cambusa' ).appendTo( 'body' );
		}
		$dialog.html( '' );
		$fieldset = $( '<fieldset>' ).css( 'border-color', 'gray' ).appendTo( $dialog );
		$( '<legend>' ).text( 'Cambusa la discussione' ).appendTo( $fieldset );
		$namespace = $( '<select>' ).attr( 'id', 'gc-ns' ).css( 'width', '150px' );
		$.each( mw.config.get( 'wgFormattedNamespaces' ), function ( key, value ) {
			if ( key > 0 && ( key % 2 === 1 || extraPages[key] ) ) {
				$( '<option>' ).html( value ).data( 'ns', key ).appendTo( $namespace );
			}
		} );
		$( '<label>' ).attr( 'for', 'gc-ns' ).text( 'Namespace e pagina di destinazione:' ).appendTo( $fieldset );
		$fieldset.append( '<br/>', $namespace, ' <b>:</b> ' );
		$dest = addInputText( $fieldset, 'gc-pagina', 40 );
		$desttitle = addInputText( $fieldset, 'gc-titolo', 70, 'Titolo nuova discussione:', sectiontitle );
		$incipit = addInputText( $fieldset, 'gc-incipit', 70, 'Incipit (facoltativo):' );
		addAutocomplete( $dest );

		// visualizza il dialog
		$dialog.dialog( {
			title: 'Accessorio cambusa',
			width: 500,
			resizable: false,
			modal: false,
			buttons: {
				'Ok': function () {
					var from, error, incipit = $.trim( $incipit.val() ),
						dest = $.trim( $dest.val() ),
						desttitle = $.trim( $desttitle.val() );
					if ( dest.length === 0 ) {
						error = 'Il campo pagina è obbligatorio.';
					} else if ( ( $namespace.val() + ':' + dest ).replace( / /g, '_' ) === mw.config.get( 'wgPageName' ) ) {
						error = 'La pagina di destinazione deve essere diversa dalla corrente.';
					} else if ( desttitle.length === 0 ) {
						error = 'Il campo titolo è obbligatorio.';
					}
					if ( error ) {
						alert( error );
					} else {
						$( this ).dialog( 'close' );
						// cambusa
						dest = $namespace.val() + ':' + dest;
						from = mw.config.get( 'wgPageName' ).replace( /_/g, ' ' );
						text = '{{Cambusada|' + from + '|firma=--~~' + '~~}}\n' + text;
						alert( 'Spostamento in corso...', true );
						addSection( dest, desttitle, text, function ( newrevid ) {
							getSectionAnchor( newrevid, function ( anchor ) {
								text = '==' + sectiontitle + '==\n\n' +
									'{{Cambusa|' + incipit + '|' + dest + '#' + anchor + '|firma=--~~' + '~~}}';
								setSection( section, text, 'cambusata discussione in [[' + dest + ']]' );
							} );
						} );
					}
				},
				'Annulla': function () {
					$( this ).dialog( 'close' );
				}
			}
		} );
	}

	function addLinks() {
		$( 'span.mw-editsection > a:last-of-type' ).each( function ( i, el ) {
			var $link, sectiontitle = $( el ).attr( 'title' ).replace( /^(Modifica|Cancella) la sezione /g, '' );
			$link = $( '<a>' )
				.attr( 'href', '#' )
				.attr( 'title', 'Cambusa la discussione ' + sectiontitle )
				.text( 'cambusa' )
				.click( function ( event ) {
					event.preventDefault();
					mw.loader.using( [ 'jquery.ui.dialog', 'mediawiki.api', 'mediawiki.api.edit',
						'jquery.ui.autocomplete', 'jquery.spinner' ], function () {
						api = new mw.Api();
						getSection( i + 1, function ( text ) {
							var match = text.match( /==\s*(.*?)\s*==\s*\n([\s\S]*)/ );
							showDialogCambusa( i + 1, match[1], match[2] );
						} );
					} );
				} );
			$( el ).after( '<span> | </span>', $link );
		} );
		inited = true;
	}
	
	/**
	 * Ritorna true se la pagina corrente può utilizzare il link "cambusa".
	 */
	function cambusaLinksAllowed() {
		var ns = mw.config.get( 'wgNamespaceNumber' ),
			title = mw.config.get( 'wgTitle' );
		return ns % 2 === 1 ||
			( extraPages[ns] && $.inArray( title, extraPages[ns] ) !== -1 );
	}

	$( function () {
		if ( mw.config.get( 'wgAction' ) === 'view' && cambusaLinksAllowed() ) {
			var portletLink = mw.util.addPortletLink( 'p-tb', '#', 'Cambusa', 't-cambusa', 'Aggiunge il link cambusa a ogni discussione' );
			$( portletLink ).click( function ( event ) {
				event.preventDefault();
				if ( !inited ) {
					addLinks();
				}
			} );
		}
	} );
}( mediaWiki, jQuery ) );