MediaWiki:Gadget-SpeedyDeletion.js

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Увага: Після публікування слід очистити кеш браузера, щоб побачити зміни.

  • Firefox / Safari: тримайте Shift, коли натискаєте Оновити, або натисніть Ctrl-F5 чи Ctrl-Shift-R (⌘-R на Apple Mac)
  • Google Chrome: натисніть Ctrl-Shift-R (⌘-Shift-R на Apple Mac)
  • Internet Explorer / Edge: тримайте Ctrl, коли натискаєте Оновити, або натисніть Ctrl-F5
  • Opera: натисніть Ctrl-F5
/* 
 * Скрипт для швидкої номінації статтей на швидке вилучення
 * Ліцензія: GNU GPL
 * Версія: 2.0 06.06.2015
 * Автор першої версії: анонімний розробник, зв'язок — xzs.jx@yandex.ru
 * Адаптовано з РосВікі у версії 68977088 (v.1.9 02.03.2013)
 * Практично повністю переписано 06.06.2015
 * Модифіковано користувачем Andriy.v 
*/

//<nowiki>
if ( typeof( window.SpeedyDeletion ) == 'undefined' ) {
	window.SpeedyDeletion  = {
    	reasons: [
    		{ tmpl: 'nonsense', reason: 'Незв\'язний вміст' },
			{ tmpl: 'misuse', reason: 'Нецільове використання сторінки' },
			{ tmpl: 'test', reason: 'Тестова сторінка' },
			{ tmpl: 'vand', reason: 'Вандалізм' },
			{ tmpl: 'hoax', reason: 'Містифікація' },
			{ tmpl: 'spam', reason: 'Явна реклама, піар або спам', notification: '{{subst:Привітання-спам|'+ mw.config.get('wgPageName') +'}}--~~~~' },
			{ tmpl: 'evasion', reason: 'Створення всупереч персонального обмеження чи блокування' },
			{ tmpl: 'attack', reason: 'Сторінка-напад' },
			{ tmpl: 'author', reason: 'За запитом єдиного автора' },
			{ tmpl: 'repost', reason: 'Ідентична копія раніше вилученої сторінки' },
			{ tmpl: 'residual', reason: 'Сторінка, пов\'язана з вилученою' },
			{ tmpl: 'duplicate', reason: 'Дублікат уже наявної сторінки' },
			{ tmpl: 'copyvio', reason: 'Порушення авторських прав' },
			{ tmpl: 'move', reason: 'Для звільнення шляху перейменування сторінки' },
			{ tmpl: 'create', reason: 'Для звільнення шляху створення сторінки' },
			],
		reasons_article: [
			{ tmpl: 'nocontext', reason: 'Дуже коротка беззмістовна та/або неенциклопедична стаття' },
			{ tmpl: 'lang', reason: 'Неукраїнськомовна стаття або машинний переклад', notification: '{{subst:Langwarn|'+ mw.config.get('wgTitle') +'}}--~~~~' },
			{ tmpl: 'nocontent', reason: 'Стаття без вмісту або з елементами оформлення енциклопедії замість вмісту' },
			{ tmpl: 'nn', reason: 'Стаття про безсумнівно незначущі речі', notification: '{{subst:Незначущо|'+ mw.config.get('wgTitle') +'}}--~~~~' },
			{ tmpl: 'madeup', reason: 'Явне просування власної вигадки' }
			],
		reasons_redirect: [
			{ tmpl: 'redirnone', reason: 'Перенаправлення на неіснуючу сторінку' },
			{ tmpl: 'redirspace', reason: 'Перенаправлення між просторами назв' },
			{ tmpl: 'wrr', reason: 'Некоректне перенаправлення' },
			{ tmpl: 'redirsense', reason: 'Перенаправлення з грубою семантичною помилкою' },
			{ tmpl: 'redirtypo', reason: 'Перенаправлення з малоймовірною опискою' },
			{ tmpl: 'redirflect', reason: 'Перенаправлення з відмінкової форми назви' },
			{ tmpl: 'redircase', reason: 'Перенаправлення із сумішшю розкладок' },
			{ tmpl: 'redirtalk', reason: 'Перенаправлення між сторінками обговорення' },
			{ tmpl: 'redirdoc', reason: 'Перенаправлення між підсторінками документації'}
				],
		reasons_user: [
			{ tmpl: 'owner', reason: 'Сторінка користувача або в особистому просторі за запитом її власника' },
			{ tmpl: 'iptalk', reason: 'Неактуальне обговорення незареєстрованого користувача' },
			{ tmpl: 'nonuser', reason: 'Сторінка неіснуючого користувача' }
			],
		reasons_category: [
			{ tmpl: 'catempty', reason: 'Порожня категорія' },
			],
		reasons_other: [
			{ tmpl: '', reason: 'Інша причина' }
			],
		
		install: function () {
			var ns = mw.config.get('wgNamespaceNumber');
			var reasons = this.reasons;
			if (mw.config.get('wgIsRedirect'))
				reasons = reasons.concat(this.reasons_redirect);
			switch(ns) {
				case 0:
					reasons = reasons.concat(this.reasons_article);
					break;
				case 2:
				case 3:
					reasons = reasons.concat(this.reasons_user);
					break;
				case 14:
					reasons = reasons.concat(this.reasons_category);
					break;
			}
			reasons = reasons.concat(this.reasons_other);
			var sd = this;
			this.title = "Швидке вилучення";
			if( $( '#SD-dialog' ).length === 0 ) {
				 $( "#mw-content-text" ).append('<div id="SD-dialog" style="display:none;" title="' + this.title + '">Критерії швидкого вилучення<br/><form id="SD-radiobox"></form></div>');
				 $.each(reasons, function() {
					if(this.tmpl === 'duplicate') {
						$('#SD-radiobox').append('<input type="radio" name="SD-radio" id="sd-duplicate">' + this.reason + '<br/>');
						$('#SD-radiobox').append('<input id="SD-duplicate" style="display:none; width:100%"><br/>');
						} else if(this.tmpl === 'move') {
							$('#SD-radiobox').append('<input type="radio" name="SD-radio" id="sd-move">' + this.reason + '<br/>');
							$('#SD-radiobox').append('<input id="SD-move" style="display:none; width:100%"><br/>');
							} else if(this.tmpl === '') {
								$('#SD-radiobox').append('<input type="radio" name="SD-radio" id="sd-other">' + this.reason + '<br/>');
								$('#SD-radiobox').append('<input id="SD-othreason" style="display:none; width:100%"><br/>');
								} else {
								$('#SD-radiobox').append('<input type="radio" name="SD-radio" id="' + this.tmpl + '">' + this.reason + '<br/>');
								}
				 });
				$('#SD-radiobox').append('<input type="checkbox" id="SpeedyDeletion-forcewrap" checked/>Помістити шаблон швидкого вилучення в тег &lt;noinclude&gt;<br/>');
				$('#SD-dialog input:radio').change(function(){
					if($(this).attr('id') == 'sd-other'){
						$('#SD-othreason').show(500);
					} else if($(this).attr('id') == 'sd-duplicate'){
							$('#SD-duplicate').show(500);
					} else if($(this).attr('id') == 'sd-move'){
							$('#SD-move').show(500);		
						} else {
							$('#SD-duplicate').hide(500);						
							$('#SD-othreason').hide(500);
							$('#SD-move').hide(500);
						}
				});
			}
			mw.loader.using( 'jquery.ui', function() {
				$( '#SD-dialog' ).dialog({
					width: 400,
					buttons: {
						'Надіслати' : function() {
							sd.check(reasons);
						},
					}
				});
			});
			
		},
		
		check: function(reasons) {
			if($.inArray('Статті до швидкого вилучення', mw.config.get('wgCategories')) >= 0) {
				alert('Сторінка вже номінована на швидке вилучення.');
				return;
			}			
			if(!$('#SD-dialog input:checked')) {
				alert('Оберіть причину!');
				return;
			} else {
				var notification = '';
				if($('#SD-dialog input:checked').attr('id') == 'sd-other' && this.isEmpty($('#SD-othreason').val())) {
					alert('Введіть причину!');
					$('#SD-othreason').focus();
					return;
					} else if ($('#SD-dialog input:checked').attr('id') == 'sd-duplicate' && this.isEmpty($('#SD-duplicate').val())) {
						alert('Введіть назву сторінки!');
						$('#SD-duplicate').focus();	
						return;
						} else if($('#SD-dialog input:checked').attr('id') == 'sd-duplicate') {
							this.prep = "{{db-duplicate|" + $('#SD-duplicate').val() + "}}";
							} else if ($('#SD-dialog input:checked').attr('id') == 'sd-move' && this.isEmpty($('#SD-move').val())) {
								alert('Введіть назву сторінки!');
								$('#SD-move').focus();	
								return;
								} else if($('#SD-dialog input:checked').attr('id') == 'sd-move') {
									this.prep = "{{db-move|" + $('#SD-move').val() + "}}";
									} else if($('#SD-dialog input:checked').attr('id') == 'sd-other') {
										this.prep = "{{db|" + $('#SD-othreason').val() + "}}";
										} else {
											this.prep = "{{db-" + $('#SD-dialog input:checked').attr('id') + "}}";
											if ($('#SD-dialog input:checked').attr('id') == 'spam' || $('#SD-dialog input:checked').attr('id') == 'lang' || $('#SD-dialog input:checked').attr('id') == 'nn') {
												$.each(reasons, function() {
												if ($('#SD-dialog input:checked').attr('id') == this.tmpl)
													notification = this.notification;
											});
											}
										}	
				this.execute(notification);
			}
		},
		
		execute: function(notification) {
			var tpl = this.prep, sd = this, par;
			if($('#SpeedyDeletion-forcewrap').prop( "checked" )) {
				this.prep = '<noinclude>' + this.prep + '</noinclude>';
			}
			this.wait("Додавання шаблону на сторінку");
			par = mw.config.get( 'wgIsRedirect' ) ? 'appendtext' : 'prependtext';
			sd.preferences(function (watchlist) {
				watchlist == undefined ? watchlist_aux = undefined: watchlist_aux = watchlist.watchlist_nominatedpage;
				sd.writeInPage( mw.config.get( 'wgPageName' ), sd.prep + "\n", "Номінація статті на швидке вилучення (" + tpl + ") за допомогою [[MediaWiki:Gadget-SpeedyDeletion.js|гаджету швидкої номінації]]", par, null, watchlist_aux, function () {
					if (notification == '') {
						sd.success();
					}
					else
						sd.addNotification(notification, watchlist);
				});
			});
		},
		
		wait: function(mes) {
			$('#SD-dialog').dialog("close");
			$('#SD-dialog').prop('title', 'Зачекайте, будь ласка...');
			if($('#SD-dialog').length !== 0) {
				$('#SD-dialog').html('<p style="font-size: 120%; font-weight:bold;">' + mes + '</p>');
			} else {
				$( "#mw-content-text" ).append('<div id="SD-dialog" style="display:none;"><p style="font-size: 120%; font-weight:bold;">' + mes + '</p></div>');
			}
			$('#SD-dialog').dialog({
				modal: true,
				buttons: false,
				close: function(event, ui)
			        {
						$(this).dialog('destroy').remove();
			        }
			});
		},
		
		writeInPage: function ( title, content, summary, option, section, watchlist, success ) {
			var sd = this;
			if (watchlist == undefined)
				watchlist = 'watch';
			var param = {
				action: 'edit',
				title: title, 
				summary: summary, 
				watchlist: watchlist,
				format: 'json'
			};
			param[option || 'text'] = content;
			if (section || section === 0) 
				param.section = section;
			api = new mw.Api();
			api.postWithToken( 'csrf', param ).done( function ( data ) {
				success();
			}).fail(function (code) {
				sd.editErrors(code, title);
			});
		},
		addNotification: function (notification, watchlist){
			var sd = this;
			var params = {
			action: 'query',
			prop: 'revisions',
			titles: mw.config.get('wgPageName'),
			rvprop: 'user',
			rvdir: 'newer',
			rvlimit: 1,
			format: 'json'
			},
			api = new mw.Api();
			api.get( params ).done( function ( data ) {
				var user = data.query.pages[Object.keys(data.query.pages)].revisions[0].user;
				var params2 = {
					action: 'query',
					list: 'users',
					ususers: user,
					usprop: 'registration',
					format: 'json'
				},
				api = new mw.Api();
				api.get( params2 ).done( function ( data ) {
					if (data.query.users[0].invalid == undefined) {
						sd.wait("Додавання сповіщення на сторінку обговорення автора сторінки");
						watchlist == undefined ? watchlist_aux = undefined: watchlist_aux = watchlist.watchlist_usertalkpage;
						sd.writeInPage ( 'User_talk:' + user, '\n' + notification, 'сповіщення автора сторінки '+ mw.config.get('wgPageName').replace('_',' ') +' про номінацію на [[Вікіпедія:Критерії швидкого вилучення|швидке вилучення]] за допомогою [[MediaWiki:Gadget-SpeedyDeletion.js|гаджету швидкої номінації]]', 'appendtext', null, watchlist_aux, function () {
							sd.success();
						});
					}
					else 
						sd.success();
				});
			});
		},
		success: function () {
			var sd = this;
			sd.wait("Перезавантаження сторінки");
			setTimeout(function(){
				$( '#SD-dialog' ).dialog('close');
				location.reload(); 	},1000);			
		},
		
		isEmpty: function( str ) {
			return (!/\S/.test(str));
		},
		preferences: function (next) {
			var params = {
				action: 'query',
				titles: 'User:'+ mw.config.get("wgUserName") +'/gadget-preferences.json',
				prop: 'pageprops',
				format: 'json'
			};
			var api = new mw.Api();
			api.get( params ).then( function ( data ) {
				if (data.query.pages[-1] == undefined) {
					$.getJSON(mw.config.get('wgScriptPath')+'/index.php?action=raw&ctype=application/json&title=User:' + mw.config.get("wgUserName") + '/gadget-preferences.json', function(data){
						next(data.SpeedyDeletion);
					});
				}
				else
					next();
			});
		},
		editErrors: function(code, title) {
			var sd = this;
			switch(code) {
				case 'editconflict':
					alert('Конфлікт редагувань на сторінці ' + title + '. Відкиньте редагування, зроблені цим додатком за останні декілька секунд та спробуйте ще раз');
					break;
				case 'protectedpage':
					alert('Сторінка ' + title + ' захищена. Зв\'яжіться з адміністраторами на сторінці ВП:Запити до адміністраторів');
					break;
				case 'spamdetected':
					alert('При редагуванні сторінки ' + title + ' автоматичний фільтр визначив ваш текст, як спам');
					break;
				case 'blocked':
					alert('Ви заблоковані у цій вікі. Спробуйте, будь ласка, пізніше');
					break;
				case 'abusefilter-disallowed':
					alert('Автоматичний фільтр заборонив редагування сторінки ' + title);
					break;
				case 'notoken':
					alert('Неможливо отримати токен. Зверніться, будь ласка, у «Кнайпу (адміністрування)»');
					break;
				default:
					alert('Невідома помилка при редагуванні сторінки ' + title + '. Відкиньте редагування, зроблені цим додатком за останні декілька секунд та спробуйте пізніше');
					break;
			}
			sd.success();
		}
	};
}

// Якщо ми не на службовій сторінці, не на сторінці файлів, а на існуючій сторінці, яку можна редагувати, додає вкладку
$(document).ready(function () {
	if( mw.config.get('wgCanonicalNamespace') != 'Special' && mw.config.get('wgCanonicalNamespace') !== 'File' && mw.config.get('wgCanonicalNamespace') !== 'MediaWiki' && $("#ca-viewsource").length === 0 && mw.config.get('wgArticleId') ) {
		mw.util.addPortletLink("p-cactions", "javascript:SpeedyDeletion.install()", "На ШВ", "ca-contrib", "Номінувати на швидке вилучення");
	}
});
//</nowiki>