MediaWiki:Gadget-testwikiredirect.js

From Wikimedia Incubator

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/**
 * Test wiki redirect gadget
 * 
 * This gadget can redirect an entire test wiki or even an entire language code
 * from one test wiki to another. This can be useful in cases where a language
 * code that is commonly used outside the Wikimedia Incubator is incorrect
 * for our purposes.
 * 
 * @author Jon Harald Søby
 * @version 1.0.2 (2023-04-07)
 */

( function() {
	/* Languages that should be redirected entirely */
	var redirects = {
		// Whole languages that should be redirected
		'ak': 'tw',
		// Specific wikis that should be redirected
		'Wy/sh': 'Wy/hbs'
	};

	var prefix = mw.config.get( 'wgWmincTestwikiPrefix' ),
		language = mw.config.get( 'wgWmincTestwikiLanguage' ),
		realPagename = mw.config.get( 'wgWmincRealPagename' ),
		articleId = mw.config.get( 'wgArticleId' ),
		noRedirect = mw.util.getParamValue( 'redirect' ) === 'no',
		redirectFrom = mw.util.getParamValue( 'redirectfrom' ),
		skin = mw.config.get( 'skin' );

	if ( !prefix || !realPagename ) {
		// Do nothing if:
		// * the page isn't prefixed
		// * the page is an info page or main test wiki category (Wx/xx)
		return;
	} else if ( redirectFrom ) {
		var msgName = skin === 'minerva' ? 'mobile-frontend-redirected-from' : 'redirectedfrom',
			redirectFromNormalized = mw.util.percentDecodeFragment( redirectFrom ).replace( '_', ' ' ),
			$redirectedFrom = $( '<span>' )
				.addClass( 'mw-redirectedfrom' ),
			redirectFromUrl = mw.util.getUrl( redirectFromNormalized, { redirect: 'no' } ),
			$redirectFromLink = $( '<a>' )
				.attr( 'href', redirectFromUrl )
				.attr( 'title', redirectFromNormalized )
				.text( redirectFromNormalized )
				.addClass( 'mw-redirect' ),
			uri = new mw.Uri();

		return new mw.Api().loadMessagesIfMissing( [ msgName ] ).then( function() {
			var $redirectMessage = mw.message( msgName, $redirectFromLink ).parseDom();

			if ( skin === 'minerva' ) {
				mw.notify( $redirectMessage );
			} else {
				mw.util.addSubtitle( $redirectedFrom.append( $redirectMessage ).html() );
			}
			
			if ( window.history.replaceState ) {
				delete uri.query.redirectfrom;
				var newUri = uri.toString();
				if ( Object.keys( uri.query ).length === 1 && uri.query.title ) {
					newUri = mw.util.getUrl( uri.query.title );
				}
				window.history.replaceState( null, 'remove-redirectfrom', newUri );
			}
		} );
	}

	if ( !( redirects[ language ] || redirects[ prefix ] ) ) {
		// If the language or the prefix is not in the redirects list, do nothing
		return;
	}

	var newPrefix = redirects[ prefix ] || prefix.replace( language, redirects[ language ] ),
		oldUri = new mw.Uri().toString(),
		newUri = new mw.Uri( oldUri.replace( prefix, newPrefix ) ).extend( { redirectfrom: mw.config.get( 'wgPageName' ) } ),
		newPagename = mw.config.get( 'wgPageName' ).replace( prefix, newPrefix );

	if ( noRedirect ) {
		mw.messages.set( {
			'gadget-testwikiredirect-message': 'This is an automatic redirect for this entire test wiki.'
		} );
		
		new mw.Api().loadMessagesIfMissing( [ 'redirectpagesub', 'redirectto' ] ).then( function() {
			mw.util.addSubtitle( '<br /><span id="redirectsub">' + mw.msg( 'redirectpagesub' ) + '</span>' );

			var $parserOutput = $( '<div>' ).addClass( 'mw-parser-output' ),
				$redirectMsg = $( '<div>' ).addClass( 'redirectMsg' ),
				$p = $( '<p>' ).text( mw.msg( 'redirectto' ) ),
				$redirectText = $( '<ul>' ).addClass( 'redirectText' ),
				$li = $( '<li>' ),
				$a = $( '<a>' )
					.attr( 'href', newUri )
					.attr( 'title', newPagename )
					.text( newPagename ),
				$gadgetMsg = $( '<div>' )
					.text( mw.msg( 'gadget-testwikiredirect-message' ) );

			$parserOutput.append( $redirectMsg );
			$redirectMsg.append( $p );
			$redirectMsg.append( $redirectText );
			$redirectText.append( $li );
			$li.append( $a );
			$redirectMsg.append( $gadgetMsg );
			
			$( '#mw-content-text .noarticletext' ).replaceWith( $parserOutput );
		} );
	} else {
		window.location.replace( newUri.toString() );
	}
} )();