میڈیاویکی:Gadget-twinkleprod-2022.js

تفصیل کے لیے کھولیں کے بٹن پر کلک کریں یاددہانی: محفوظ کرنے کے بعد تازہ ترین تبدیلیوں کو دیکھنے کے لیے آپ کو اپنے براؤزر کا کیش صاف کرنا ہوگا۔

  • فائرفاکس/ سفاری: جب Reload پر کلک کریں تو Shift دبا کر رکھیں، یا Ctrl-F5 یا Ctrl-R دبائیں (Mac پر R- )
  • گوگل کروم: Ctrl-Shift-R دبائیں (Mac پر Shift-R-⌘)
  • انٹرنیٹ ایکسپلورر: جب Refresh پر کلک کریں تو Ctrl یا Ctrl-F5 دبائیں
  • اوپیرا: Tools → Preferences میں جائیں اور کیش صاف کریں

// <nowiki>


(function($) {


/*
 ****************************************
 *** twinkleprod.js: PROD module
 ****************************************
 * Mode of invocation:     Tab ("محذ")
 * Active on:              Existing articles, files which are not redirects
 */

Twinkle.prod = function twinkleprod() {
	if (([0, 6].indexOf(mw.config.get('wgNamespaceNumber')) === -1) ||
		!mw.config.get('wgCurRevisionId') ||
		Morebits.isPageRedirect()) {
		return;
	}

	Twinkle.addPortletLink(Twinkle.prod.callback, 'مجوزہ', 'tw-prod', 'وپ:مجوزہ حذف شدگی کے مطابق نامزدگی');
};

// Used in edit summaries, for comparisons, etc.
var namespace;

Twinkle.prod.callback = function twinkleprodCallback() {
	Twinkle.prod.defaultReason = Twinkle.getPref('prodReasonDefault');

	switch (mw.config.get('wgNamespaceNumber')) {
		case 0:
			namespace = 'مضمون';
			break;
		case 6:
			namespace = 'فائل';
			break;
		// no default
	}

	var Window = new Morebits.simpleWindow(800, 410);
	Window.setTitle('مجوزہ‌حذف‌شدگی (محذ)');
	Window.setScriptName('پلک');

	var form = new Morebits.quickForm(Twinkle.prod.callback.evaluate);

	if (namespace === 'مضمون') {
		Window.addFooterLink('مجوزہ حذف شدگی کی حکمت عملی', 'وپ:محذ');
		Window.addFooterLink('بقید حیات شخصیات کی سوانح عمری کی مجوزہ حذف شدگی کی حکمت عملی', 'وپ:بقید حیات شخصیات کی سوانح عمری کی مجوزہ حذف شدگی');
	} else { // if file
		Window.addFooterLink('مجوزہ حذف شدگی کی حکمت عملی', 'وپ:محذ');
	}

	var field = form.append({
		type: 'field',
		label: 'مجوزہ حذف شدگی کی نوعیت',
		id: 'prodtype_fieldset'
	});

	field.append({
		type: 'div',
		label: '', // Added later by Twinkle.makeFindSourcesDiv()
		id: 'twinkle-prod-findsources',
		style: 'margin-bottom: 5px; margin-top: -5px;'
	});

	field.append({
		type: 'radio',
		name: 'prodtype',
		event: Twinkle.prod.callback.prodtypechanged,
		list: [
			{
				label: 'مجوزہ حذف شدگی',
				value: 'prod',
				checked: true,
				tooltip: '[[وپ:مجوزہ حذف شدگی]] کے مطابق عام مجوزہ حذف شدگی'
			},
			{
				label: 'بقید حیات شخصیات کی سوانح عمری کی مجوزہ حذف شدگی (بلا حوالہ)',
				value: 'prodblp',
				tooltip: '[[وپ:بحش محذ]] کے مطابق بقید حیات شخصیات کی نئی اور مکمل بلا حوالہ سوانح عمری کی مجوزہ حذف شدگی'
			}
		]
	});

	// Placeholder fieldset to be replaced in Twinkle.prod.callback.prodtypechanged
	form.append({
		type: 'field',
		name: 'parameters'
	});

	Window.addFooterLink('مجوزہ حذف شدگی کی ترجیحات', 'وپ:پلک/ترجیحات#prod');
	Window.addFooterLink('رہنمائے پلک', ':en:WP:TW/DOC#prod');
	Window.addFooterLink('آپ کے تاثرات', 'تبادلۂ خیال ویکیپیڈیا:پلک');

	form.append({ type: 'submit', label: 'حذف کی تجویز پیش کریں' });

	var result = form.render();
	Window.setContent(result);
	Window.display();

	// Hide fieldset for File PROD type since only normal PROD is allowed
	if (namespace !== 'مضمون') {
		$(result).find('#prodtype_fieldset').hide();
	}

	// Fake a change event on the first prod type radio, to initialize the type-dependent controls
	var evt = document.createEvent('Event');
	evt.initEvent('change', true, true);
	result.prodtype[0].dispatchEvent(evt);

};


Twinkle.prod.callback.prodtypechanged = function(event) {
	// prepare frame for prod type dependant controls
	var field = new Morebits.quickForm.element({
		type: 'field',
		label: 'پیرامیٹر',
		name: 'parameters'
	});
	// create prod type dependant controls
	switch (event.target.values) {
		case 'prod':
			field.append({
				type: 'checkbox',
				list: [
					{
						label: 'اگر ممکن ہو تو صفحہ ساز صارف کو اطلاع دیں',
						value: 'notify',
						name: 'notify',
						tooltip: 'اگر اس خانہ کو منتخب کریں تو صفحہ ساز صارف کے تبادلۂ خیال صفحہ میں اطلاعی سانچہ چسپاں کر دیا جائے گا۔',
						checked: true
					}
				]
			});
			field.append({
				type: 'textarea',
				name: 'reason',
				label: 'مجوزہ حذف شدگی کی وجہ:',
				value: Twinkle.prod.defaultReason
			});
			break;

		case 'prodblp':
			// first, remember the prod value that the user entered in the textarea, in case they want to switch back. We can abuse the config field for that.
			if (event.target.form.reason) {
				Twinkle.prod.defaultReason = event.target.form.reason.value;
			}

			field.append({
				type: 'checkbox',
				list: [
					{
						label: 'اگر ممکن ہو تو صفحہ ساز صارف کو اطلاع دیں',
						value: 'notify',
						name: 'notify',
						tooltip: 'صفحہ ساز صارف کو اطلاع دے دی گئی ہے۔',
						checked: true,
						disabled: true
					}
				]
			});
			// temp warning, can be removed down the line once BLPPROD is more established. Amalthea, May 2010.
			var boldtext = document.createElement('b');
			boldtext.appendChild(document.createTextNode('واضح رہے کہ یہ ٹیگ بقید حیات شخصیات کی ان سوانح عمریوں کے لیے ہے جو مکمل بلا حوالہ مواد پر مشتمل ہو، اگر مضمون میں حوالہ موجود ہے اور اس کے باوجود آپ اسے قابل حذف سمجھتے ہیں تو [[وپ:نبح]] پر اپنی تجویز پیش کریں۔'));
			field.append({
				type: 'div',
				label: boldtext
			});
			break;

		default:
			break;
	}

	Twinkle.makeFindSourcesDiv('#twinkle-prod-findsources');

	event.target.form.replaceChild(field.render(), $(event.target.form).find('fieldset[name="parameters"]')[0]);
};

// global params object, initially set in evaluate(), and
// modified in various callback functions
var params = {};

Twinkle.prod.callbacks = {
	checkPriors: function twinkleprodcheckPriors() {
		var talk_title = new mw.Title(mw.config.get('wgPageName')).getTalkPage().getPrefixedText();
		// Talk page templates for PROD-able discussions
		var blocking_templates = 'سانچہ:Old XfD multi|سانچہ:Old MfD|سانچہ:Oldffdfull|' + // Common prior XfD talk page templates
			'سانچہ:Oldpuffull|' + // Legacy prior XfD template
			'سانچہ:Olddelrev|' + // Prior DRV template
			'سانچہ:Old prod' +
			'سانچہ:گذشتہ نامزد مجوزہ حذف شدگی|' + 
			'سانچہ:Old prod full';
		var query = {
			action: 'query',
			titles: talk_title,
			prop: 'templates',
			tltemplates: blocking_templates,
			format: 'json',
			tllimit: 12 // 12 templates above
		};

		var wikipedia_api = new Morebits.wiki.api('تبادلۂ خیال صفحہ پر سابقہ نامزدگیوں کو تلاش کیا جا رہا ہے', query);
		return wikipedia_api.post().then(function(apiobj) {
			var statelem = apiobj.statelem;

			// Check talk page for templates indicating prior XfD or PROD
			var templates = apiobj.getResponse().query.pages[0].templates;
			var numTemplates = templates && templates.length;
			if (numTemplates) {
				var template = templates[0].title;
				if (numTemplates === 1 && (
						template === 'سانچہ:Old prod' ||
						template === 'سانچہ:گذشتہ نامزد مجوزہ حذف شدگی' ||
						template === 'سانچہ:Old prod full'
				)) {
					params.oldProdPresent = true; // Mark for reference later, when deciding if to endorse
				// if there are multiple templates, at least one of them would be a prior xfd template
				} else {
					statelem.warn('تبادلۂ خیال صفحہ پر نبح کا ٹیگ مل گیا، لہذا تجویز کی کارروائی منسوخ کی جا رہی ہے');
					return $.Deferred().reject();
				}
			}
		});
	},

	fetchCreationInfo: function twinkleprodFetchCreationInfo() {
		var def = $.Deferred();
		var ts = new Morebits.wiki.page(mw.config.get('wgPageName'), 'صفحہ ساز صارف کی تلاش جاری ہے');
		ts.setFollowRedirect(true);  // for NPP, and also because redirects are ineligible for PROD
		ts.setLookupNonRedirectCreator(true); // Look for author of first non-redirect revision
		ts.lookupCreation(function(pageobj) {
			params.initialContrib = pageobj.getCreator();
			params.creation = pageobj.getCreationTimestamp();
			pageobj.getStatusElement().info('مکمل، ' + params.initialContrib + ' کا نام سامنے آیا');
			def.resolve();
		}, def.reject);
		return def;
	},

	taggingPage: function twinkleprodTaggingPage() {
		var def = $.Deferred();

		var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), 'صفحہ پر ٹیگ لگایا جا رہا ہے');
		wikipedia_page.setFollowRedirect(true);  // for NPP, and also because redirects are ineligible for PROD
		wikipedia_page.load(function(pageobj) {
			var statelem = pageobj.getStatusElement();

			if (!pageobj.exists()) {
				statelem.error("ایسا معلوم ہوتا ہے کہ یہ صفحہ موجود نہیں ہے، شاید اسے حذف کر دیا گیا ہے۔");
				// reject, so that all dependent actions like notifyAuthor() and
				// addToLog() are cancelled
				return def.reject();
			}

			var text = pageobj.getPageText();

			// Check for already existing deletion tags
			var tag_re = /{{(?:(db|حذ)-?|(delete|حذف)\b|(article for deletion|نامزدگی برائے حذف)\/(dated|مورخہ)|AfDM|(ffd|حذف تصویر کی تجویز)\b)|#invoke:RfD/i;
			if (tag_re.test(text)) {
				statelem.warn('اس صفحہ میں حذف کا سانچہ پہلے ہی سے چسپاں ہے، لہذا تجویز کی کارروائی منسوخ کی جا رہی ہے');
				return def.reject();
			}


			// Remove tags that become superfluous with this action
			text = text.replace(/{{\s*(userspace draft|مسودہ صارف|ذخائر میں منتقلی|mtc|(copy|move|منتقلی) (to wikimedia commons|ویکی ذخائر میں|ذخائر میں)|(copy |move )?to ?commons)\s*(\|(?:{{[^{}]*}}|[^{}])*)?}}\s*/gi, '');
			var prod_re = /{{\s*(?:Prod blp|بحش محذ|Proposed deletion|مجوزہ حذف شدگی)\/(dated|پیغام)(?: files)?\s*\|(?:{{[^{}]*}}|[^{}])*}}/i;
			var summaryText;

			if (!prod_re.test(text)) {

				// Page previously PROD-ed
				if (params.oldProdPresent) {
					if (params.blp) {
						if (!confirm('اس صفحہ کے تبادلۂ خیال پر غیر سوانحی {{مجوزہ حذف شدگی}} کا سانچہ موجود ہے۔  کیا آپ «بقید حیات شخصیت کی بلا حوالہ سوانح عمری» کا ٹیگ لگانا چاہتے ہیں؟')) {
							statelem.warn('تبادلۂ خیال صفحہ پر مجوزہ حذف شدگی کا ٹیگ پہلے سے موجود تھا، اس لیے صارف نے تجویز کی کارروائی منسوخ کر دی');
							return def.reject();
						}
						statelem.info('تبادلۂ خیال صفحہ پر مجوزہ حذف شدگی کا ٹیگ پہلے سے موجود ہے؛ کارروائی آگے بڑھائی جا رہی ہے');
					} else {
						statelem.warn('تبادلۂ خیال صفحہ پر مجوزہ حذف شدگی کا ٹیگ پہلے سے موجود ہے؛ لہذا کارروائی منسوخ کی جا رہی ہے');
						return def.reject();
					}
				}

				var tag;
				if (params.blp) {
					summaryText = '[[وپ:بحش محذ]] کے تحت مضمون کی نامزدگی برائے حذف';
					tag = '{{جا:prod blp' + (params.usertalk ? '|help=off' : '') + '}}';
				} else {
					summaryText = '[[وپ:محذ]] کے تحت ' + namespace + ' کے حذف کی نامزدگی۔';
					tag = '{{جا:prod|1=' + Morebits.string.formatReasonText(params.reason) + (params.usertalk ? '|help=off' : '') + '}}';
				}

				// Insert tag after short description or any hatnotes
				var wikipage = new Morebits.wikitext.page(text);
				text = wikipage.insertAfterTemplates(tag + '\n', Twinkle.hatnoteRegex).getText();

			} else {  // already tagged for PROD, so try endorsing it
				var prod2_re = /{{(?:مجوزہ حذف شدگی کی تصدیق|prod-?2|حذف زمان‌دار تأییدشده).*?}}/i;
				if (prod2_re.test(text)) {
					statelem.warn('اس صفحہ میں پہلے سے {{مجوزہ حذف شدگی}} اور {{مجوزہ حذف شدگی کی تصدیق}} کے ٹیگ چسپاں ہیں، چنانچہ اس کارروائی کو منسوخ کیا جا رہا ہے');
					return def.reject();
				}
				var confirmtext = 'اس مضمون میں {{مجوزہ حذف شدگی}} کا سانچہ موجود ہے۔ \nکیا آپ {{مجوزہ حذف شدگی کی تصدیق}} کا ٹیگ اپنی تشریح کے ساتھ چسپاں کرنا چاہتے ہیں؟';
				if (params.blp && !/{{\s*(Prod blp\/dated|حذف زمان‌دار\/پیغام)/.test(text)) {
					confirmtext = 'اس مضمون میں غیر سوانحی {{مجوزہ حذف شدگی}} کا سانچہ موجود ہے۔  \nکیا آپ {{مجوزہ حذف شدگی کی تصدیق}} کا ٹیگ مع تشریح «بقید حیات شخصیت کی بلا حوالہ سوانح عمری» درج کرنا چاہتے ہیں؟';
				}
				if (!confirm(confirmtext)) {
					statelem.warn('صارف کی درخواست پر منسوخ کر دیا گیا');
					return def.reject();
				}

				summaryText = '[[وپ:" + (params.blp ? "بحش" : "") + " محذ]] کے مطابق مجوزہ حذف شدگی کی تصدیق۔';
				text = text.replace(prod_re, text.match(prod_re) + '\n{{مجوزہ حذف شدگی کی تصدیق|1=' + (params.blp ?
					'یہ مضمون [[وپ:بحش محذ|بقید حیات شخصیت کی بلا حوالہ سوانح عمری]] پر مشتمل ہے' :
					Morebits.string.formatReasonText(params.reason)) + '}}\n');

				params.logEndorsing = true;
			}

			// curate/patrol the page
			if (Twinkle.getPref('markProdPagesAsPatrolled')) {
				pageobj.patrol();
			}

			pageobj.setPageText(text);
			pageobj.setEditSummary(summaryText);
			pageobj.setChangeTags(Twinkle.changeTags);
			pageobj.setWatchlist(Twinkle.getPref('watchProdPages'));
			pageobj.setCreateOption('nocreate');
			pageobj.save(def.resolve, def.reject);

		}, def.reject);
		return def;
	},

	addOldProd: function twinkleprodAddOldProd() {
		var def = $.Deferred();

		if (params.oldProdPresent || params.blp) {
			return def.resolve();
		}

		// Add {{Old prod}} to the talk page
		var oldprodfull = '{{گذشتہ نامزد مجوزہ حذف شدگی|nom=' + mw.config.get('wgUserName') + '|nomdate={{subst:#time: j F Y}}}}\n';
		var talktitle = new mw.Title(mw.config.get('wgPageName')).getTalkPage().getPrefixedText();
		var talkpage = new Morebits.wiki.page(talktitle, 'تبادلۂ خیال صفحہ میں {{گذشتہ نامزد مجوزہ حذف شدگی}} کا ٹیگ لگایا جا رہا ہے');
		talkpage.setPrependText(oldprodfull);
		talkpage.setEditSummary('اضافہ {{گذشتہ نامزد مجوزہ حذف شدگی}}');
		talkpage.setChangeTags(Twinkle.changeTags);
		talkpage.setFollowRedirect(true);  // match behavior for page tagging
		talkpage.setCreateOption('recreate');
		talkpage.prepend(def.resolve, def.reject);
		return def;
	},

	notifyAuthor: function twinkleprodNotifyAuthor() {
		var def = $.Deferred();

		if (!params.blp && !params.usertalk) {
			return def.resolve();
		}

		// Disallow warning yourself
		if (params.initialContrib === mw.config.get('wgUserName')) {
			Morebits.status.info('صفحہ ساز کو اطلاع دی جا رہی ہے', 'آپ (' + params.initialContrib + ') نے بذات خود یہ صفحہ بنایا ہے، لہذا اطلاع رسانی کی کارروائی منسوخ کی جا رہی ہے');
			return def.resolve();
		}
		// [[Template:Proposed deletion notify]] supports File namespace
		var notifyTemplate;
		if (params.blp) {
			notifyTemplate = 'اطلاع مجوزہ حذف شدگی بحش';
		} else {
			notifyTemplate = 'اطلاع مجوزہ حذف شدگی';
		}
		var notifytext = '\n{{جا:' + notifyTemplate + '|1=' + Morebits.pageNameNorm + '|concern=' + params.reason + '}} ~~~~';

		var usertalkpage = new Morebits.wiki.page('تبادلۂ خیال صارف:' + params.initialContrib, 'اولین مشارکت کنندہ (' + params.initialContrib + ') کو اطلاع دی جا رہی ہے');
		usertalkpage.setAppendText(notifytext);
		usertalkpage.setEditSummary('اطلاع رسانی: [[:' + Morebits.pageNameNorm + ']] کے حذف کی تجویز');
		usertalkpage.setChangeTags(Twinkle.changeTags);
		usertalkpage.setCreateOption('recreate');
		usertalkpage.setFollowRedirect(true, false);
		usertalkpage.append(function onNotifySuccess() {
			// add nomination to the userspace log, if the user has enabled it
			params.logInitialContrib = params.initialContrib;
			def.resolve();
		}, def.resolve); // resolves even if notification was unsuccessful

		return def;
	},

	addToLog: function twinkleprodAddToLog() {
		if (!Twinkle.getPref('logProdPages')) {
			return $.Deferred().resolve();
		}
		var usl = new Morebits.userspaceLogger(Twinkle.getPref('prodLogPageName'));
		usl.initialText =
			"یہ [[وپ:مجوزہ حذف شدگی|مجوزہ حذف شدگی]] کے ان تمام ٹیگوں کا نوشتہ ہے جنھیں اس صارف نے [[وپ:پلک|پلک]] کے مجوزہ حذف شدگی ماڈیول کے ذریعہ لگائے ہیں یا ان کی تصدیق کی ہے۔\n\n" +
			'اگر آپ نوشتہ کو ختم کرنا چاہتے ہیں تو اسے [[وپ:پلک/ترجیحات|پلک کی ترجیحات]] سے غیر فعال کر دیں، اور ' + // localized
			'اس صفحہ کو [[وپ:فحذ#ص1|فحذ ص1]] کے تحت نامزد کر دیں۔\n';

		var logText = '# [[:' + Morebits.pageNameNorm + ']]';
		var summaryText;
		// If a logged file is deleted but exists on commons, the wikilink will be blue, so provide a link to the log
		logText += namespace === 'صارف' ? ' ([{{fullurl:خاص:نوشتہ|page=' + mw.util.wikiUrlencode(mw.config.get('wgPageName')) + '}} نوشتہ]): ' : ': ';
		if (params.logEndorsing) {
			logText += 'بقید حیات شخصیت کی سوانح عمری ' + (params.blp ? ' کی مجوزہ حذف شدگی کی تائید' : '') + '. ~~~~~';
			if (params.reason) {
				logText += "\n#* '''وجہ''': " + params.reason + '\n';
			}
			summaryText = 'صفحہ [[:' + Morebits.pageNameNorm + ']] کی مجوزہ حذف شدگی کے لیے نامزدگی کا نوشتہ میں اندراج۔';
		} else {
			logText += ' – بقید حیات شخصیت کی سوانح عمری ' + (params.blp ? ' کی مجوزہ حذف شدگی' : '');
			if (params.logInitialContrib) {
				logText += '؛ {{userv|' + params.logInitialContrib + '}} کو اطلاع دے دی گئی';
			}
			logText += ' ~~~~~\n';
			if (!params.blp && params.reason) {
				logText += "#* '''وجہ''': " + Morebits.string.formatReasonForLog(params.reason) + '\n';
			}
			summaryText = 'صفحہ [[:' + Morebits.pageNameNorm + ']] کی مجوزہ حذف شدگی کے لیے نامزدگی کا نوشتہ میں اندراج۔';
		}
		usl.changeTags = Twinkle.changeTags;

		return usl.log(logText, summaryText);
	}

};

Twinkle.prod.callback.evaluate = function twinkleprodCallbackEvaluate(e) {
	var form = e.target;
	var input = Morebits.quickForm.getInputData(form);

	params = {
		usertalk: input.notify || input.prodtype === 'prodblp',
		blp: input.prodtype === 'prodblp',
		reason: input.reason || '' // using an empty string here as fallback will help with prod-2.
	};

	if (!params.blp && !params.reason) {
		if (!confirm('آپ نے وجہ کا خانہ خالی چھوڑ دیا ہے۔ کیا آپ واقعی وجہ بتائے بغیر اپنی کارروائی جاری رکھنا چاہتے ہیں؟')) {
			return;
		}
	}

	Morebits.simpleWindow.setButtonsEnabled(false);
	Morebits.status.init(form);

	var tm = new Morebits.taskManager();
	var cbs = Twinkle.prod.callbacks; // shortcut reference, cbs for `callbacks`

	// Disable Morebits.wiki.numberOfActionsLeft system
	Morebits.wiki.numberOfActionsLeft = 1000;

	// checkPriors() and fetchCreationInfo() have no dependencies, they'll run first
	tm.add(cbs.checkPriors, []);
	tm.add(cbs.fetchCreationInfo, []);
	// tag the page once we're clear of the pre-requisites
	tm.add(cbs.taggingPage, [ cbs.checkPriors, cbs.fetchCreationInfo ]);
	// notify the author once we know who's the author, and also wait for the
	// taggingPage() as we don't need to notify if tagging was not done, such as
	// there was already a tag and the user chose not to endorse.
	tm.add(cbs.notifyAuthor, [ cbs.fetchCreationInfo, cbs.taggingPage ]);
	// oldProd needs to be added only if there wasn't one before, so need to wait
	// for checkPriors() to finish. Also don't add oldProd if tagging itself was
	// aborted or unsuccessful
	tm.add(cbs.addOldProd, [ cbs.taggingPage, cbs.checkPriors ]);
	// add to log only after notifying author so that the logging can be adjusted if
	// notification wasn't successful. Also, don't run if tagging was not done.
	tm.add(cbs.addToLog, [ cbs.notifyAuthor, cbs.taggingPage ]);
	// All set, go!
	tm.execute().then(function() {
		Morebits.status.actionCompleted('ٹیگ کاری مکمل');
		setTimeout(function () {
			window.location.href = mw.util.getUrl(mw.config.get('wgPageName'));
		}, Morebits.wiki.actionCompleted.timeOut);
	});
};

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


// </nowiki>