MediaWiki:Gadget-LinkComplete.js

Da Semi del Verbo, l'enciclopedia dell'influenza del Vangelo sulla cultura

Nota: dopo aver pubblicato, potrebbe essere necessario pulire la cache del proprio browser per vedere i cambiamenti.

  • Firefox / Safari: tieni premuto il tasto delle maiuscole Shift e fai clic su Ricarica, oppure premi Ctrl-F5 o Ctrl-R (⌘-R su Mac)
  • Google Chrome: premi Ctrl-Shift-R (⌘-Shift-R su un Mac)
  • Internet Explorer / Edge: tieni premuto il tasto Ctrl e fai clic su Aggiorna, oppure premi Ctrl-F5
  • Opera: premi Ctrl-F5.
/**
 * Gadget-LinkComplete.js
 * Funzione di autocompletamento dei wikilink, si attiva con Tab o Ctrl+Spazio.
 * Riscritto da zero a partire da:
 * http://it.wikipedia.org/w/index.php?title=MediaWiki:Gadget-LinkComplete.js&oldid=51953861
 * che a sua volta lo importava da:
 * http://en.wikipedia.org/wiki/User:Zocky/LinkComplete.js
 *
 * @author [[Utente:Rotpunkt]]
 */
/*global mediaWiki, jQuery */

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

	// Classe per la funzione di autocompletamento
	function AutoComplete( pos, text, el ) {
		var position = pos,
			initialText = text,
			element = el,
			pages = null,
			currPage = 0,
			currContinue = null,
			prevContinue = null,
			currText = text;

		// Ritorna la lista delle pagine che iniziano con prefix ( in JSON )
		function getPages( prefix, pcontinue, pageHandler ) {
			$.ajax( {
				url: mw.util.wikiScript( 'api' ),
				data: {
					action: 'query',
					list: 'allpages',
					apprefix: prefix,
					apcontinue: pcontinue,
					aplimit: '50',
					apfilterredir: 'nonredirects',
					format: 'json',
					rawcontinue: ''
				},
				async: false,
				dataType: 'json'
			} )
				.done( function ( data ) {
					if ( data.query && data.query.allpages.length > 0 ) {
						pageHandler( data.query.allpages, data['query-continue'] ?
									 data['query-continue'].allpages.apcontinue : null );
					}
				} );
		}

		// Inserisce il nome della pagina nell'area di modifica
		function dump() {
			// preserva il case del primo carattere
			if ( initialText.length > 0 ) {
				pages[currPage].title = initialText.charAt( 0 ) + pages[currPage].title.substring( 1 );
			}
			$( element ).textSelection( 'encapsulateSelection',
				{ pre: pages[currPage].title, selectionStart: position,
					  selectionEnd: position + currText.length, replace: true } );
			currText = pages[currPage].title;
			// aggiorna currPage
			if ( currPage >= pages.length - 1 ) {
				if ( currContinue ) {
					pages = null;
				} else if ( prevContinue ) {
					prevContinue = null;
					pages = null;
				} else {
					currPage = 0;
				}
			} else {
				currPage += 1;
			}
		}

		AutoComplete.prototype.getCurrText = function () {
			return currText;
		};

		AutoComplete.prototype.complete = function () {
			// eventualmente ottiene la lista di pagine
			if ( !pages ) {
				getPages( initialText, currContinue, function ( retPages, pcontinue ) {
					pages = retPages;
					prevContinue = currContinue;
					currContinue = pcontinue;
					currPage = 0;
				} );
			}
			if ( pages ) {
				dump();
			}
		};
	}

	$( function () {
		// previene con Firefox l'azione di default del tasto Tab 
		var tabDefault = true, ac;

		$( '#wpTextbox1, #wpUploadDescription' ).keydown( function ( event ) {
			var pos, text;
			if ( ( !event.altKey && !event.shiftKey && !event.ctrlKey && !event.metaKey && event.keyCode === 9 ) ||
				 ( !event.altKey && !event.shiftKey && event.ctrlKey && !event.metaKey && event.keyCode === 32 ) ) {
				tabDefault = true;
				pos = $( event.target ).textSelection( 'getCaretPosition' );
				text = $( event.target ).val().replace( /\r\n/g, '\n' ).substring( 0, pos );
				pos = text.lastIndexOf( '[[' ) + 2;
				text = text.substring( pos );
				if ( pos >= 2 && !/[\[\]\{\}\r\n\|]/.test( text ) ) {
					tabDefault = false;
					event.preventDefault();
					if ( !ac || text !== ac.getCurrText() ) {
						ac = new AutoComplete( pos, text, event.target );
					}
					ac.complete();
				}
			}
		} );
		$( '#wpTextbox1, #wpUploadDescription' ).keypress( function ( event ) {
			if ( !event.altKey && !event.shiftKey && !event.ctrlKey && !event.metaKey && event.keyCode === 9 ) {
				return tabDefault;
			}
		} );
	} );
}( mediaWiki, jQuery ) );