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)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
/* <nowiki> */
/* Bharat Mitra: redirect tools module */
( function () {
	'use strict';
	var BM = window.BharatMitra;
	function queryPage( name, limit ) {
		return BM.core.api().get( {
			action: 'query', list: 'querypage', qppage: name, qplimit: limit || 100, formatversion: 2
		} ).then( function ( r ) {
			return ( r.query && r.query.querypage && r.query.querypage.results ) || [];
		} );
	}
	function finalTarget( title ) {
		return BM.core.api().get( {
			action: 'query', titles: title, redirects: 1, formatversion: 2
		} ).then( function ( r ) {
			var pages = r.query.pages || [];
			return pages.length ? pages[ 0 ].title : title;
		} );
	}
	BM.register( 'redirect', {
		open: function () {
			var title = mw.config.get( 'wgPageName' ).replace( /_/g, ' ' );
			var isRedirect = !!mw.config.get( 'wgIsRedirect' );
			$.when(
				queryPage( 'DoubleRedirects', 100 ).catch( function () { return []; } ),
				queryPage( 'BrokenRedirects', 100 ).catch( function () { return []; } )
			).then( function ( doubles, brokens ) {
				var doubleTitles = doubles.map( function ( d ) { return d.title; } );
				var brokenTitles = brokens.map( function ( b ) { return b.title; } );
				var info = 'Double redirects: ' + doubleTitles.length + '. Broken redirects: ' + brokenTitles.length + '.' +
					( isRedirect ? ' This page is itself a redirect.' : '' );
				BM.core.dialog( {
					title: 'Redirect tools',
					help: 'Page: ' + title,
					info: info,
					fields: [
						{ name: 'mode', label: 'Action', type: 'select', required: true, options: [
							[ 'double', 'Fix double redirects (' + doubleTitles.length + ')' ],
							[ 'retarget', 'Change the redirect target of this page' ],
							[ 'broken', 'View broken redirects (' + brokenTitles.length + ')' ]
						], value: doubleTitles.length ? 'double' : 'retarget' },
						{ name: 'newTarget', label: 'New target (only for changing the target)', type: 'text', placeholder: 'Page name' }
					],
					preview: function ( v ) {
						if ( v.mode === 'double' ) {
							if ( !doubleTitles.length ) { return 'There are no double redirects.'; }
							return '\'\'\'Redirects to be fixed:\'\'\'\n' + doubleTitles.map( function ( t ) {
								return '* [[:' + t + ']]';
							} ).join( '\n' );
						}
						if ( v.mode === 'broken' ) {
							if ( !brokenTitles.length ) { return 'There are no broken redirects.'; }
							return '\'\'\'Broken redirects:\'\'\'\n' + brokenTitles.map( function ( t ) {
								return '* [[:' + t + ']]';
							} ).join( '\n' );
						}
						var nt = BM.core.cleanParam( v.newTarget );
						if ( !nt ) { throw new Error( 'Enter a new target.' ); }
						return '#REDIRECT [[' + nt + ']]';
					},
					previewTitle: function () { return title; },
					submitLabel: 'Do it',
					success: 'Redirect work completed.',
					onSubmit: function ( v ) {
						if ( v.mode === 'broken' ) {
							mw.notify( 'Broken redirects were only listed; nothing was changed.' );
							return $.Deferred().resolve().promise();
						}
						if ( v.mode === 'retarget' ) {
							if ( !isRedirect ) { throw new Error( 'This page is not a redirect.' ); }
							var nt = BM.core.cleanParam( v.newTarget );
							if ( !nt ) { throw new Error( 'Enter a new target.' ); }
							return BM.core.getPage( title ).then( function ( p ) {
								var lines = p.content.split( '\n' );
								if ( !/^\s*#\s*REDIRECT/i.test( lines[ 0 ] ) ) {
									throw new Error( 'No redirect was found in the first line.' );
								}
								lines[ 0 ] = '#REDIRECT [[' + nt + ']]';
								return BM.core.savePage( title, lines.join( '\n' ),
									'Changed the redirect target (using [[Bharatpedia:Bharat Mitra|Bharat Mitra]])', p.revid );
							} );
						}
						var chain = $.Deferred().resolve().promise();
						var fixed = 0;
						doubleTitles.forEach( function ( t ) {
							chain = chain.then( function () {
								return finalTarget( t ).then( function ( fin ) {
									if ( fin === t ) { return null; }
									return BM.core.getPage( t ).then( function ( p ) {
										if ( !p.exists ) { return null; }
										var lines = p.content.split( '\n' );
										lines[ 0 ] = '#REDIRECT [[' + fin + ']]';
										return BM.core.savePage( t, lines.join( '\n' ),
											'Fixed a double redirect (using [[Bharatpedia:Bharat Mitra|Bharat Mitra]])', p.revid )
											.then( function () { fixed++; } );
									} );
								} ).catch( function () { /* next */ } );
							} );
						} );
						return chain.then( function () {
							mw.notify( 'Double redirects fixed: ' + fixed );
						} );
					}
				} );
			} );
		}
	} );
}() );
/* </nowiki> */