مدیاویکی:Gadget-twinkleprod.js

از ایران پدیا
پرش به ناوبری پرش به جستجو

نکته: پس از انتشار ممکن است برای دیدن تغییرات نیاز باشد که حافظهٔ نهانی مرورگر خود را پاک کنید.

  • فایرفاکس / سافاری: کلید Shift را نگه دارید و روی دکمهٔ Reload کلیک کنید، یا کلید‌های Ctrl-F5 یا Ctrl-R را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های ⌘-R)
  • گوگل کروم: کلیدهای Ctrl+Shift+R را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های ⌘-Shift-R)
  • اینترنت اکسپلورر/ Edge: کلید Ctrl را نگه‌دارید و روی دکمهٔ Refresh کلیک کنید، یا کلید‌های Ctrl-F5 را با هم فشار دهید
  • اپرا: Ctrl-F5 را بفشارید.
//<nowiki>


(function($){


/*
 ****************************************
 *** twinkleprod.js: PROD module
 ****************************************
 * Mode of invocation:     Tab ("زمان‌دار")
 * Active on:              Existing articles which are not redirects
 * Config directives in:   TwinkleConfig
 */

Twinkle.prod = function twinkleprod() {
	if( mw.config.get('wgNamespaceNumber') !== 0 || !mw.config.get('wgCurRevisionId') || Morebits.wiki.isPageRedirect() ) {
		return;
	}
	
	Twinkle.addPortletLink( Twinkle.prod.callback, "زمان‌دار", "tw-prod", "نامزدی برای حذف مطابق اپ:زمان‌دار" );
};

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

	var Window = new Morebits.simpleWindow( 800, 410 );
	Window.setTitle( "حذف زمان‌دار" );
	Window.setScriptName( "توینکل" );
	Window.addFooterLink( "سیاست حذف زمان‌دار", "اپ:زمان‌دار" );
	Window.addFooterLink( "سیاست حذف زمان‌دار زندگی‌نامه زندگان", "اپ:حززز" );
	Window.addFooterLink( "راهنمای توینکل", "ip:TW/DOC#prod" );

	var form = new Morebits.quickForm( Twinkle.prod.callback.evaluate );
	
	var field = form.append( {
			type: 'field',
			label: 'نوع حذف زمان‌دار'
		} );
	field.append( {
			type: 'radio',
			name: 'prodtype',
			event: Twinkle.prod.callback.prodtypechanged,
			list: [
				{
					label: 'حذف زمان‌دار',
					value: 'prod',
					checked: true,
					tooltip: 'حذف زماندار برای [[اپ:درگاه|درگاه]]'
				},
				{
					label: 'حذف زمان‌دار زندگی‌نامه زندگان (بدون منبع)',
					value: 'prodblp',
					tooltip: 'حذف زمان‌دار زندگی‌نامه تازه و کاملاً بدون زندگان، طبق [[ip:BLPPROD]]'
				}
			]
		} );

	form.append( {
			type: 'field',
			label:'محل کار',
			name: 'work_area'
		} );

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

	var result = form.render();
	Window.setContent( result );
	Window.display();
	
	// 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: 'work_area'
		} );
	// 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 he wants 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
			});
			if (mw.config.get('wgArticleId') < 26596183) {
				field.append({
					type: 'header',
					label: 'به نظر می‌رسد که این مقاله قبل از ژانویهٔ ۲۰۱۲ ساخته شده‌است. لطفاً از روش‌های دیگر حذف استفاده نمائید.'
				});
			}
			break;

		default:
			break;
	}

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

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

		if( !pageobj.exists() ) {
			statelem.error( "صفحه قبلاً حذف شده‌است." );
			return;
		}

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

		var tag_re = /(\{\{(?:db-?|delete|[aitcmrs]fd|md1)[^{}]*?\|?[^{}]*?\}\})/i;
		if( tag_re.test( text ) ) {
			statelem.warn( 'درخواست حذف قبلاً داده شده‌است!' );
			return;
		}

		// Remove tags that become superfluous with this action
		text = text.replace(/\{\{\s*([Nn]ew unreviewed article|پیش‌نویس مقاله|[Uu]nreviewed|[Uu]serspace draft|پیش‌نویس صفحه کاربری)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/g, "");

		var prod_re = /\{\{\s*(?:dated prod|dated prod blp|Prod blp\/dated|نامزد حذف\/پیغام|بدون منبع مدت‌دار\/پیغام|حذف زمان‌دار\/پیغام|Proposed deletion\/dated)\s*\|(?:\{\{[^\{\}]*\}\}|[^\}\{])*\}\}/i;
		var summaryText;
		if( !prod_re.test( text ) ) {
			// Notification to first contributor
			if( params.usertalk ) {
				var thispage = new Morebits.wiki.page(mw.config.get('wgPageName'));
				thispage.setCallbackParameters(params);
				thispage.lookupCreator(Twinkle.prod.callbacks.userNotification);
			}
			// If not notifying, log this PROD
			else if( Twinkle.getPref('logProdPages') ) {
				Twinkle.prod.callbacks.addToLog(params);
			}

			summaryText = "نامزد کردن مقاله برای حذف مطابق [[اپ:" + (params.blp ? "زز" : "") + "حز]].";
			text = "{{subst:prod" + (params.blp ? " blp" : ("|1=" + Morebits.string.formatReasonText(params.reason))) + "}}\n" + text;
		}
		else {  // already tagged for PROD, so try endorsing it
			var prod2_re = /\{\{(?:Proposed deletion endorsed|prod-?2).*?\}\}/;
			if( prod2_re.test( text ) ) {
				statelem.warn( 'صفحه از پیش با الگوهای {{حذف زمان‌دار}} و {{prod-2}} برچسب خورده‌است، در حال لغوکردن روند' );
				return;
			}
			var confirmtext = "یک برچسب {{حذف زمان‌دار}} از پیش در این نوشتار یافت شده‌است. \nآیا مایل هستید برچسب {{prod-2}} (موافقت حذف زمان‌دار) را همراه توضیح‌تان بیافزایید؟";
			if (params.blp) {
				confirmtext = "یک برچسب {{زمان‌دارح}} غیر زندگی‌نامه زندگان در این نوشتار یافت شد.  \nآیا می‌خواهید برچسب {{زمان‌دارح}} (موافقت حذف زمان‌دار) را همراه توضیح «نوشتار زندگی‌نامه زندگان بدون منبع» بیافزایید؟";
			}
			if( !confirm( confirmtext ) ) {
				statelem.warn( 'به درخواست کاربر لغو شد' );
				return;
			}

			summaryText = "حمایت از حذف زمان‌دار مطابق [[اپ:" + (params.blp ? "زز" : "") + "حز]].";
			text = text.replace( prod_re, text.match( prod_re ) + "\n{{prod-2|1=" + (params.blp ?
				"نوشتار [[ip:BLPPROD|زندگی‌نامه زندگانی بدون منبع]] است" :
				Morebits.string.formatReasonText(params.reason)) + "}}\n" );

			if( Twinkle.getPref('logProdPages') ) {
				params.logEndorsing = true;
				Twinkle.prod.callbacks.addToLog(params);
			}
		}

		pageobj.setPageText(text);
		pageobj.setEditSummary(summaryText + Twinkle.getPref('summaryAd'));
		pageobj.setWatchlist(Twinkle.getPref('watchProdPages'));
		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 + ") این صفحه را ایجاد کردید؛ در حال نادیده‌گرفتن اطلاعیه کاربر");
			if (Twinkle.getPref("logProdPages")) {
				Twinkle.prod.callbacks.addToLog(params);
			}
			return;
		}

		var usertalkpage = new Morebits.wiki.page('بحث کاربر:' + initialContrib, "به نخستین مشارکت‌کننده (" + initialContrib + ") آگاهی می‌دهد");
		var notifytext = "\n{{subst:prodwarning" + (params.blp ? "زز" : "") + "|1=" + Morebits.pageNameNorm + "|concern=" + params.reason + "}} ~~~~";
		usertalkpage.setAppendText(notifytext);
		usertalkpage.setEditSummary("هشدار: حذف زمان‌دار [[" + Morebits.pageNameNorm + "]]." + Twinkle.getPref('summaryAd'));
		usertalkpage.setCreateOption('recreate');
		usertalkpage.setFollowRedirect(true);
		usertalkpage.append();
		if (Twinkle.getPref('logProdPages')) {
			params.logInitialContrib = initialContrib;
			Twinkle.prod.callbacks.addToLog(params);
		}
	},

	addToLog: function(params) {
		var iranpedia_page = new Morebits.wiki.page("User:" + mw.config.get('wgUserName') + "/" + Twinkle.getPref('prodLogPageName'), "در حال افزودن ورودی به سیاههٔ فضای کاربری");
		iranpedia_page.setCallbackParameters(params);
		iranpedia_page.load(Twinkle.prod.callbacks.saveLog);
	},

	saveLog: function(pageobj) {
		var text = pageobj.getPageText();
		var params = pageobj.getCallbackParameters();

		// add blurb if log page doesn't exist
		if (!pageobj.exists()) {
			text =
				"اینجا یک سیاهه از همهٔ برچسب‌های [[ip:PROD|حذف زمان‌دار]] است که توسط این کاربر با استفاده از پودمان حذف زمان‌دار [[اپ:تل|توینکل]] اعمال یا تأیید شدند.\n\n" +
				"اگر نمی‌خواهید این سیاهه را نگه دارید، می‌توانید با استفاده از [[اپ:توینکل/ترجیحات|صفحهٔ ترجیحات]] غیرفعال کنید، و " +
				"این صفحه را برای حذف سریع تحت [[اپ:محس#ک۱|محس ک۱]] نامزد کنید.\n";
		}

		// create monthly header
		var date = new Date();
		var headerRe = new RegExp("^==+\\s*" + date.getUTCMonthName() + "\\s+" + date.getUTCFullYear() + "\\s*==+", "m");
		if (!headerRe.exec(text)) {
			text += "\n\n=== {{subst:CURRENTMONTHNAME}} {{subst:CURRENTYEAR}} ===";
		}

		var summarytext;
		if (params.logEndorsing) {
			text += "\n# [[" + Morebits.pageNameNorm + "]]: برای حذف زمان‌دار" + (params.blp ? " زندگی‌نامه زندگان" : "") + " تأیید شد. ~~~~~";
			if (params.reason) {
				text += "\n#* '''دلیل''': " + params.reason + "\n";
			}
			summarytext = "واقعه‌نگاری تأیید نامزد حذف زمان‌دار [[" + Morebits.pageNameNorm + "]].";
		} else {
			text += "\n# [[" + Morebits.pageNameNorm + "]]: " + (params.blp ? "BLP " : "") + "زمان‌دار";
			if (params.logInitialContrib) {
				text += "، اطلاع‌رسانی به {{کاربر|" + params.logInitialContrib + "}}";
			}
			text += " ~~~~~\n";
			if (!params.blp) {
				text += "#* '''دلیل''': " + params.reason + "\n";
			}
			summarytext = "واقعه‌نگاری نامزد حذف زمان‌دار [[" + Morebits.pageNameNorm + "]].";
		}

		pageobj.setPageText(text);
		pageobj.setEditSummary(summarytext + Twinkle.getPref('summaryAd'));
		pageobj.setCreateOption("recreate");
		pageobj.save();
	}
};

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

	var prodtypes = form.prodtype;
	for( var i = 0; i < prodtypes.length; i++ ) {
		if( !prodtypes[i].checked ) {
			continue;
		}
		prodtype = prodtypes[i].values;
		break;
	}

	var params = {
		usertalk: form.notify.checked,
		blp: prodtype === 'prodblp',
		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 );

	if (prodtype === 'prodblp' && mw.config.get('wgArticleId') < 26596183) {
		if (!confirm( "به نظر می‌رسد این نوشتار پیش از ۱۸ مارس ۲۰۱۰ ساخته شده‌است، و بنابراین فاقد شرایط لازم برای حذف زمان‌دار زندگی‌نامه زندگان است. آیا می‌خواهید به برچسب‌زدن آن ادامه دهید؟" )) {
			Morebits.status.warn( 'آگاه‌سازی', 'در حال لغوکردن به درخواست کاربر' );
			return;
		}
	}

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

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


//</nowiki>