மீடியாவிக்கி:Gadget-twinklebatchdelete.js
//&lt;nowiki&gt;
 
 
 (function($){
 
 
 /*
  ****************************************
  *** twinklebatchdelete.js: Batch delete module (sysops only)
  ****************************************
  * Mode of invocation:     Tab (&quot;D-batch&quot;)
  * Active on:              Existing non-articles, and Special:PrefixIndex
  * Config directives in:   TwinkleConfig
  */
 
 Twinkle.batchdelete = function twinklebatchdelete() {
 	if(
 		Morebits.userIsInGroup( 'sysop' ) &amp;&amp; (
 			( mw.config.get( 'wgCurRevisionId' ) &amp;&amp; mw.config.get( 'wgNamespaceNumber' ) &gt; 0 ) ||
 			mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Prefixindex'
 		)
 	) {
 		Twinkle.addPortletLink( Twinkle.batchdelete.callback, &quot;தொ-நீ&quot;, &quot;tw-batch&quot;, &quot;இப்பகுப்பில்/பக்கத்தில் காணப்படும் பக்கங்களை நீக்க&quot; );
 	}
 };
 
 Twinkle.batchdelete.unlinkCache = {};
 Twinkle.batchdelete.callback = function twinklebatchdeleteCallback() {
 	var Window = new Morebits.simpleWindow( 600, 400 );
 	Window.setTitle( &quot;தொகுதி நீக்கம்&quot; );
 	Window.setScriptName( &quot;மின்னல்&quot; );
 	Window.addFooterLink( &quot;மின்னல் உதவி&quot;, &quot;WP:TW/DOC#batchdelete&quot; );
 
 	var form = new Morebits.quickForm( Twinkle.batchdelete.callback.evaluate );
 	form.append( {
 			type: 'checkbox',
 			list: [
 				{
 					label: 'பக்கங்களை நீக்குக',
 					name: 'delete_page',
 					value: 'delete',
 					checked: true,
 					subgroup: {
 						type: 'checkbox',
 						list: [
 							{
 								label: 'ஒத்த பேச்சுப் பக்கங்களை நீக்குக (பயனர் பேச்சுப் பக்கங்களைத் தவிர)',
 								name: 'delete_talk',
 								value: 'delete_talk',
 								checked: true
 							},
 							{
 								label: 'நீக்கிய பக்கங்களுக்கான வழிமாற்றுகளை நீக்குக',
 								name: 'delete_redirects',
 								value: 'delete_redirects',
 								checked: true
 							}
 						]
 					}
 				},
 				{
 					label: 'ஒவ்வொரு பக்கத்திற்கும் உள்வரும் இணைப்புகளை நீக்குக (முதன்மை, வலைவாசல் பெயர்வெளிகளில் மட்டும்)',
 					name: 'unlink_page',
 					value: 'unlink',
 					checked: false
 				},
 				{
 					label: 'ஒவ்வொரு கோப்பினதும் பயன்பாடுகளை நீக்குக (எல்லாப் பெயர்வெளிகளிலும்)',
 					name: 'unlink_file',
 					value: 'unlink_file',
 					checked: true
 				}
 			]
 		} );
 	form.append( {
 			type: 'input',
 			name: 'reason',
 			label: 'காரணம்: ',
 			size: 60
 		} );
 
 	var query = {
 		'action': 'query',
 		'prop': 'revisions|info|imageinfo',
 		'inprop': 'protection',
 		'rvprop': 'size|user'
 	};
 	if( mw.config.get( 'wgNamespaceNumber' ) === 14 ) {  // Category:
 		query.generator = 'categorymembers';
 		query.gcmtitle = mw.config.get('wgPageName');
 		query.gcmlimit = Twinkle.getPref('batchMax'); // the max for sysops
 	} else if( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Prefixindex' ) {
 
 		query.generator = 'allpages';
 		query.gaplimit = Twinkle.getPref('batchMax'); // the max for sysops
 		if(Morebits.queryString.exists( 'prefix' ) )
 		{
 			query.gapnamespace = Morebits.queryString.get( 'namespace' );
 			query.gapprefix = Morebits.string.toUpperCaseFirstChar( Morebits.queryString.get( 'prefix' ) );
 		}
 		else
 		{
 			var pathSplit = decodeURIComponent(location.pathname).split('/');
 			if (pathSplit.length &lt; 3 || pathSplit[2] !== &quot;Special:PrefixIndex&quot;) {
 				return;
 			}
 			var titleSplit = pathSplit[3].split(':');
 			query.gapnamespace = mw.config.get(&quot;wgNamespaceIds&quot;)[titleSplit[0].toLowerCase()];
 			if ( titleSplit.length &lt; 2 || typeof query.gapnamespace === 'undefined' )
 			{
 				query.gapnamespace = 0;  // article namespace
 				query.gapprefix = pathSplit.splice(3).join('/');
 			}
 			else
 			{
 				pathSplit = pathSplit.splice(4);
 				pathSplit.splice(0,0,titleSplit.splice(1).join(':'));
 				query.gapprefix = pathSplit.join('/');
 			}
 		}
 	} else {
 		query.generator = 'links';
 		query.titles = mw.config.get('wgPageName');
 		query.gpllimit = Twinkle.getPref('batchMax'); // the max for sysops
 	}
 
 	var statusdiv = document.createElement( 'div' );
 	statusdiv.style.padding = '15px';  // just so it doesn't look broken
 	Window.setContent(statusdiv);
 	Morebits.status.init(statusdiv);
 	Window.display();
 
 	var statelem = new Morebits.status(&quot;பக்கங்களின் பட்டியலைத் திரட்டுகின்றது&quot;);
 	var wikipedia_api = new Morebits.wiki.api( 'ஏற்றுகின்றது...', query, function( apiobj ) {
 			var xml = apiobj.responseXML;
 			var $pages = $(xml).find('page').filter(':not([missing])');  // :not([imagerepository=&quot;shared&quot;])
 			var list = [];
 			$pages.each(function(index, page) {
 				var $page = $(page);
 				var ns = $page.attr('ns');
 				var title = $page.attr('title');
 				var isRedir = $page.attr('redirect') === &quot;&quot;;
 				var $editprot = $page.find('pr[type=&quot;edit&quot;][level=&quot;sysop&quot;]');
 				var isProtected = $editprot.length &gt; 0;
 				var size = $page.find('rev').attr('size');
 
 				var metadata = [];
 				if (isRedir) {
 					metadata.push(&quot;வழிமாற்று&quot;);
 				}
 				if (isProtected) {
 					metadata.push(&quot;முழுமையாகக் காக்கப்பட்டுள்ளது&quot; +
 						($editprot.attr('expiry') === 'infinity' ? ' (முடிவிலியாக)' : (', expires ' + $editprot.attr('expiry'))));
 				}
 				if (ns === &quot;6&quot;) {  // mimic what delimages used to show for files
 					metadata.push(&quot;uploader: &quot; + $page.find('ii').attr('user'));
 					metadata.push(&quot;last edit from: &quot; + $page.find('rev').attr('user'));
 				} else {
 					metadata.push(size + &quot; எண்ணுண்மிகள்&quot;);
 				}
 				list.push({
 					label: title + (metadata.length ? (' (' + metadata.join('; ') + ')') : ''),
 					value: title,
 					checked: true,
 					style: (isProtected ? 'color:red' : '')
 				});
 			});
 
 			apiobj.params.form.append({ type: 'header', label: 'நீக்குவதற்கான பக்கங்கள்' });
 			apiobj.params.form.append({
 					type: 'button',
 					label: &quot;அனைத்தும்&quot;,
 					event: function(e) {
 						$(Morebits.quickForm.getElements(e.target.form, &quot;pages&quot;)).prop('checked', true);
 					}
 				});
 			apiobj.params.form.append({
 					type: 'button',
 					label: &quot;எதுவும் வேண்டாம்&quot;,
 					event: function(e) {
 						$(Morebits.quickForm.getElements(e.target.form, &quot;pages&quot;)).prop('checked', false);
 					}
 				});
 			apiobj.params.form.append( {
 					type: 'checkbox',
 					name: 'pages',
 					list: list
 				} );
 			apiobj.params.form.append( { type:'submit' } );
 
 			var result = apiobj.params.form.render();
 			apiobj.params.Window.setContent( result );
 
 			Morebits.checkboxShiftClickSupport(Morebits.quickForm.getElements(result, 'pages'));
 		}, statelem );
 
 	wikipedia_api.params = { form:form, Window:Window };
 	wikipedia_api.post();
 };
 
 Twinkle.batchdelete.callback.evaluate = function twinklebatchdeleteCallbackEvaluate(event) {
 	Morebits.wiki.actionCompleted.notice = 'நிலைமை';
 	Morebits.wiki.actionCompleted.postfix = 'தொகுதி நீக்கம் நிறைவு.';
 
 	var numProtected = $(Morebits.quickForm.getElements(event.target, 'pages')).filter(function(index, element) {
 		return element.checked &amp;&amp; element.nextElementSibling.style.color === 'red';
 	}).length;
 	if (numProtected &gt; 0 &amp;&amp; !confirm(&quot;முழுமையாகக் காக்கப்பட்டுள்ள &quot; + numProtected + &quot; பக்கத்தை(களை) நீக்குவதில் நீங்கள் உறுதியாக உள்ளீர்களா?&quot;)) {
 		return;
 	}
 
 	var pages = event.target.getChecked( 'pages' );
 	var reason = event.target.reason.value;
 	var delete_page = event.target.delete_page.checked;
 	var delete_talk = event.target.delete_talk &amp;&amp; event.target.delete_talk.checked;
 	var delete_redirects = event.target.delete_redirects &amp;&amp; event.target.delete_redirects.checked;
 	var unlink_page = event.target.unlink_page.checked;
 	var unlink_file = event.target.unlink_file.checked;
 	if( ! reason ) {
 		alert(&quot;நீங்கள் ஒரு காரணத்தைக் கட்டாயம் குறிப்பிடவேண்டும்.&quot;);
 		return;
 	}
 	Morebits.simpleWindow.setButtonsEnabled( false );
 	Morebits.status.init( event.target );
 	if( !pages ) {
 		Morebits.status.error( 'பிழை', 'நீக்க எதுவுமில்லை, கைவிடுகின்றது.' );
 		return;
 	}
 
 	var pageDeleter = new Morebits.batchOperation(delete_page ? &quot;பக்கங்களை நீக்குகின்றது&quot; : &quot;கோரிய செய்பணிகளைத் தொடக்குகின்றது.&quot;);
 	pageDeleter.setOption(&quot;chunkSize&quot;, Twinkle.getPref('batchdeleteChunks'));
 	// we only need the initial status lines if we're deleting the pages in the pages array
 	pageDeleter.setOption(&quot;preserveIndividualStatusLines&quot;, delete_page);
 	pageDeleter.setPageList(pages);
 	pageDeleter.run(function(pageName) {
 		var params = {
 			page: pageName,
 			delete_page: delete_page,
 			delete_talk: delete_talk,
 			delete_redirects: delete_redirects,
 			unlink_page: unlink_page,
 			unlink_file: unlink_file &amp;&amp; /^(File|Image)\:/i.test(pageName),
 			reason: reason,
 			pageDeleter: pageDeleter
 		};
 
 		var wikipedia_page = new Morebits.wiki.page( pageName, 'பக்கத்தை நீக்குகின்றது: ' + pageName );
 		wikipedia_page.setCallbackParameters(params);
 		if( delete_page ) {
 			wikipedia_page.setEditSummary(reason + Twinkle.getPref('deletionSummaryAd'));
 			wikipedia_page.suppressProtectWarning();
 			wikipedia_page.deletePage(Twinkle.batchdelete.callbacks.doExtras, pageDeleter.workerFailure);
 		} else {
 			Twinkle.batchdelete.callbacks.doExtras(wikipedia_page);
 		}
 	});
 };
 
 Twinkle.batchdelete.callbacks = {
 	// this stupid parameter name is a temporary thing until I implement an overhaul
 	// of Morebits.wiki.* callback parameters
 	doExtras: function( thingWithParameters ) {
 		var params = thingWithParameters.parent ? thingWithParameters.parent.getCallbackParameters() :
 			thingWithParameters.getCallbackParameters();
 		// the initial batch operation's job is to delete the page, and that has
 		// succeeded by now
 		params.pageDeleter.workerSuccess(thingWithParameters);
 
 		var query, wikipedia_api;
 
 		if( params.unlink_page ) {
 			Twinkle.batchdelete.unlinkCache = {};
 			query = {
 				'action': 'query',
 				'list': 'backlinks',
 				'blfilterredir': 'nonredirects',
 				'blnamespace': [0, 100], // main space and portal space only
 				'bltitle': params.page,
 				'bllimit': 5000  // 500 is max for normal users, 5000 for bots and sysops
 			};
 			wikipedia_api = new Morebits.wiki.api( 'உள்வரும் இணைப்புகளைத் திரட்டுகின்றது', query, Twinkle.batchdelete.callbacks.unlinkBacklinksMain );
 			wikipedia_api.params = params;
 			wikipedia_api.post();
 		}
 
 		if( params.unlink_file ) {
 			query = {
 				'action': 'query',
 				'list': 'imageusage',
 				'iutitle': params.page,
 				'iulimit': 5000  // 500 is max for normal users, 5000 for bots and sysops
 			};
 			wikipedia_api = new Morebits.wiki.api( 'கோப்பு இணைப்புகளைத் திரட்டுகின்றது', query, Twinkle.batchdelete.callbacks.unlinkImageInstancesMain );
 			wikipedia_api.params = params;
 			wikipedia_api.post();
 		}
 
 		if( params.delete_page ) {
 			if ( params.delete_redirects ) {
 				query = {
 					'action': 'query',
 					'titles': params.page,
 					'prop': 'redirects',
 					'rdlimit': 5000  // 500 is max for normal users, 5000 for bots and sysops
 				};
 				wikipedia_api = new Morebits.wiki.api( 'வழிமாற்றுகளைத் திரட்டுகின்றது', query, Twinkle.batchdelete.callbacks.deleteRedirectsMain );
 				wikipedia_api.params = params;
 				wikipedia_api.post();
 			}
 			if ( params.delete_talk ) {
 				var pageTitle = mw.Title.newFromText(params.page);
 				if (pageTitle &amp;&amp; pageTitle.namespace % 2 === 0 &amp;&amp; pageTitle.namespace !== 2) {
 					pageTitle.namespace++;  // now pageTitle is the talk page title!
 					query = {
 						'action': 'query',
 						'titles': pageTitle.toText()
 					};
 					wikipedia_api = new Morebits.wiki.api( 'பேச்சுப் பக்கம் உள்ளதா எனப் பார்க்கின்றது', query, Twinkle.batchdelete.callbacks.deleteTalk );
 					wikipedia_api.params = params;
 					wikipedia_api.params.talkPage = pageTitle.toText();
 					wikipedia_api.post();
 				}
 			}
 		}
 	},
 	deleteRedirectsMain: function( apiobj ) {
 		var xml = apiobj.responseXML;
 		var pages = $(xml).find('rd').map(function() { return $(this).attr('title'); }).get();
 		if (!pages.length) {
 			return;
 		}
 
 		var redirectDeleter = new Morebits.batchOperation(&quot;இதற்கான வழிமாற்றுகளை நீக்குகின்றது: &quot; + apiobj.params.page);
 		redirectDeleter.setOption(&quot;chunkSize&quot;, Twinkle.getPref('batchdeleteChunks'));
 		redirectDeleter.setPageList(pages);
 		redirectDeleter.run(function(pageName) {
 			var wikipedia_page = new Morebits.wiki.page(pageName, &quot;நீக்குகின்றது: &quot; + pageName);
 			wikipedia_page.setEditSummary('[[WP:CSD|பொ8]]: நீக்கிய பக்கத்திற்கான வழிமாற்று &quot;' + apiobj.params.page + '&quot;' + Twinkle.getPref('deletionSummaryAd'));
 			wikipedia_page.deletePage(redirectDeleter.workerSuccess, redirectDeleter.workerFailure);
 		});
 	},
 	deleteTalk: function( apiobj ) {
 		var xml = apiobj.responseXML;
 		var exists = $(xml).find('page:not([missing])').length &gt; 0;
 
 		if( !exists ) {
 			// no talk page; forget about it
 			return;
 		}
 
 		var page = new Morebits.wiki.page(apiobj.params.talkPage, &quot;கட்டுரையின் பேச்சுப் பக்கத்தை நீக்குகின்றது &quot; + apiobj.params.page);
 		page.setEditSummary(&quot;[[WP:CSD|பொ8]]: நீக்கிய பக்கத்தின் பேச்சுப் பக்கம் \&quot;&quot; + apiobj.params.page + &quot;\&quot;&quot; + Twinkle.getPref('deletionSummaryAd'));
 		page.deletePage();
 	},
 	unlinkBacklinksMain: function( apiobj ) {
 		var xml = apiobj.responseXML;
 		var pages = $(xml).find('bl').map(function() { return $(this).attr('title'); }).get();
 		if (!pages.length) {
 			return;
 		}
 
 		var unlinker = new Morebits.batchOperation(&quot;இதற்கான உள்வரும் இணைப்புகளை நீக்குகின்றது: &quot; + apiobj.params.page);
 		unlinker.setOption(&quot;chunkSize&quot;, Twinkle.getPref('batchdeleteChunks'));
 		unlinker.setPageList(pages);
 		unlinker.run(function(pageName) {
 			var wikipedia_page = new Morebits.wiki.page(pageName, &quot;இங்கு இணைப்புநீக்குகின்றது: &quot; + pageName);
 			var params = $.extend({}, apiobj.params);
 			params.title = pageName;
 			params.unlinker = unlinker;
 			wikipedia_page.setCallbackParameters(params);
 			wikipedia_page.load(Twinkle.batchdelete.callbacks.unlinkBacklinks);
 		});
 	},
 	unlinkBacklinks: function( pageobj ) {
 		var params = pageobj.getCallbackParameters();
 		if( ! pageobj.exists() ) {
 			// we probably just deleted it, as a recursive backlink
 			params.unlinker.workerSuccess(pageobj);
 			return;
 		}
 
 		var text;
 		if( params.title in Twinkle.batchdelete.unlinkCache ) {
 			text = Twinkle.batchdelete.unlinkCache[ params.title ];
 		} else {
 			text = pageobj.getPageText();
 		}
 		var old_text = text;
 		var wikiPage = new Morebits.wikitext.page( text );
 		wikiPage.removeLink( params.page );
 
 		text = wikiPage.getText();
 		Twinkle.batchdelete.unlinkCache[ params.title ] = text;
 		if( text === old_text ) {
 			// Nothing to do, return
 			params.unlinker.workerSuccess(pageobj);
 			return;
 		}
 		pageobj.setEditSummary('நீக்கப்பட்ட பக்கத்திற்கான இணைப்பு(கள்) நீக்கப்பட்டது(ன). ' + params.page + Twinkle.getPref('deletionSummaryAd'));
 		pageobj.setPageText(text);
 		pageobj.setCreateOption('nocreate');
 		pageobj.setMaxConflictRetries(10);
 		pageobj.save(params.unlinker.workerSuccess, params.unlinker.workerFailure);
 	},
 	unlinkImageInstancesMain: function( apiobj ) {
 		var xml = apiobj.responseXML;
 		var pages = $(xml).find('iu').map(function() { return $(this).attr('title'); }).get();
 		if (!pages.length) {
 			return;
 		}
 
 		var unlinker = new Morebits.batchOperation(&quot;இதற்கான உள்வரும் இணைப்புகளை நீக்குகின்றது: &quot; + apiobj.params.page);
 		unlinker.setOption(&quot;chunkSize&quot;, Twinkle.getPref('batchdeleteChunks'));
 		unlinker.setPageList(pages);
 		unlinker.run(function(pageName) {
 			var wikipedia_page = new Morebits.wiki.page(pageName, &quot;இங்குக் கோப்புப் பயன்பாடுகளை நீக்குகின்றது: &quot; + pageName);
 			var params = $.extend({}, apiobj.params);
 			params.title = pageName;
 			params.unlinker = unlinker;
 			wikipedia_page.setCallbackParameters(params);
 			wikipedia_page.load(Twinkle.batchdelete.callbacks.unlinkImageInstances);
 		});
 	},
 	unlinkImageInstances: function( pageobj ) {
 		var params = pageobj.getCallbackParameters();
 		if( ! pageobj.exists() ) {
 			// we probably just deleted it, as a recursive backlink
 			params.unlinker.workerSuccess(pageobj);
 			return;
 		}
 
 		var image = params.image.replace( /^(?:Image|File):/, '' );
 		var text;
 		if( params.title in Twinkle.batchdelete.unlinkCache ) {
 			text = Twinkle.batchdelete.unlinkCache[ params.title ];
 		} else {
 			text = pageobj.getPageText();
 		}
 		var old_text = text;
 		var wikiPage = new Morebits.wikitext.page( text );
 		wikiPage.commentOutImage( image , 'படிமம் நீக்கப்பட்டதால், மறைக்கப்பட்டது.' );
 
 		text = wikiPage.getText();
 		Twinkle.batchdelete.unlinkCache[ params.title ] = text;
 		if( text === old_text ) {
 			pageobj.getStatusElement().error( 'படிமத்தை இணைப்புநீக்குதல் தோல்வி. ' + image + ' இங்கு: ' + pageobj.getPageName() );
 			params.unlinker.workerFailure(pageobj);
 			return;
 		}
 		pageobj.setEditSummary('கோப்புப் பயன்பாடு நீக்கப்பட்டது. ' + image + &quot; ஏனெனில், கோப்பு நீக்கப்பட்டது. காரணம்: \&quot;&quot; + params.reason + &quot;\&quot;)&quot; + Twinkle.getPref('deletionSummaryAd'));
 		pageobj.setPageText(text);
 		pageobj.setCreateOption('nocreate');
 		pageobj.setMaxConflictRetries(10);
 		pageobj.save(params.unlinker.workerSuccess, params.unlinker.workerFailure);
 	}
 };
 })(jQuery);