مدیاویکی:Gadget-twinkleprod-2020.js: تفاوت میان نسخه‌ها

از ویکی حقوق
پرش به ناوبری پرش به جستجو
fa.wikipedia.org>Huji
(قسمت‌هایی از کد که غیرفعال کرده‌ایم یا عملاً استفاده نمی‌شوند، ترجمه نشوند بهتر است؛ در آینده مقایسهٔ کد و روزآمدسازی‌اش را راحت‌تر خواهد کرد)
 
جز (۱ نسخه واردشده)
(بدون تفاوت)

نسخهٔ ‏۹ مهٔ ۲۰۲۱، ساعت ۱۹:۰۰

// <nowiki>


(function($) {


/*
 ****************************************
 *** twinkleprod.js: PROD module
 ****************************************
 * Mode of invocation:     Tab ("PROD")
 * Active on:              Existing articles, files, books which are not redirects,
 *                         and user pages in [[:Category:Wikipedia books (user books)]]
 */

Twinkle.prod = function twinkleprod() {
	// if ((([0, 6, 108].indexOf(mw.config.get('wgNamespaceNumber')) === -1) && (mw.config.get('wgNamespaceNumber') !== 2 || mw.config.get('wgCategories').indexOf('Wikipedia books (user books)') === -1)) // localized [see line below]
	if (([0, 6].indexOf(mw.config.get('wgNamespaceNumber')) === -1)
		|| !mw.config.get('wgCurRevisionId') || Morebits.wiki.isPageRedirect()) {
		return;
	}

	Twinkle.addPortletLink(Twinkle.prod.callback, 'حذف زمان‌دار', 'tw-prod', 'حذف زمان‌دار طبق وپ:حز'); // localized
};

// 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 = 'مقاله'; // localized
			break;
		case 6:
			namespace = 'پرونده'; // localized
			break;
		/*
		case 2:
		case 108:
			namespace = 'book';
			break;
		// no default
		*/ // localiezd [removed]
	}

	var Window = new Morebits.simpleWindow(800, 410);
	Window.setTitle('حذف زماندار'); // localized
	Window.setScriptName('توینکل'); // localiezd

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

	if (namespace === 'مقاله') { // localized
		Window.addFooterLink('سیاست حذف زمان‌دار', 'وپ:زمان‌دار'); // localized
		/*
		Window.addFooterLink('BLP PROD policy', 'WP:BLPPROD');
		*/ // localized [removed]
	} else if (namespace === 'پرونده') { // localized
		Window.addFooterLink('سیاست حذف زمان‌دار', 'وپ:زمان‌دار'); // localized
	} /*else { // if book
		Window.addFooterLink('Proposed deletion (books) policy', 'WP:BOOKPROD'); // not translated 
	}*/ // loacalized [removed]

	var field = form.append({
		type: 'field',
		label: 'نوع حذف', // localized
		id: 'prodtype_fieldset'
	});

	field.append({
		type: 'radio',
		name: 'prodtype',
		event: Twinkle.prod.callback.prodtypechanged,
		list: [
			{
				label: 'حذف زمان‌دار', // localized
				value: 'prod',
				checked: true,
				tooltip: 'پیشنهاد حذف عادی، طبق [[وپ:حز]]' // localized
			}/*,
			{
				label: 'BLP PROD (proposed deletion of unsourced BLPs)',
				value: 'prodblp',
				tooltip: 'Proposed deletion of new, completely unsourced biographies of living persons, per [[WP:BLPPROD]]'
			}*/ // localized [removed]
		]
	});

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

	Window.addFooterLink('راهنمای توینکل', 'وپ:توینکل/توضیحات'); // localized

	form.append({ type: 'submit', label: 'حذف زمان‌دار' }); // localized

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

	// Hide fieldset for File and Book PROD types since only normal PROD is allowed
	if (namespace !== 'مقاله') { // localized
		$(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.dispatchEvent(evt); // localized

};


Twinkle.prod.callback.prodtypechanged = function(event) {
	// prepare frame for prod type dependant controls
	var field = new Morebits.quickForm.element({
		type: 'field',
		label: 'پارامترها', // localized
		name: 'parameters'
	});
	// create prod type dependant controls
	switch (event.target.values) {
		case 'prod':
			field.append({
				type: 'checkbox',
				list: [
					{
						label: 'آگاه کردن سازندهٔ صفحه در صورت امکان', // localized
						value: 'notify',
						name: 'notify',
						tooltip: "در صورت انتخاب این گزینه در صفحه بحث نویسنده مقاله، الگوی اطلاع‌رسانی درج می‌شود", // localized
						checked: true
					}
				]
			});
			field.append({
				type: 'textarea',
				name: 'reason',
				label: 'دلیل برای حذف زمان‌دار:', // localized
				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: 'آگاه کردن سازندهٔ صفحه در صورت امکان', // localized
						value: 'notify',
						name: 'notify',
						tooltip: 'سازندهٔ مقاله باید مطلع شود.', // localized
						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('لطفا به یاد داشته باشید که این برچسب فقط برای مقالات بدون منبع زندگی‌نامه افراد زنده است.')); // localized
			field.append({
				type: 'div',
				label: boldtext
			});
			break;

		default:
			break;
	}

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

Twinkle.prod.callbacks = {
	checkpriors: function(apiobj) {
		/*
		var xmlDoc = apiobj.responseXML;
		var statelem = apiobj.statelem;
		*/ // localized [removed]
		var params = apiobj.params;

		/*
		// Check talk page for templates indicating prior XfD or PROD
		var numTemplates = $(xmlDoc).find('templates tl').length;
		if (numTemplates) {
			var template = $(xmlDoc).find('templates tl')[0].getAttribute('title');
			if (numTemplates === 1 && template === 'Template:Old prod') {
				if (params.blp) {
					if (!confirm('Previous PROD nomination found on talk page. Do you still want to continue applying BLPPROD? ')) {
						statelem.warn('Previous PROD found on talk page, aborted by user');
						return;
					}
					statelem.info('Previous PROD found on talk page, continuing');
				} else {
					statelem.warn('Previous PROD found on talk page, aborting procedure');
					return;
				}

			// if there are multiple templates, at least one of them would be a prior xfd template
			} else {
				statelem.warn('Previous XfD template found on talk page, aborting procedure');
				return;
			}
		}
		*/ // localized [removed]

		var ts = new Morebits.wiki.page(mw.config.get('wgPageName'));
		ts.setFollowRedirect(true);  // for NPP, and also because redirects are ineligible for PROD
		ts.setCallbackParameters(params);
		ts.setLookupNonRedirectCreator(true); // Look for author of first non-redirect revision
		ts.lookupCreation(Twinkle.prod.callbacks.creationInfo);
	},

	creationInfo: function(pageobj) {
		var params = pageobj.getCallbackParameters();
		params.initialContrib = pageobj.getCreator();
		params.creation = pageobj.getCreationTimestamp();

		Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
		Morebits.wiki.actionCompleted.notice = 'برچسب زدن تمام شد'; // localized

		var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), 'برچسب زدن به صفحه'); // localized
		wikipedia_page.setFollowRedirect(true);  // for NPP, and also because redirects are ineligible for PROD
		wikipedia_page.setCallbackParameters(params);
		wikipedia_page.load(Twinkle.prod.callbacks.main);
	},

	main: function(pageobj) {
		var statelem = pageobj.getStatusElement();

		if (!pageobj.exists()) {
			statelem.error("به نظر می‌آید که صفحه وجود ندارد. احتمالا قبلا حذف شده است."); // localized
			return;
		}

		var text = pageobj.getPageText();
		var params = pageobj.getCallbackParameters();

		// Check for already existing deletion tags
		var tag_re = /{{(?:db-?|delete|حذف سریع|حذف زمان‌دار|نظرخواهی برای حذف|article for deletion\/dated|ffd\b)|#invoke:RfD/i; // localized
		if (tag_re.test(text)) {
			statelem.warn('صفحه در حال حاضر برچسب حذف دارد. نامزدی حذف زمان‌دار متوقف شد'); // localized
			return;
		}

		// Alert if article is at least three days old, not in Category:Living people, and BLPPROD is selected
		if (params.blp) {
			var isMoreThan3DaysOld = new Morebits.date(params.creation).add(3, 'days').isAfter(new Date(pageobj.getLoadTime()));
			var blpcheck_re = /\[\[Category:افراده زنده\]\]/i; // localized
			if (!blpcheck_re.test(text) && isMoreThan3DaysOld) {
				if (!confirm('توجه کنید که مقاله در رده:افراد زنده قرار ندارد و به همین دلیل حذف زماندار طبق [[وپ:حزز]] برای آن مناسب نیست. آیا مطمئنید که می‌خواهید ادامه دهید؟')) { // localized
					return;
				}
			}
		}

		// 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|book-prod)\/dated(?: files)?\s*\|(?:{{[^{}]*}}|[^{}])*}}/i; // localized
		var summaryText;
		if (!prod_re.test(text)) {
			// Notification to first contributor
			if (params.usertalk) {
				// Disallow warning yourself
				if (params.initialContrib === mw.config.get('wgUserName')) {
					statelem.warn('خود شما (' + params.initialContrib + ') را ایجاد کرده‌اید؛ توقف اطلاع‌رسانی به کاربر'); // localized
					if (Twinkle.getPref('logProdPages')) {
						Twinkle.prod.callbacks.addToLog(params);
					}
				} else {
					// [[Template:Proposed deletion notify]] supports File namespace
					var notifyTemplate;
					if (params.blp) {
						notifyTemplate = 'prodwarningBLP';
					} else if (params.book) {
						notifyTemplate = 'bprodwarning';
					} else {
						notifyTemplate = 'هشدار حذف زمان‌دار'; // localized
					}
					var notifytext = '\n{{subst:' + notifyTemplate + '|1=' + Morebits.pageNameNorm + '|دلیل=' + params.reason + '}} ~~~~'; // localized

					var usertalkpage = new Morebits.wiki.page('User talk:' + params.initialContrib, 'اطلاع‌رسانی به سازنده صفحه (' + params.initialContrib + ')'); // localized
					usertalkpage.setAppendText(notifytext);
					usertalkpage.setEditSummary('اطلاع‌رسانی: پیشنهاد حذف [[:' + Morebits.pageNameNorm + ']].' + Twinkle.getPref('summaryAd')); // localized
					usertalkpage.setCreateOption('recreate');
					usertalkpage.setFollowRedirect(true);
					usertalkpage.setCallbackParameters(params);
					usertalkpage.append(function onNotifySuccess() {
						// add nomination to the userspace log, if the user has enabled it
						if (Twinkle.getPref('logProdPages')) {
							params.logInitialContrib = params.initialContrib;
							Twinkle.prod.callbacks.addToLog(params);
						}
					}, function onNotifyError() {
						// if user could not be notified, log nomination without mentioning that notification was sent
						if (Twinkle.getPref('logProdPages')) {
							Twinkle.prod.callbacks.addToLog(params);
						}
					});
				}
			} else if (Twinkle.getPref('logProdPages')) { // If not notifying, log this PROD
				Twinkle.prod.callbacks.addToLog(params);
			}
			if (params.blp) {
				summaryText = 'درج پیشنهاد حذف زمان‌دار براساس [[وپ:حزز]]'; // localized
				text = '{{subst:prod blp' + (params.usertalk ? '|help=off' : '') + '}}\n' + text;
			} /*else if (params.book) {
				summaryText = 'Proposing book for deletion per [[WP:BOOKPROD]].';
				text = '{{subst:book-prod|1=' + Morebits.string.formatReasonText(params.reason) + (params.usertalk ? '|help=off' : '') + '}}\n' + text;
			} */ else {
				summaryText = 'نامزد کردن ' + namespace + ' برای حذف زمان‌دار طبق [[وپ:حز]].'; // localized
				text = '{{subst:حذف زماندار|1=' + Morebits.string.formatReasonText(params.reason) + (params.usertalk ? '|help=off' : '') + '}}\n' + text; // localiezd
			}

			// Add {{Old prod}} to the talk page
			/*
			var oldprodfull = '{{Old prod|nom=' + mw.config.get('wgUserName') + '|nomdate={{subst:#time: Y-m-d}}}}\n';
			var talktitle = new mw.Title(mw.config.get('wgPageName')).getTalkPage().getPrefixedText();
			var talkpage = new Morebits.wiki.page(talktitle, 'Placing {{Old prod}} on talk page');
			talkpage.setPrependText(oldprodfull);
			talkpage.setEditSummary('Adding {{Old prod}}' + Twinkle.getPref('summaryAd'));
			talkpage.setFollowRedirect(true);  // match behavior for page tagging
			talkpage.setCreateOption('recreate');
			talkpage.prepend();
			*/ // localized [removed]
		} else {  // already tagged for PROD, so try endorsing it
			/*
			var prod2_re = /{{(?:Proposed deletion endorsed|prod-?2).*?}}/i;
			if (prod2_re.test(text)) {
				statelem.warn('Page already tagged with {{proposed deletion}} and {{proposed deletion endorsed}} templates, aborting procedure');
				return;
			}
			var confirmtext = 'A {{proposed deletion}} tag was already found on this page. \nWould you like to add a {{proposed deletion endorsed}} tag with your explanation?';
			if (params.blp) {
				confirmtext = 'A non-BLP {{proposed deletion}} tag was found on this article.\nWould you like to add a {{proposed deletion endorsed}} tag with explanation "article is a biography of a living person with no sources"?';
				// FIXME: this msg is shown even if it was a BLPPROD tag.
			}
			if (!confirm(confirmtext)) {
				statelem.warn('Aborted per user request');
				return;
			}

			// summaryText = 'Endorsing proposed deletion per [[WP:' + (params.blp ? 'BLP' : params.book ? 'BOOK' : '') + 'PROD]].'; // localized [see next line]
			summaryText = text.replace(prod_re, text.match(prod_re) + '\n{{Proposed deletion endorsed|1=' + (params.blp ?
			text = text.replace(prod_re, text.match(prod_re) + '\n{{Proposed deletion endorsed|1=' + (params.blp ?
				'article is a [[WP:BLPPROD|biography of a living person with no sources]]' :
				Morebits.string.formatReasonText(params.reason)) + '}}\n');

			if (Twinkle.getPref('logProdPages')) {
				params.logEndorsing = true;
				Twinkle.prod.callbacks.addToLog(params);
			}
			*/ // localized [removed]
		}

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

		pageobj.setPageText(text);
		pageobj.setEditSummary(summaryText + Twinkle.getPref('summaryAd'));
		pageobj.setWatchlist(Twinkle.getPref('watchProdPages'));
		pageobj.setCreateOption('nocreate');
		pageobj.save();
	},

	addToLog: function(params) {
		var usl = new Morebits.userspaceLogger(Twinkle.getPref('prodLogPageName'));
		usl.initialText =
			"این صفحه فهرستی از مواردی که این کاربر با استفاده از [[وپ:توینکل|توینکل]] برای [[وپ:حز|حذف زمان‌دار]] نامزد کرده‌است را نشان می‌دهد.\n\n" + // localized
			'اگر نمی‌خواهید موارد جدید به این سیاهه اضافه شوند، آن را از طریق [[وپ:توینکل تر|ترجیحات توینکل]] غیرفعال کنید' + // localized
			'و اگر می‌خواهید سیاهه کلاً حذف شود آن را بر اساس معیار [[وپ:محس#ک۱|ک۱]] نامزد حذف سریع کنید.\n'; // localized

		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:Special:Log|page=' + mw.util.wikiUrlencode(mw.config.get('wgPageName')) + '}} log]): ' : ': '; // localized
		if (params.logEndorsing) {
			logText += 'endorsed ' + (params.blp ? 'BLP ' : params.book ? 'BOOK' : '') + 'PROD. ~~~~~';
			if (params.reason) {
				logText += "\n#* '''Reason''': " + params.reason + '\n';
			}
			summaryText = 'Logging endorsement of PROD nomination of [[:' + Morebits.pageNameNorm + ']].';
		} else {
			// logText += (params.blp ? 'BLP ' : params.book ? 'BOOK' : '') + 'PROD'; // localized [see next line]
			logText += 'حذف زماندار'; // localized
			if (params.logInitialContrib) {
				logText += '; {{کاربر|' + params.logInitialContrib + '}} مطلع شد'; // localized
			}
			logText += ' ~~~~~\n';
			if (!params.blp) {
				logText += "#* '''دلیل''': " + params.reason + '\n'; // localized
			}
			summaryText = 'ثبت نامزدی [[:' + Morebits.pageNameNorm + ']] در سیاههٔ کاربری شما.'; // localized
		}

		usl.log(logText, summaryText + Twinkle.getPref('summaryAd'));

	}

};

Twinkle.prod.callback.evaluate = function twinkleprodCallbackEvaluate(e) {
	var form = e.target;
	var prodtype;

	/*
	if (namespace === 'مقاله') { // localized
		var prodtypes = form.prodtype;
		for (var i = 0; i < prodtypes.length; i++) {
			if (prodtypes[i].checked) {
				prodtype = prodtypes[i].values;
				break;
			}
		}
	}
	*/ // localiezd [removed]

	var params = {
		usertalk: form.notify.checked,
		blp: prodtype === 'prodblp',
		book: namespace === 'book',
		reason: prodtype === 'prodblp' ? '' : form.reason.value  // using an empty string here as fallback will help with prod-2.
	};

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

	/*
	var talk_title = new mw.Title(mw.config.get('wgPageName')).getTalkPage().getPrefixedText();
	// Talk page templates for PROD-able discussions
	var blocking_templates = 'Template:Old XfD multi|Template:Old MfD|Template:Oldffdfull|' + // Common prior XfD talk page templates
		'Template:Oldpuffull|' + // Legacy prior XfD template
		'Template:Olddelrev|' + // Prior DRV template
		'Template:Old prod';
	var query = {
		'action': 'query',
		'titles': talk_title,
		'prop': 'templates',
		'tltemplates': blocking_templates
	};

	var wikipedia_api = new Morebits.wiki.api('Checking talk page for prior nominations', query, Twinkle.prod.callbacks.checkpriors);
	wikipedia_api.params = params;
	wikipedia_api.post();
	*/ // localized [removed]
	Twinkle.prod.callbacks.checkpriors({'params': params}); // localized [added]
};
})(jQuery);


// </nowiki>