مدیاویکی:Gadget-twinkledeprod-2022.js

از ویکی‌پدیا، دانشنامهٔ آزاد

نکته: برای دیدن تغییرات، ممکن است نیاز باشد که حافظهٔ نهانی مرورگر خود را پس از انتشار پاک‌سازی کنید. گوگل کروم، فایرفاکس، مایکروسافت اج و سافاری: کلید Shift را نگه دارید و روی دکمهٔ Reload در نوار ابزار مرورگر کلیک کنید. برای آگاهی از جزئیات و نحوهٔ پاک‌سازی حافظهٔ نهانی سایر مرورگرها، صفحهٔ ویکی‌پدیا:میانگیر مرورگرتان را خالی کنید را ببینید.

// <nowiki>


(function($) {


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

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

var concerns = {};

Twinkle.deprod.callback = function() {
	var Window = new Morebits.simpleWindow(800, 400);
	Window.setTitle('تمیزکاری حذف زمان‌دار');
	Window.setScriptName('توینکل');
	Window.addFooterLink('حذف زمان‌دار', 'وپ:حز');
	Window.addFooterLink('راهنمای توینکل', 'وپ:توینکل/توضیحات#deprod');
	Window.addFooterLink('ارائهٔ بازخورد', 'بوپ:توینکل');

	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: Twinkle.getPref('batchMax'),
		gcmnamespace: '0|108|2', // mostly to ignore categories and files
		prop: 'info|revisions',
		rvprop: 'content',
		inprop: 'protection',
		format: 'json'
	};

	var statelem = new Morebits.status('در حال دریافت فهرست صفحه‌ها');
	var wikipedia_api = new Morebits.wiki.api('در حال بارگیری...', query, function(apiobj) {
		var response = apiobj.getResponse();
		var pages = (response.query && response.query.pages) || [];
		var list = [];
		var re = /\{\{(Proposed deletion|حذف زمان‌دار\/پیغام)/; // Localized; Keeping English alias for cross-wiki nominations
		pages.sort(Twinkle.sortByNamespace);
		pages.forEach(function(page) {
			var metadata = [];

			var content = page.revisions[0].content;
			var res = re.exec(content);
			var title = page.title;
			if (res) {
				var parsed = Morebits.wikitext.parseTemplate(content, res.index);
				concerns[title] = parsed.parameters.concern || parsed.parameters['اهمیت'] || '';
				metadata.push(concerns[title]);
			}

			var editProt = page.protection.filter(function(pr) {
				return pr.type === 'edit' && pr.level === 'sysop';
			}).pop();
			if (editProt) {
				metadata.push('کاملاً حفاظت‌شده' +
					(editProt.expiry === 'infinity' ? ' بی‌پایان' : '، انقضا در ' + editProt.expiry));
			}

			list.push({
				label: metadata.length ? '(' + metadata.join('؛ ') + ')' : '',
				value: title,
				checked: concerns[title] !== '',
				style: editProt ? 'color:red' : ''
			});
		});
		apiobj.params.form.append({ type: 'header', label: 'صفحه‌ها برای حذف' });
		apiobj.params.form.append({
			type: 'button',
			label: 'انتخاب همه',
			event: function(e) {
				$(Morebits.quickForm.getElements(e.target.form, 'pages')).prop('checked', true);
			}
		});
		apiobj.params.form.append({
			type: 'button',
			label: 'انتخاب هیچ‌کدام',
			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').forEach(Twinkle.generateBatchPageLinks);
	}, statelem);

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

var callback_commit = function(event) {
		var pages = Morebits.quickForm.getInputData(event.target).pages;
		Morebits.status.init(event.target);

		var batchOperation = new Morebits.batchOperation('در حال حذف صفحه‌ها');
		batchOperation.setOption('chunkSize', Twinkle.getPref('batchChunks'));
		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
				format: 'json'
			};
			var wikipedia_api = new Morebits.wiki.api('در حال دریافت تغییرمسیرها', query, callback_deleteRedirects);
			wikipedia_api.params = params;
			wikipedia_api.post();

			var pageTitle = mw.Title.newFromText(pageName);
			// Don't delete user talk pages, essentially limiting this to Talk: and Book talk:
			if (pageTitle && pageTitle.namespace % 2 === 0 && pageTitle.namespace !== 2) {
				pageTitle.namespace++;  // now pageTitle is the talk page title!
				query = {
					action: 'query',
					titles: pageTitle.toText(),
					format: 'json'
				};
				wikipedia_api = new Morebits.wiki.api('در حال بررسی وجود صفحهٔ بحث برای ' + pageName, query,
					callback_deleteTalk);
				wikipedia_api.params = params;
				wikipedia_api.post();
			}

			var page = new Morebits.wiki.page(pageName, 'در حال حذف صفحهٔ ' + pageName);
			page.setEditSummary('[[وپ:حز|حذف زمان‌دار]] منقضی‌شده، مشکل صفحه: ' + concerns[pageName]);
			page.setChangeTags(Twinkle.changeTags);
			page.suppressProtectWarning();
			page.deletePage(batchOperation.workerSuccess, batchOperation.workerFailure);
		});
	},
	callback_deleteTalk = function(apiobj) {
		// no talk page; forget about it
		if (apiobj.getResponse().query.pages[0].missing) {
			return;
		}

		var page = new Morebits.wiki.page('بحث:' + apiobj.params.page, 'در حال حذف بحث صفحهٔ ' + apiobj.params.page);
		page.setEditSummary('[[وپ:محس#ع۸|ع۸]]: [[راهنما:صفحه بحث|صفحهٔ بحث]] صفحهٔ حذف‌شدهٔ «' + apiobj.params.page + '»');
		page.setChangeTags(Twinkle.changeTags);
		page.deletePage();
	},
	callback_deleteRedirects = function(apiobj) {
		var response = apiobj.getResponse();
		var redirects = response.query.pages[0].redirects || [];
		redirects.forEach(function(rd) {
			var title = rd.title;
			var page = new Morebits.wiki.page(title, 'در حال حذف صفحهٔ تغییرمسیریافتهٔ ' + title);
			page.setEditSummary('[[وپ:محس#ع۸|ع۸]]: تغییرمسیر به صفحهٔ حذف‌شدهٔ «' + apiobj.params.page + '»');
			page.setChangeTags(Twinkle.changeTags);
			page.deletePage();
		});
	};

Twinkle.addInitCallback(Twinkle.deprod, 'deprod');
})(jQuery);


// </nowiki>