Wiki - KEONHACAI COPA

MediaWiki:Gadget-twinkleprod.js

// <nowiki>


(function($) {


/*
 ****************************************
 *** twinkleprod.js: PROD module
 ****************************************
 * Mode of invocation:     Tab ("Đề nghị xóa")
 * 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))
		|| !mw.config.get('wgCurRevisionId') || Morebits.wiki.isPageRedirect()) {
		return;
	}

	Twinkle.addPortletLink(Twinkle.prod.callback, 'Đề nghị xóa', 'tw-prod', 'Đề nghị xóa theo WP: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 = 'article';
			break;
		case 6:
			namespace = 'file';
			break;
		case 2:
		case 108:
			namespace = 'book';
			break;
		// no default
	}

	var Window = new Morebits.simpleWindow(800, 410);
	Window.setTitle('Đề nghị xóa (PROD)');
	Window.setScriptName('Twinkle');

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

	if (namespace === 'article') {
		Window.addFooterLink('Đề nghị xóa', 'WP:PROD');
		Window.addFooterLink('Đề nghị xóa (tiểu sử người còn sống - BLP)', 'WP:BLPPROD');
	} else if (namespace === 'file') {
		Window.addFooterLink('Đề nghị xóa (tập tin)', 'WP:PROD');
	} else { // if book
		Window.addFooterLink('Đề nghị xóa (sách)', 'WP:BOOKPROD');
	}

	var field = form.append({
		type: 'field',
		label: 'Các dạng đề nghị xóa',
		id: 'prodtype_fieldset'
	});

	field.append({
		type: 'div',
		label: Twinkle.makeFindSourcesDiv(),
		style: 'margin-bottom: 5px;'
	});

	field.append({
		type: 'radio',
		name: 'prodtype',
		event: Twinkle.prod.callback.prodtypechanged,
		list: [
			{
				label: 'PROD (đề nghị xóa)',
				value: 'prod',
				checked: true,
				tooltip: 'Đề nghị xóa thông thường, theo [[WP:PROD]]'
			},
			{
				label: 'Đề nghị xóa tiểu sử người còn sống - BLP (bài viết không có nguồn dẫn)',
				value: 'prodblp',
				tooltip: 'Đề nghị xóa thông tin tiểu sử mới tạo, hoàn toàn không có nguồn gốc về người còn sống, theo [[WP:BLPPROD]]'
			}
		]
	});

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

	Window.addFooterLink('Trợ giúp Twinkle', 'WP:TW/DOC#prod');

	form.append({ type: 'submit', label: 'Đề nghị xóa' });

	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 !== 'article') {
		$(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: 'Các tham số',
		name: 'parameters'
	});
	// create prod type dependant controls
	switch (event.target.values) {
		case 'prod':
			field.append({
				type: 'checkbox',
				list: [
					{
						label: 'Thông báo cho người tạo trang nếu có thể',
						value: 'notify',
						name: 'notify',
						tooltip: "Một bản mẫu thông báo sẽ được đặt trên trang thảo luận của người tạo bài nếu thiết lập là true.",
						checked: true
					}
				]
			});
			field.append({
				type: 'textarea',
				name: 'reason',
				label: 'Lý do đề nghị xóa:',
				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: 'Thông báo cho người tạo trang nếu có thể',
						value: 'notify',
						name: 'notify',
						tooltip: 'Người tạo bài viết phải được thông báo.',
						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('Xin lưu ý rằng chỉ những tiểu sử không có nguồn gốc của những người còn sống mới đủ điều kiện cho thẻ này, được hiểu theo nghĩa hẹp.'));
			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') {
				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('Bản mẫu XfD (đề nghị xóa) trước được tìm thấy trên trang thảo luận, quy trình hủy bỏ');
				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 = 'Gắn thẻ hoàn tất';

		var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), 'Gắn thẻ trang');
		wikipedia_page.setFollowRedirect(true);  // for NPP, and also because redirects are ineligible for PROD
		wikipedia_page.setChangeTags(Twinkle.changeTags);  // Here to apply to triage
		wikipedia_page.setCallbackParameters(params);
		wikipedia_page.load(Twinkle.prod.callbacks.main);
	},

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

		if (!pageobj.exists()) {
			statelem.error("Có vẻ như trang đó không tồn tại. Có lẽ nó đã bị xóa.");
			return;
		}

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

		// Check for already existing deletion tags
		var tag_re = /{{(?:db-?|delete|article for deletion\/dated|AfDM|ffd\b)|#invoke:RfD/i;
		if (tag_re.test(text)) {
			statelem.warn('Trang đã được gắn thẻ với một bản mẫu xóa, quy trình hủy bỏ');
			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)) {

			// Page previously PROD-ed
			if (params.oldProdPresent) {
				if (params.blp) {
					if (!confirm('Đề nghị xóa (PROD) trước đây được tìm thấy trên trang thảo luận. Bạn vẫn muốn tiếp tục áp dụng đề nghị xóa tiểu sử người còn sống (BLPPROD)?')) {
						statelem.warn('Đề nghị xóa trước đó được tìm thấy trên trang thảo luận, do người dùng hủy bỏ');
						return;
					}
					statelem.info('Đề nghị xóa trước đó được tìm thấy trên trang thảo luận, đang tiếp tục');
				} else {
					statelem.warn('Đề nghị xóa trước đó được tìm thấy trên trang thảo luận, quy trình hủy bỏ');
					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:Living people\]\]/i;
				if (!blpcheck_re.test(text) && isMoreThan3DaysOld) {
					if (!confirm('Xin lưu ý rằng bài viết không thuộc Thể_loại:Người_còn_sống và do đó có thể không đủ điều kiện tham gia đề nghị xóa về tiểu sử người còn sống (BLPPROD). Bạn có chắc chắn muốn tiếp tục không?\n\nBạn có thể muốn thêm thể loại này nếu muốn tiếp tục, trừ khi bài viết nói về một người gần đây đã qua đời.')) {
						return;
					}
				}
			}

			// Notification to first contributor
			if (params.usertalk) {
				// Không gửi thông báo cho chính bạn
				if (params.initialContrib === mw.config.get('wgUserName')) {
					statelem.warn('Bạn (' + params.initialContrib + ') đã tạo trang này; bỏ qua thông báo người dùng');
					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, 'Thông báo cho người khởi tạo nội dung (' + params.initialContrib + ')');
					usertalkpage.setAppendText(notifytext);
					usertalkpage.setEditSummary('Thông báo: đề nghị xóa [[:' + Morebits.pageNameNorm + ']].');
					usertalkpage.setChangeTags(Twinkle.changeTags);
					usertalkpage.setCreateOption('recreate');
					usertalkpage.setFollowRedirect(true, false);
					usertalkpage.setCallbackParameters(params);
					usertalkpage.append(function onNotifySuccess() {
						// thêm đề cử vào nhật trình không gian người dùng, nếu người dùng đã bật tính năng này (trong cấu hình Twinkle)
						if (Twinkle.getPref('logProdPages')) {
							params.logInitialContrib = params.initialContrib;
							Twinkle.prod.callbacks.addToLog(params);
						}
					}, function onNotifyError() {
						// nếu người dùng không thể được thông báo, ghi nhật trình đề cử mà không đề cập rằng thông báo đã được gửi
						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);
			}
			var tag;
			if (params.blp) {
				summaryText = 'Đề nghị xóa (bài viết) theo [[WP:BLPPROD]].';
				tag = '{{subst:prod blp' + (params.usertalk ? '|help=off' : '') + '}}';
			} else if (params.book) {
				summaryText = 'Đề nghị xóa (sách) theo [[WP:BOOKPROD]].';
				tag = '{{subst:book-prod|1=' + Morebits.string.formatReasonText(params.reason) + (params.usertalk ? '|help=off' : '') + '}}';
			} else {
				summaryText = 'Đề nghị xóa ' + namespace + ' theo [[WP:PROD]].';
				tag = '{{subst: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();

			// Add {{Old prod}} to the talk page
			if (!params.oldProdPresent) {
				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, 'Đặt bản mẫu {{Đề nghị xóa trước đó}} trên trang thảo luận');
				talkpage.setPrependText(oldprodfull);
				talkpage.setEditSummary('Đang thêm {{Đề nghị xóa trước đó}}');
				talkpage.setChangeTags(Twinkle.changeTags);
				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).*?}}/i;
			if (prod2_re.test(text)) {
				statelem.warn('Trang đã được gắn thẻ bản mẫu {{proposed deletion}} và {{proposed deletion endorsed}}, quy trình hủy bỏ');
				return;
			}
			var confirmtext = 'Một thẻ {{proposed deletion}} tìm thấy trên trang này. \nBạn có muốn thêm một thẻ {{proposed deletion endorsed}} với lý do của bạn?';
			if (params.blp && !/{{\s*Prod blp\/dated/.test(text)) {
				confirmtext = 'Một thẻ {{proposed deletion}} không phải người còn sống (non-BLP) được tìm thấy trên bài viết này.\nBạn có muốn thêm một thẻ {{proposed deletion endorsed}} với lý do "bài viết là tiểu sử của một người còn sống không có nguồn"?';
			}
			if (!confirm(confirmtext)) {
				statelem.warn('Đã hủy bỏ theo yêu cầu của người dùng');
				return;
			}

			summaryText = 'Xác nhận đề nghị xóa theo [[WP:' + (params.blp ? 'BLP' : params.book ? 'BOOK' : '') + 'PROD]].';
			text = text.replace(prod_re, text.match(prod_re) + '\n{{Proposed deletion endorsed|1=' + (params.blp ?
				'bài viết là một [[WP:BLPPROD|tiểu sử của một người sống không có nguồn]]' :
				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);
		pageobj.setWatchlist(Twinkle.getPref('watchProdPages'));
		pageobj.setCreateOption('nocreate');
		pageobj.save();
	},

	addToLog: function(params) {
		var usl = new Morebits.userspaceLogger(Twinkle.getPref('prodLogPageName'));
		usl.initialText =
			"Đây là nhật ký của tất cả thẻ [[WP:PROD|proposed deletion]] được người dùng này áp dụng hoặc xác nhận bằng cách sử dụng module PROD [[WP:TW|Twinkle]].\n\n" +
			'Nếu bạn không muốn giữ nhật ký này nữa, bạn có thể tắt nó bằng cách sử dụng [[Wikipedia:Twinkle/Preferences|bảng tùy chọn]], và ' +
			'đề cử trang này để xóa nhanh dưới dạng [[Wikipedia:Tiêu chí xóa nhanh|không nguồn]].\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 === 'file' ? ' ([{{fullurl:Special:Log|page=' + mw.util.wikiUrlencode(mw.config.get('wgPageName')) + '}} log]): ' : ': ';
		if (params.logEndorsing) {
			logText += 'endorsed ' + (params.blp ? 'BLP ' : params.book ? 'BOOK' : '') + 'PROD. ~~~~~';
			if (params.reason) {
				logText += "\n#* '''Lý do''': " + params.reason + '\n';
			}
			summaryText = 'Xác nhận ghi nhật ký đề cử xóa (PROD) của [[:' + Morebits.pageNameNorm + ']].';
		} else {
			logText += (params.blp ? 'BLP ' : params.book ? 'BOOK' : '') + 'PROD';
			if (params.logInitialContrib) {
				logText += '; notified {{user|' + params.logInitialContrib + '}}';
			}
			logText += ' ~~~~~\n';
			if (!params.blp && params.reason) {
				logText += "#* '''Lý do''': " + Morebits.string.formatReasonForLog(params.reason) + '\n';
			}
			summaryText = 'Ghi nhật ký đề cử xóa (PROD) của [[:' + Morebits.pageNameNorm + ']].';
		}
		usl.changeTags = Twinkle.changeTags;

		usl.log(logText, summaryText);
	}

};

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

	var params = {
		usertalk: input.notify || input.prodtype === 'prodblp',
		//usertalk: true, // luôn thông báo người dùng --- alphama
		blp: input.prodtype === 'prodblp',
		book: namespace === 'book',
		reason: input.reason || '' // using an empty string here as fallback will help with prod-2.
	};

	if (!params.blp && !params.reason) {
		if (!confirm('Bạn đã để trống lý do, bạn có thực sự muốn tiếp tục mà không cung cấp lý do không?')) {
			return;
		}
	}

	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('Kiểm tra trang thảo luận để biết các đề cử trước', query, Twinkle.prod.callbacks.checkpriors);
	wikipedia_api.params = params;
	wikipedia_api.post();
};

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


// </nowiki>
Wiki - Keonhacai copa chuyên cung cấp kiến thức thể thao, keonhacai tỷ lệ kèo, bóng đá, khoa học, kiến thức hằng ngày được chúng tôi cập nhật mỗi ngày mà bạn có thể tìm kiếm tại đây có nguồn bài viết: https://vi.wikipedia.org/wiki/MediaWiki:Gadget-twinkleprod.js