پیش‌نویس:Gadget-twinkledeprod-2020.js

از ویکی‌پدیا، دانشنامهٔ آزاد
// <nowiki>


(function($) {


/*
****************************************
*** twinkledeprod.js: Batch deletion of expired PRODs (sysops only)
****************************************
* Mode of invocation:     Tab ("Deprod")
* Active on:              Categories whose name contains "proposed_deletion"
*/

Twinkle.deprod = function() {
	if (
		!Morebits.userIsSysop ||
		mw.config.get('wgNamespaceNumber') !== 14 ||
		!(/حذف_زمان‌دار/i).test(mw.config.get('wgPageName')) // localized
	) {
		return;
	}
	Twinkle.addPortletLink(Twinkle.deprod.callback, 'حذف زماندار دسته‌جمعی', 'tw-deprod', 'صفحه‌های ایجاد شده در این رده را حذف زماندار کنید'); // localized
};

var concerns = {};

Twinkle.deprod.callback = function() {
	var Window = new Morebits.simpleWindow(800, 400);
	Window.setTitle('انجام حذف زماندار'); // localized
	Window.setScriptName('توینکل'); // localized
	Window.addFooterLink('حذف زماندار', 'وپ:زماندار'); // localized
	Window.addFooterLink('راهنمای توینکل', 'en:WP:TW/DOC#deprod'); // localized

	var form = new Morebits.quickForm(callback_commit);

	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 query = {
		'action': 'query',
		'generator': 'categorymembers',
		'gcmtitle': mw.config.get('wgPageName'),
		'gcmlimit': 'max', // 500 is max for normal users, 5000 for bots and sysops
		'gcmnamespace': '0|6|108|2', // mostly to ignore categories
		'prop': [ 'info', 'revisions' ],
		'rvprop': [ 'content' ],
		'inprop': [ 'protection' ]
	};

	var statelem = new Morebits.status('گرفتن فهرست صفحه‌ها'); // localized
	var wikipedia_api = new Morebits.wiki.api('در حال بارگیری...', query, function(apiobj) { // localized
		var $doc = $(apiobj.responseXML);
		var $pages = $doc.find('page[ns!="6"]');  // all non-files
		var list = [];
		var re = /\{\{حذف زماندار/; // localized
		$pages.each(function() {
			var $page = $(this);
			var title = $page.attr('title');
			var content = $page.find('revisions rev').text();
			var $editprot = $page.find('pr[type="edit"][level="sysop"]');
			var isProtected = $editprot.length > 0;

			var metadata = [];
			var res = re.exec(content);
			if (res) {
				var parsed = Morebits.wikitext.template.parse(content, res.index);
				concerns[title] = parsed.parameters['اهمیت'] || ''; // localized
				metadata.push(concerns[title]);
			}
			if (isProtected) {
				metadata.push('محافظت کامل' + // localized
					($editprot.attr('expiry') === 'infinity' ? ' بی‌پایان' : '، انقضا در ' + $editprot.attr('expiry'))); // localized
			}
			list.push({
				label: metadata.length ? '(' + metadata.join('; ') + ')' : '',
				value: title,
				checked: concerns[title] !== '',
				style: isProtected ? 'color:red' : ''
			});
		});
		apiobj.params.form.append({ type: 'header', label: 'صفحه‌ها برای حذف' }); // localized
		apiobj.params.form.append({
			type: 'button',
			label: 'انتخاب همه', // localized
			event: function(e) {
				$(Morebits.quickForm.getElements(e.target.form, 'pages')).prop('checked', true);
			}
		});
		apiobj.params.form.append({
			type: 'button',
			label: 'انتخاب هیچ‌کدام', // localized
			event: function(e) {
				$(Morebits.quickForm.getElements(e.target.form, 'pages')).prop('checked', false);
			}
		});
		apiobj.params.form.append({
			'type': 'checkbox',
			'name': 'pages',
			'list': list
		});
		apiobj.params.form.append({
			'type': 'submit'
		});

		var rendered = apiobj.params.form.render();
		apiobj.params.Window.setContent(rendered);
		$(Morebits.quickForm.getElements(rendered, 'pages')).each(function(index, checkbox) {
			var $checkbox = $(checkbox);
			var link = Morebits.htmlNode('a', $checkbox.val());
			link.setAttribute('class', 'deprod-page-link');
			link.setAttribute('href', mw.util.getUrl($checkbox.val()));
			link.setAttribute('target', '_blank');
			$checkbox.next().prepend([link, ' ']);
		});
	}, statelem);

	wikipedia_api.params = { form: form, Window: Window };
	wikipedia_api.post();
};

var callback_commit = function(event) {
		var pages = event.target.getChecked('pages');
		Morebits.status.init(event.target);

		var batchOperation = new Morebits.batchOperation('حذف صفحه‌ها'); // localized
		batchOperation.setOption('chunkSize', Twinkle.getPref('proddeleteChunks'));
		batchOperation.setOption('preserveIndividualStatusLines', true);
		batchOperation.setPageList(pages);
		batchOperation.run(function(pageName) {
			var params = { page: pageName, reason: concerns[page] };

			var query = {
				'action': 'query',
				'titles': pageName,
				'prop': 'redirects',
				'rdlimit': 'max' // 500 is max for normal users, 5000 for bots and sysops
			};
			var wikipedia_api = new Morebits.wiki.api('دریافت تغییرمسیرها', query, callback_deleteRedirects); // localized
			wikipedia_api.params = params;
			wikipedia_api.post();

			query = {
				'action': 'query',
				'titles': 'Talk:' + pageName
			};
			wikipedia_api = new Morebits.wiki.api('بررسی این که ' + pageName + ' صفحهٔ بحث دارد یا نه', query, // localized
				callback_deleteTalk);
			wikipedia_api.params = params;
			wikipedia_api.post();

			var page = new Morebits.wiki.page(pageName, 'در حال حذف مقاله‌ها ' + pageName); // localized
			page.setEditSummary('سرآمدن [[ویکی‌پدیا:حذف زمان‌دار|حذف زمان‌دار]]، مشکل صفحه: ' + (concerns[pageName] === undefined ? 'نامشخص' : concerns[pageName]) + Twinkle.getPref('deletionSummaryAd')); // localized
			page.suppressProtectWarning();
			page.deletePage(batchOperation.workerSuccess, batchOperation.workerFailure);
		});
	},
	callback_deleteTalk = function(apiobj) {
		var $doc = $(apiobj.responseXML);
		var exists = $doc.find('page:not([missing])').length > 0;

		if (!exists) {
		// no talk page; forget about it
			return;
		}

		var page = new Morebits.wiki.page('Talk:' + apiobj.params.page, 'حذف صفحهٔ بحث ' + apiobj.params.page); // localized
		page.setEditSummary('[[وپ:محس#ع۸|ع۸]]: [[راهنما:صفحه بحث|صفحهٔ بحث]] صفحهٔ حذف شده «' + apiobj.params.page + '»' + Twinkle.getPref('deletionSummaryAd')); // localized
		page.deletePage();
	},
	callback_deleteRedirects = function(apiobj) {
		var $doc = $(apiobj.responseXML);
		$doc.find('redirects rd').each(function() {
			var title = $(this).attr('title');
			var page = new Morebits.wiki.page(title, 'حذف تغییر مسیر صفحه ' + title); // localized
			page.setEditSummary('[[وپ:محس#ع۸|ع۸]]: تغییر مسیر به صفحهٔ حذف شده «' + apiobj.params.page + '»' + Twinkle.getPref('deletionSummaryAd')); // localized
			page.deletePage();
		});
	};

})(jQuery);


// </nowiki>