MediaWiki:Gadget-LinkComplete.js

In questo articolo esploreremo MediaWiki:Gadget-LinkComplete.js da diverse prospettive e ne approfondiremo l'importanza e la rilevanza oggi. MediaWiki:Gadget-LinkComplete.js è oggetto di interesse e dibattito da molto tempo ed è fondamentale per comprenderne l'impatto su vari aspetti della vita quotidiana. In queste pagine analizzeremo i diversi aspetti di MediaWiki:Gadget-LinkComplete.js ed esamineremo da vicino le sue implicazioni nella nostra società attuale. Dalla sua origine alla sua evoluzione nel tempo, ci immergeremo in un'analisi dettagliata che ci permetterà di comprendere meglio il ruolo che MediaWiki:Gadget-LinkComplete.js gioca nella nostra vita quotidiana.
/**
 * 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.orghttps://wikifreehand.com/it/User:Zocky/LinkComplete.js
 *
 * @author ]
 */
/*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 ?
									 data.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.title = initialText.charAt( 0 ) + pages.title.substring( 1 );
			}
			$( element ).textSelection( 'encapsulateSelection',
				{ pre: pages.title, selectionStart: position,
					  selectionEnd: position + currText.length, replace: true } );
			currText = pages.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 ) );