MediaWiki:Gadget-testwikiredirect.js
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() );
}
} )();