Участник:Absconditus/rfsd.js

Материал из Википедии — свободной энциклопедии
Страница персонального оформления. У этого JS-кода есть документация: Участник:Absconditus/rfsd.
После сохранения очистите кэш браузера.
/* 
 * Скрипт для вынесения статьи на быстрое удаление одним нажатием мыши
 * Документация: https://ru.wikipedia.org/wiki/Участник:Absconditus/rfsd
 * Лицензия: GNU GPL
 * Версия: 1.9 02.03.2013
 * Автор: анонимный разработчик, связь — [email protected]
*/
rfsd = {
	$reason: null,
	$token: null,
	$rev: null,
 
	$reasons: [ { tmpl: 'nonsense', reason: 'О1: бессвязное содержимое', ns: 666 },
		{ tmpl: 'test', reason: 'О2: тестовая страница', ns: 666, warn: 'Тест' },
		{ tmpl: 'vand', reason: 'О3: вандальная страница', ns: 666, warn: 'Вандализм' },
		{ tmpl: 'repost', reason: 'О4: страница, ранее удалявшаяся по причинам, не допускающим повторное создание', ns: 666 },
		{ tmpl: 'author', reason: 'О5: удаление запрошено единственным автором', ns: 666 },
		{ tmpl: 'talk', reason: 'О6: страница, связанная с удалённой', ns: 666 },
		{ tmpl: 'move', reason: 'О7: для возможности переименования другой страницы', ns: 666, ni: 1 },
		{ tmpl: 'fork', reason: 'О8: копия существующей страницы', ns: 666, ni: 1 },
		{ tmpl: 'spam', reason: 'О9: спам, реклама', ns: 666, warn: 'Спам-статья' },
        { tmpl: 'badtalk', reason: 'О10: нецелевое использование страницы обсуждения', ns: 666 },
		{ tmpl: 'copyvio', reason: 'О11: явное нарушение авторских прав; содержимое статьи скопировано', ns: 666, ni: 1, warn: 'Nothanks cv' },
		{ tmpl: 'empty', reason: 'С1: пустая или очень короткая статья без энциклопедического содержания', ns: 0, warn: 'СпасибоКоротко' },
		{ tmpl: 'foreign', reason: 'С2: статья не на русском языке', ns: 0, warn: 'Не на русском' },
		{ tmpl: 'foreign', reason: 'С2: машинный перевод', ns: 0, warn: 'Машперевод' },
		{ tmpl: 'nocontent', reason: 'С3: статья только из ссылок (внутренних или внешних)', ns: 666 },
		{ tmpl: 'nn', reason: 'С5: нет доказательств энциклопедической значимости', ns: 0, warn: 'СпасибоНезначимо' },		
		{ tmpl: 'redirnone', reason: 'П1: перенаправление на несуществующую страницу', ns: 666 },
		{ tmpl: 'redirspace', reason: 'П2: перенаправление между пространствами имён', ns: 666 },
		{ tmpl: 'redirtypo', reason: 'П3: перенаправление с ошибкой в названии', ns: 666 },
		{ tmpl: 'redirflect', reason: 'П4: перенаправление с названием не в именительном падеже', ns: 666 },
		{ tmpl: 'redirsense', reason: 'П5: семантически некорректное перенаправление', ns: 666 },
		{ tmpl: 'redirtalk', reason: 'П6: перенаправление на страницу обсуждения', ns: 666 },
		{ tmpl: 'catempty', reason: 'К1: пустая категория', ns: 14 },
		{ tmpl: 'rencat', reason: 'К2: переименованная категория', ns: 14, ni: 1 },
		{ tmpl: 'owner', reason: 'У1: по запросу владельца', ns: 2 },
		{ tmpl: 'anon', reason: 'У2: устаревшая страница обсуждения анонимного участника', ns: 3 },
		{ tmpl: 'no-user', reason: 'У3: cтраница в пространстве несуществующего участника.', ns: 2 && 3 },
		{ tmpl: 'baduserpage', reason: 'У4: нецелевое использование страницы участника', ns: (2 && 3) },
		{ tmpl: 'inactive', reason: 'У5: подстраница неактивного участника', ns: (2 && 3) },
		{ tmpl: '', reason: 'Отложенное быстрое', ns: 0, ds: 1, warn: 'Предупреждение-слишком краткая статья' },
		{ tmpl: '', reason: 'Своя причина', ns: 666, ni: 1 }
	],
 
	initialise: function() {
		var $window = '<div xmlns="http://www.w3.org/1999/xhtml" id="rfsd-window" style="background: white; border:1px double black;'+
						'position: fixed; top: 40px; left: 180px; z-index: 2; width: 750px; height: 450px; padding: 2 2 2 3em">' +
						'<form name="rfsd" id="rfsd" style="height: 450px"><div style="height: 450px; overflow: auto"><p>'+
						'<span style="font-weight:bold">Причина БУ</span></p>';
		for( var $i in this.$reasons ) {
			var controlID = "rfsd-radiobutton" + $i;
			if( this.$reasons[$i].ns == 666 || this.$reasons[$i].ns == mw.config.get('wgNamespaceNumber') ) {
				$window += '<p><input class="rfsd-autofocus" type="radio" id="' + controlID + '" name="rfsd" value="' + $i + '" />'
					+ '<label class="rfsd-autofocus" for="' + controlID + '">' + this.$reasons[$i].reason + '</label>' +
					( this.$reasons[$i].ni ? ': <input id="rfsd-field' + $i + '" />' : '' ) + '</p>';
			}
		}
		$window += '</div></form><div style="background: white"><p>Примечание (необязательно): <input type="text" id="rfsd-neob" size="70" value="" /></p>'+
					'<input type="checkbox" id="rfsd-warn" />Предупредить автора страницы на его странице обсуждения, если возможно'+
					' (<a href="//ru.wikipedia.org/wiki/user_talk:Absconditus/rfsd.js\#Описание_работы_скрипта" target="_blank">?</a>)'+
					'<br/><input type="checkbox" id="rfsd-forcewrap" />Обернуть шаблон КБУ в тег &lt;noinclude&gt;'+
					' (<a href="//ru.wikipedia.org/wiki/user_talk:Absconditus/rfsd.js\#Описание_работы_скрипта" target="_blank">?</a>)</div>' +
					'<div style="background: white"><input type="button" id="rfsd-confirm" value="Отправить" /><input type="button" id="rfsd-cancel"'+
					' value="Отмена" /></div></div>';
		$( '#bodyContent' ).append( $.parseXML( $window ).firstChild );
		$( '#rfsd-confirm' )[0].onclick = function() { rfsd.execute() };
		$( '.rfsd-autofocus' ).click( function() { $( "#rfsd-confirm" ).focus() } );
		$( '#rfsd-cancel' )[0].onclick = function() { $( 'div#rfsd-window' ).remove() };
	},
 
	execute: function() {
		if( !( this.$reason = $( "#rfsd input:checked" ).val() ) ) {
			alert( 'Вы не указали причину!' );
			return 1;
		}
		$.getJSON( mw.config.get('wgScriptPath') + '/api.php?format=json&action=query&prop=info&titles=Foobar&meta=tokens&type=csrf', function( $x ) { rfsd.template( $x ) });
	},
 
	template: function( $data ) {
		if( !$data || !$data['query'] ) {
			return;
		}
		
		this.$token = $data['query']['tokens']['csrftoken'];
 
		$.getJSON( mw.config.get('wgScriptPath') + '/api.php?format=json&action=query&prop=revisions&titles=' + rfsd._ae(mw.config.get('wgPageName')) + '&rvprop=user|content&rvlimit=1', function( $data ) {
			for( var $rev in $data['query']['pages'] ) {
				if( typeof $data['query']['pages'][$rev]['revisions'] == 'undefined' ) { alert( 'Страница уже удалена или скрипт неправильно обработал её название.' ); return false; }
 
				$content = $data['query']['pages'][$rev]['revisions'][0]['*'];
				if( $content.match( '/{{db-' + rfsd.$reasons[rfsd.$reason].tmpl + '/ig' ) ) {
					alert( 'На странице уже стоит выбранный шаблон быстрого удаления.' ); return false; 
					}
					
 
				var $template = (($('#rfsd-forcewrap').is(':checked') || mw.config.get('wgNamespaceNumber') == 10) ? '<' + 'noinclude>' : '') + 
					'{{' + ( rfsd.$reasons[rfsd.$reason].ds ? 'sub' + 'st:ds' : 'db') + ( ( rfsd.$reasons[rfsd.$reason].tmpl == '' ) ? '' : '-' +
					rfsd.$reasons[rfsd.$reason].tmpl ) + ( rfsd.$reasons[rfsd.$reason].ni ? '|1=' + $( "#rfsd-field" + rfsd.$reason ).val() :
					( $("#rfsd-neob").val() != "" ? "|1=" + $("#rfsd-neob").val() : "" )) + '}}' +
					(($('#rfsd-forcewrap').is(':checked') || mw.config.get('wgNamespaceNumber') == 10) ? '<' + '\/noinclude>' : '') +'\n';
				$.post( mw.config.get('wgScriptPath') + '/api.php', { action: 'edit', title: mw.config.get('wgPageName'), summary: 'Вынесение страницы на быстрое удаление ({{' +
					( rfsd.$reasons[rfsd.$reason].ds ? 'ds' : 'db') + ( ( rfsd.$reasons[rfsd.$reason].tmpl == '' ) ? '' : '-' + rfsd.$reasons[rfsd.$reason].tmpl ) +
					'}}) с помощью [[user talk:Absconditus/rfsd.js|RfSD.js]]', token: rfsd.$token, notminor: '1', text: $template + $content, format: 'json' },
					function( $x ) { rfsd.finalf( $x ) });
			}
		});
	},
 
	finalf: function( $data ) {
		this.$rev = $data['edit']['newrevid'];
		if( $('#rfsd-warn').is(':checked') && rfsd.$reasons[rfsd.$reason].warn ) {
			$.getJSON( mw.config.get('wgScriptPath') + '/api.php?format=json&action=query&rvdir=newer&prop=revisions&titles=' + rfsd._ae(mw.config.get('wgPageName')) + '&rvprop=user|content&rvlimit=1', function( $x ) {
				for( var $rev in $x['query']['pages'] ) {
					var $talk = 'Обсуждение_участника:' + $x['query']['pages'][$rev]['revisions'][0]['user'];
						$.post( mw.config.get('wgScriptPath') + '/api.php', { action: 'edit', appendtext: '\n{{subst:' + rfsd.$reasons[rfsd.$reason].warn +
						( ( rfsd.$reasons[rfsd.$reason].tmpl == 'copyvio' ) ? '|1=' + rfsd._sp(mw.config.get('wgPageName')) + '|2=' + $( "#rfsd-field" + rfsd.$reason ).val() : ( ( rfsd.$reasons[rfsd.$reason].tmpl == 'vand' ) ? '' : '|1=' + rfsd._sp(mw.config.get('wgPageName') ) ) ) + '}}' +
						'\n~~' + '~~', summary: 'Предупреждение участника с помощью [[user talk:Absconditus/rfsd.js|RfSD.js]]', title: $talk, token: rfsd.$token, notminor: '1' },
						function() { rfsd.review() });
					}
				});
		    } else { rfsd.review() }
	},
 
	review: function( $data ) {
		window.location = mw.config.get('wgServer') + '/wiki/' + encodeURIComponent( mw.config.get('wgPageName') ) + '?action=purge';
	},
 
	_ae: function( $i ) {
                return $i.replace(/\+/g,'%2B').replace(/&/g,'%26');
        },
	_sp: function( $i ) {
                return $i.replace(/\+/g,'%2B').replace(/&/g,'%26').replace(/_/g, ' ');
        },
};
 
// Если мы не на служебной странице, не на странице файла (для него отдельный гаджет), а на существующей странице, которую можно править, добавляет вкладку
$( function() {
	if( mw.config.get('wgCanonicalNamespace') != 'Special' && mw.config.get('wgCanonicalNamespace') != 'File' && $("#ca-viewsource").length == 0 && mw.config.get('wgArticleId') ) {
		mw.loader.using('mediawiki.util').done(function(){
			mw.util.addPortletLink("p-cactions", "javascript: rfsd.initialise()", "КБУ", "ca-rfsd", "Вынести на быстрое удаление");
		});
	}
});