मिडियाविकि:Gadget-twinkleprod.js

विकिपिडिया बठेइ

टिप्पणी सङ्ग्रह गरेपछि, परिवर्तन हेर्नको लागि तपाईंले आफ्नो ब्राउजरको क्याच बाईपास गर्नु पर्ने हुनसक्छ।

  • फायरफक्स / सफारीमा: Shift कुञ्जी थिची राखेर Reload क्लिक गर्नुपर्छ, वा Ctrl-F5 वा Ctrl-R दबाउनुहोस् (म्याकमा ⌘-R)
  • गुगल क्रोम: Ctrl-Shift-R कुञ्जी दबाउनुहोस् (म्याकमा ⌘-R)
  • ओपेरा: Tools → Preferences मा गएर क्याश हटाउनुहोस्
  • इन्टरनेट एक्सप्लोरर: Ctrl लाई थिची राखेर Refresh क्लिक गर्नुहोस् वा Ctrl-F5 थिच्नुहोस्
// <nowiki>


(function($) {


/*
 ****************************************
 *** twinkleprod.js: PROD module
 ****************************************
 * Mode of invocation:     Tab ("मेप्र")
 * Active on:              Existing articles, files, books which are not redirects,
 *                         and user pages in [[:श्रेणी:विकिपिडिया पुस्तकहरू (प्रयोगकर्ता पुस्तकहरू)]]
 */

Twinkle.prod = function twinkleprod() {
	if ((([0, 6, 108].indexOf(mw.config.get('wgNamespaceNumber')) === -1) && (mw.config.get('wgNamespaceNumber') !== 2 || mw.config.get('wgCategories').indexOf('विकिपिडिया पुस्तकहरू (प्रयोगकर्ता पुस्तकहरू)') === -1))
		|| !mw.config.get('wgCurRevisionId') || Morebits.wiki.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;
		case 2:
		case 108:
			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 (namespace === 'फाइल') {
		Window.addFooterLink('मेटाउन प्रस्तावित नीति', 'वि:मेप्रनी');
	} else { // if book
		Window.addFooterLink('मेटाउन प्रस्तावित (पुस्तक) नीति', 'वि:पुस्तकमेप्र');
	}

	var field = form.append({
		type: 'field',
		label: 'मेप्र प्रकार',
		id: 'prodtype_fieldset'
	});

	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('ट्विङ्कल मद्दत', 'वि:ट्विङ्कल/दस्तावेज#मेप्र');

	form.append({ type: 'submit', label: 'मेटाउन प्रस्तावित' });

	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 !== 'लेख') {
		$(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':
			// पहिले, प्रयोगकर्ताहरूले पाठमा प्रविष्ट गरेको मेप्र मान सम्झनुहोस्, किनभने, यदि तिनीहरू पछाडि फर्कन चाहन्छन् भने, हामी यसको लागि कन्फिगरेसन फिल्ड दुरुपयोग गर्न सक्छौं।
			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;
	}

	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;
		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('अघिल्लो मेप्र नामाङ्कन वार्ता पृष्ठमा भेटियो। के तपाइँ अझै पनी जीमाजीमेप्र लागू गर्न चाहानुहुन्छ? ')) {
						statelem.warn('अघिल्लो मेप्र नामाङ्कन वार्ता पृष्ठमा भेटियो, प्रयोगकर्ताद्वारा रद्द');
						return;
					}
					statelem.info('अघिल्लो मेप्र नामाङ्कन वार्ता पृष्ठमा भेटियो, जारी राख्दै');
				} else {
					statelem.warn('अघिल्लो मेप्र नामाङ्कन वार्ता पृष्ठमा भेटियो, प्रक्रिया रद्द गर्दै');
					return;
				}

			// if there are multiple templates, at least one of them would be a prior xfd template
			} else {
				statelem.warn('अघिल्लो लेमेछ ढाँचा वार्ता पृष्ठमा भेटियो, प्रक्रिया रद्द गर्दै');
				return;
			}
		}

		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 = 'चिनो लगाउने कार्य सम्पन्न भयो';

		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.setCallbackParameters(params);
		wikipedia_page.load(Twinkle.prod.callbacks.main);
	},

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

		if (!pageobj.exists()) {
			statelem.error("यस्तो देखिन्छ कि पृष्ठ अवस्थित छैन। हुनसक्छ यो पहिले नै हटाईएको छ।");
			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;
		if (tag_re.test(text)) {
			statelem.warn('पृष्ठमा पहिले नै मेटाउने ढाँचा चिह्नित गरिएको छ, प्रक्रिया रद्द गर्दै');
			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;
			if (!blpcheck_re.test(text) && isMoreThan3DaysOld) {
				if (!confirm('कृपया नोट गर्नुहोस् कि लेख श्रेणी:जीवित मानिसहरूमा छैन र त्यसैले जीमाजीमेप्रको लागि अयोग्य हुन सक्छ। के तपाईँ पक्का हुनुहुन्छ कि तपाईँ जारी राख्न चाहनुहुन्छ? \n\nयदि लेख हालै मृत एक व्यक्तिको बारेमा नभएसम्म तपाईँ श्रेणी जारी राख्न सक्नुहुन्छ।')) {
					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;
		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 + ') पृष्ठ सृजना गर्नुभयो; प्रयोगकर्ता सूचना रद्द गर्दै');
					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 = 'proposed deletion notify';
					}
					var notifytext = '\n{{subst:' + notifyTemplate + '|1=' + Morebits.pageNameNorm + '|concern=' + params.reason + '}} ~~~~';

					var usertalkpage = new Morebits.wiki.page('User talk:' + params.initialContrib, 'प्रारम्भिक योगदानकर्तालाई सूचित गर्दै (' + params.initialContrib + ')');
					usertalkpage.setAppendText(notifytext);
					usertalkpage.setEditSummary('सूचना: [[:' + Morebits.pageNameNorm + ']] मेटाउन प्रस्तावित' + Twinkle.getPref('summaryAd'));
					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 = '[[वि:जीमाजीमेप्र]] मार्फत लेख मेटाउनका लागि प्रस्ताव गर्दै।';
				text = '{{subst:prod blp' + (params.usertalk ? '|help=off' : '') + '}}\n' + text;
			} else if (params.book) {
				summaryText = '[[वि:पुस्तकमेप्र]] मार्फत पुस्तक मेटाउनका लागि प्रस्ताव गर्दै।';
				text = '{{subst:book-prod|1=' + Morebits.string.formatReasonText(params.reason) + (params.usertalk ? '|help=off' : '') + '}}\n' + text;
			} else {
				summaryText = '[[वि:मेप्र]] मार्फत ' + namespace + ' मेटाउनका लागि प्रस्ताव गर्दै।';
				text = '{{subst:prod|1=' + Morebits.string.formatReasonText(params.reason) + (params.usertalk ? '|help=off' : '') + '}}\n' + text;
			}

			// 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, 'वार्तालाप पृष्ठमा {{Old prod}} राख्दै');
			talkpage.setPrependText(oldprodfull);
			talkpage.setEditSummary('ढाँचा {{Old prod}} थप्दै' + Twinkle.getPref('summaryAd'));
			talkpage.setFollowRedirect(true);  // match behavior for page tagging
			talkpage.setCreateOption('recreate');
			talkpage.prepend();
		} else {  // already tagged for PROD, so try endorsing it
			var prod2_re = /{{(?:Proposed deletion endorsed|prod-?2).*?}}/;
			if (prod2_re.test(text)) {
				statelem.warn('पृष्ठलाई पहिले नै {{proposed deletion}} र {{proposed deletion endorsed}} ढाँचाहरू चिह्नित गरिएको छ, प्रक्रिया रद्द गर्दै');
				return;
			}
			var confirmtext = 'यस पृष्ठमा एक {{proposed deletion}} चिनो पहिले नै राखिएको छ। \nके तपाईँ आफ्नो स्पष्टीकरण सहित {{proposed deletion endorsed}} चिनो थप्न चाहानुहुन्छ?';
			if (params.blp) {
				confirmtext = 'यस पृष्ठमा एक गैर-जीमाजी {{proposed deletion}} चिनो पहिले नै राखिएको छ। \nके तपाईँ आफ्नो स्पष्टीकरण "लेख कुनै स्रोतहरू बिनाको जीवित व्यक्तिको जीवनी हो" सहित {{proposed deletion endorsed}} चिनो थप्न चाहानुहुन्छ?';
				// FIXME: this msg is shown even if it was a BLPPROD tag.
			}
			if (!confirm(confirmtext)) {
				statelem.warn('प्रयोगकर्ताको अनुरोधमा रद्द गरियो');
				return;
			}

			summaryText = 'प्रस्तावित [[वि:' + (params.blp ? 'जीमाजी' : params.book ? 'पुस्तक' : '') + 'मेप्र]] मेटाउन समर्थन गर्दै।';
			text = text.replace(prod_re, text.match(prod_re) + '\n{{proposed deletion endorsed|1=' + (params.blp ?
				'लेख एक [[वि:जीमाजीमेप्र|कुनै स्रोत नभएको जीवित व्यक्तिको जीवनी]] हो' :
				Morebits.string.formatReasonText(params.reason)) + '}}\n');

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

		// 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 wikipedia_page = new Morebits.wiki.page('User:' + mw.config.get('wgUserName') + '/' + Twinkle.getPref('prodLogPageName'), 'प्रयोगकर्तास्थान लगमा प्रविष्टि थप्दै');
		wikipedia_page.setCallbackParameters(params);
		wikipedia_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 =
				"यो [[वि:ट्विङ्कल|ट्विङ्कल]]को मेप्र मोड्युल प्रयोग गरि यस प्रयोगकर्ताद्वारा लागू वा समर्थन गरिएको सबै [[वि:मेप्र|मेटाउन प्रस्तावित]] चिनोहरूको लग हो।\n\n" +
				'यदि तपाइँ अब यो लग राख्न चाहनुहुन्न भने, यसलाई [[विकिपिडिया:ट्विङ्कल/अभिरुचिहरू|अभिरुचि सूची]] प्रयोग गरेर बन्द गर्न सक्नुहुनेछ, र ' +
				'यस पृष्ठलाई [[वि:शीमे#प्र१|शीमे प्र१]] अन्तर्गत शीघ्र मेटाउनको लागि नामाङ्कन गर्नुहोला।\n';
		}

		// create monthly header if it doesn't exist already
		var date = new Morebits.date(pageobj.getLoadTime());
		if (!date.monthHeaderRegex().test(text)) {
			text += '\n\n' + date.monthHeader(3);
		}

		text += '\n# [[:' + Morebits.pageNameNorm + ']]';
		// If a logged file is deleted but exists on commons, the wikilink will be blue, so provide a link to the log
		text += namespace === 'फाइल' ? ' ([{{fullurl:Special:Log|page=' + mw.util.wikiUrlencode(mw.config.get('wgPageName')) + '}} लग]): ' : ': ';
		var summarytext;
		if (params.logEndorsing) {
			text += 'समर्थन ' + (params.blp ? 'जीमाजी ' : params.book ? 'पुस्तक' : '') + 'मेप्र। ~~~~~';
			if (params.reason) {
				text += "\n#* '''कारण''': " + params.reason + '\n';
			}
			summarytext = '[[:' + Morebits.pageNameNorm + ']]को मेप्र नामाङ्कनको अनुमोदन लग बनाउँदै।';
		} else {
			text += (params.blp ? 'जीमाजी ' : params.book ? 'पुस्तक' : '') + 'मेप्र';
			if (params.logInitialContrib) {
				text += '; सूचित गरियो {{user|' + 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;

	if (namespace === 'लेख') {
		var prodtypes = form.prodtype;
		for (var i = 0; i < prodtypes.length; i++) {
			if (prodtypes[i].checked) {
				prodtype = prodtypes[i].values;
				break;
			}
		}
	}

	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('पूर्व नामाङ्कनहरूको लागि वार्ता पृष्ठ जाँच गर्दै', query, Twinkle.prod.callbacks.checkpriors);
	wikipedia_api.params = params;
	wikipedia_api.post();
};
})(jQuery);


// </nowiki>