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

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


(function($) {


/*
 ****************************************
 *** twinkleimage.js: Image CSD module
 ****************************************
 * Mode of invocation:     Tab ("DI")
 * Active on:              Local nonredirect file pages (not on Commons)
 */

Twinkle.image = function twinkleimage() {
	if (mw.config.get('wgNamespaceNumber') === 6 && mw.config.get('wgArticleId') && !document.getElementById('mw-sharedupload') && !Morebits.wiki.isPageRedirect()) {
		Twinkle.addPortletLink(Twinkle.image.callback, 'تصاویر', 'tw-di', 'نامزد کردن تصاویر برای حذف سریع با تأخیر'); // localized
	}
};

Twinkle.image.callback = function twinkleimageCallback() {
	var Window = new Morebits.simpleWindow(600, 330);
	Window.setTitle('نامزد کردن برای حذف سریع با تأخیر'); // localized
	Window.setScriptName('توینکل'); // localized
	Window.addFooterLink('سیاست حذف سریع', 'وپ:محس#پرونده‌ها'); // localized
	Window.addFooterLink('راهنمای توینکل', 'en:WP:TW/DOC#image'); // localized

	var form = new Morebits.quickForm(Twinkle.image.callback.evaluate);
	form.append({
		type: 'checkbox',
		list: [
			{
				label: 'آگاه‌سازی بارگذار اصلی',
				value: 'notify',
				name: 'notify',
				tooltip: "اگر می‌خواهید چندین تصویری که یک کاربر بارگذاری کرده را نامزد کنید، این گزینه را غیرفعال کنید تا صفحهٔ بحث‌شان بر اثر تعدد پیام‌ها شلوغ نشود.", // localized
				checked: Twinkle.getPref('notifyUserOnDeli')
			}
		]
	}
	);
	var field = form.append({
		type: 'field',
		label: 'نوع کنش مورد نیاز' // localized
	});
	field.append({
		type: 'radio',
		name: 'type',
		event: Twinkle.image.callback.choice,
		list: [
			{
				label: 'بدون منبع (محس پ۴)', // localized
				value: 'no source',
				checked: true,
				tooltip: 'تصویر یا پروندهٔ بدون منبع' // localized
			},
			{
				label: 'بدون مجوز (محس پ۴)', // localized
				value: 'no license',
				tooltip: 'تصویر یا پرونده فاقد اطلاعات در مورد وضعیت حق تکثیر' // localized
			},
			{
				label: 'بدون منبع و بدون مجوز (محس پ۴)', // localized
				value: 'no source no license',
				tooltip: 'تصویر یا پرونده‌ای که نه اطلاعاتی راجع به منبع دارد و نه راجع به وضعیت حق تکثیر' // localized
			},
			{
				label: 'استفادهٔ منصفانهٔ یتیم (محس پ۵)', // localized
				value: 'orphaned fair use',
				tooltip: 'تصویر یا پرونده‌ای که برای استفادهٔ منصفانه در ویکی‌پدیا بارگذاری شده‌است اما در هیچ مقاله‌ای استفاده نمی‌شود' // localized
			},
			{
				label: 'فاقد توضیح در مورد استفادهٔ منصفانه (محس پ۶)', // localized
				value: 'no fair use rationale',
				tooltip: 'تصویر یا پرونده برای استفادهٔ منصفانه در ویکی‌پدیا بارگذاری شده‌است اما توضیحی داده نشده که چرا شرایط استفادهٔ منصفانه را داراست' // localized
			},
			{
				label: 'ادعای نادرست در مورد استفادهٔ منصفانه (محس پ۷)', // localized
				value: 'disputed fair use rationale',
				tooltip: 'تصویر یا پرونده‌ای که استدلال ارائه شده برای استفادهٔ منصفانه از آن به چالش کشیده شده‌است' // localized
			},
			{
				label: 'استفادهٔ منصفانه قابل جایگزینی (محس پ۷)', // localized
				value: 'replaceable fair use',
				tooltip: 'تصویر یا پرونده‌ای که شرط اول استفادهٔ منصفانه برایش صادق نیست، یعنی موضوعی را نمایش می‌دهد که برایش پروندهٔ آزاد قابل تهیه است' // localized
			},
			{
				label: 'بدون مدرک در مورد مجوز (محس پ۱۱)', // localized
				value: 'no permission',
				tooltip: 'تصویر یا پرونده‌ای که مستندات کافی برای آن‌که نشان دهد خالق اثر اجازهٔ استفاده از آن را داده‌است، موجود نیست' // localized
			}
		]
	});
	form.append({
		type: 'div',
		label: 'Work area',
		name: 'work_area'
	});
	form.append({ type: 'submit' });

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

	// We must init the parameters
	var evt = document.createEvent('Event');
	evt.initEvent('change', true, true);
	result.type[0].dispatchEvent(evt);
};

Twinkle.image.callback.choice = function twinkleimageCallbackChoose(event) {
	var value = event.target.values;
	var root = event.target.form;
	var work_area = new Morebits.quickForm.element({
		type: 'div',
		name: 'work_area'
	});

	switch (value) {
		case 'no source no license':
		case 'no source':
			work_area.append({
				type: 'checkbox',
				name: 'non_free',
				list: [
					{
						label: 'غیر آزاد', // localized
						tooltip: 'پرونده با ادعای استفادهٔ منصفانه بارگذاری شده‌است' // localized
					}
				]
			});
		/* falls through */
		case 'no license':
			work_area.append({
				type: 'checkbox',
				name: 'derivative',
				list: [
					{
						label: 'تصویر اشتقاقی که منبع اثر اصلی برای ذکر نشده‌است', // localized
						tooltip: 'پرونده از اشتقاق یک یا چند اثر دیگر حاصل شده‌است و منبع آن آثار مشخص نشده‌است' // localized
					}
				]
			});
			break;
		case 'no permission':
			work_area.append({
				type: 'input',
				name: 'source',
				label: 'منبع: ' // localized
			});
			break;
		case 'disputed fair use rationale':
			work_area.append({
				type: 'textarea',
				name: 'reason',
				label: 'اشکال: ' // localized
			});
			break;
		case 'orphaned fair use':
			work_area.append({
				type: 'input',
				name: 'replacement',
				label: 'جایگزین: ', // localized
				tooltip: 'Optional file that replaces this one.  The "File:" prefix is optional.'
			});
			break;
		case 'replaceable fair use':
			work_area.append({
				type: 'textarea',
				name: 'reason',
				label: 'دلیل: ' // localized
			});
			break;
		default:
			break;
	}

	root.replaceChild(work_area.render(), $(root).find('div[name="work_area"]')[0]);
};

Twinkle.image.callback.evaluate = function twinkleimageCallbackEvaluate(event) {
	var type, non_free, source, reason, replacement, derivative;

	var notify = event.target.notify.checked;
	var types = event.target.type;
	for (var i = 0; i < types.length; ++i) {
		if (types[i].checked) {
			type = types[i].values;
			break;
		}
	}
	if (event.target.non_free) {
		non_free = event.target.non_free.checked;
	}
	if (event.target.source) {
		source = event.target.source.value;
	}
	if (event.target.reason) {
		reason = event.target.reason.value;
	}
	if (event.target.replacement && event.target.replacement.value.trim()) {
		replacement = event.target.replacement.value;
		replacement = /^\s*(Image|File):/i.test(replacement) ? replacement : 'File:' + replacement;
	}
	if (event.target.derivative) {
		derivative = event.target.derivative.checked;
	}

	var csdcrit;
	switch (type) {
		case 'no source no license':
		case 'no source':
		case 'no license':
			csdcrit = 'پ۴'; // localized
			break;
		case 'orphaned fair use':
			csdcrit = 'پ۵'; // localized
			break;
		case 'no fair use rationale':
			csdcrit = 'پ۶'; // localized
			break;
		case 'disputed fair use rationale':
		case 'replaceable fair use':
			csdcrit = 'پ۷'; // localized
			break;
		case 'no permission':
			csdcrit = 'پ۱۱'; // localized
			break;
		default:
			throw new Error('Twinkle.image.callback.evaluate: unknown criterion');
	}

	var lognomination = Twinkle.getPref('logSpeedyNominations') && Twinkle.getPref('noLogOnSpeedyNomination').indexOf(csdcrit.toLowerCase()) === -1;
	var templatename = derivative ? 'dw ' + type : type;

	var params = {
		'type': type,
		'templatename': templatename,
		'normalized': csdcrit,
		'non_free': non_free,
		'source': source,
		'reason': reason,
		'replacement': replacement,
		'lognomination': lognomination
	};
	Morebits.simpleWindow.setButtonsEnabled(false);
	Morebits.status.init(event.target);

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

	// Tagging image
	var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), 'افزودن برچسب حذف به پرونده'); // localized
	wikipedia_page.setCallbackParameters(params);
	wikipedia_page.load(Twinkle.image.callbacks.taggingImage);

	// Notifying uploader
	if (notify) {
		wikipedia_page.lookupCreation(Twinkle.image.callbacks.userNotification);
	} else {
		// add to CSD log if desired
		if (lognomination) {
			params.fromDI = true;
			Twinkle.speedy.callbacks.user.addToLog(params, null);
		}
		// No auto-notification, display what was going to be added.
		var noteData = document.createElement('pre');
		noteData.appendChild(document.createTextNode('{{subst:di-' + templatename + '-notice|1=' + mw.config.get('wgTitle') + '}} ~~~~'));
		Morebits.status.info('آگاه‌سازی', [ 'این اطلاعات یا مشابه آن باید به بارگذار اصلی پرونده فرستاده شود:', document.createElement('br'), noteData ]); // localized
	}
};

Twinkle.image.callbacks = {
	taggingImage: function(pageobj) {
		var text = pageobj.getPageText();
		var params = pageobj.getCallbackParameters();

		// remove "move to Commons" tag - deletion-tagged files cannot be moved to Commons
		text = text.replace(/\{\{(mtc|(copy |move )?to ?commons|move to wikimedia commons|copy to wikimedia commons)[^}]*\}\}/gi, '');

		var tag = '{{di-' + params.templatename + '|date={{subst:#time:j F Y||en}}';
		switch (params.type) {
			case 'no source no license':
			case 'no source':
				tag += params.non_free ? '|non-free=yes' : '';
				break;
			case 'no permission':
				tag += params.source ? '|source=' + params.source : '';
				break;
			case 'disputed fair use rationale':
				tag += params.reason ? '|concern=' + params.reason : '';
				break;
			case 'orphaned fair use':
				tag += params.replacement ? '|replacement=' + params.replacement : '';
				break;
			case 'replaceable fair use':
				tag += params.reason ? '|1=' + params.reason : '';
				break;
			default:
				break;  // doesn't matter
		}
		tag += '|help=off}}\n';

		pageobj.setPageText(tag + text);
		pageobj.setEditSummary('این پرونده طبق [[وپ:محس#' + params.normalized + '|مسح ' + params.normalized + ']] نامزد حذف شده‌است (' + params.type + ').' + Twinkle.getPref('summaryAd')); // localized
		switch (Twinkle.getPref('deliWatchPage')) {
			case 'yes':
				pageobj.setWatchlist(true);
				break;
			case 'no':
				pageobj.setWatchlistFromPreferences(false);
				break;
			default:
				pageobj.setWatchlistFromPreferences(true);
				break;
		}
		pageobj.setCreateOption('nocreate');
		pageobj.save();
	},
	userNotification: function(pageobj) {
		var params = pageobj.getCallbackParameters();
		var initialContrib = pageobj.getCreator();

		// disallow warning yourself
		if (initialContrib === mw.config.get('wgUserName')) {
			pageobj.getStatusElement().warn('این پرونده را شما (' + initialContrib + ') ایجاد کرده‌اید؛ از آگاه‌سازی صرف نظر شد'); // localized
		} else {
			var usertalkpage = new Morebits.wiki.page('User talk:' + initialContrib, 'آگاه‌سازی بارگذار اصلی (' + initialContrib + ')'); // localized
			var notifytext = '\n{{subst:di-' + params.templatename + '-notice|1=' + mw.config.get('wgTitle');
			if (params.type === 'no permission') {
				notifytext += params.source ? '|source=' + params.source : '';
			}
			notifytext += '}} ~~~~';
			usertalkpage.setAppendText(notifytext);
			usertalkpage.setEditSummary('آگاه‌سازی: برچسب زدن برای حذف [[:' + Morebits.pageNameNorm + ']].' + Twinkle.getPref('summaryAd')); // localized
			usertalkpage.setCreateOption('recreate');
			switch (Twinkle.getPref('deliWatchUser')) {
				case 'yes':
					usertalkpage.setWatchlist(true);
					break;
				case 'no':
					usertalkpage.setWatchlistFromPreferences(false);
					break;
				default:
					usertalkpage.setWatchlistFromPreferences(true);
					break;
			}
			usertalkpage.setFollowRedirect(true);
			usertalkpage.append();
		}

		// add this nomination to the user's userspace log, if the user has enabled it
		if (params.lognomination) {
			params.fromDI = true;
			Twinkle.speedy.callbacks.user.addToLog(params, initialContrib);
		}
	}
};
})(jQuery);


// </nowiki>