# MediaWiki:Gadget-twinkledeprod-2020.js

From faraghaib
Jump to navigation Jump to search

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>

    (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': 'بحث:' + 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>

Retrieved from "https://en.faraghaib.ir/w/index.php?title=MediaWiki:Gadget-twinkledeprod-2020.js&oldid=451"