Участник:VasilievVV/rfd-fixed.js

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
/* 
 * Скрипт для упрощенного вынесения на удаление статьи в Википедии: добавляет шаблон на страницу, создаёт тему на КУ. 
 * Лицензия: GNU GPL
 * Версия: 1.8 11.02.2012
 * Автор — анонимный разработчик, связь — xzs.jx@yandex.ru
*/
 
rfd = {
	$token: null,
	$reason: null,
	rfdPageExists: null,
 
	insert_tag: function(text) {
		var textbox = $( "#rfd-reason" );
		textbox.textSelection( 'encapsulateSelection', { 'pre' : text } );
	},
 
	show_window: function() {
		var $window = '<div xmlns="http://www.w3.org/1999/xhtml" id="rfd-window" style="background: white; border:1px double black; padding: 15px; position: fixed; top: 200px; left: 200px; z-index: 2"><table>' +
			'<tr><td>Страница RfD:</td><td>' + this._rfd_page() + '</td></tr>' +
                                          '<tr><td>Страница:</td><td>' + this._xe( mw.config.get('wgPageName') ) + '</td></tr>' +
                                          '<tr><td>Быстрая вставка:</td><td style="font-size:90%">' + '<a onclick="rfd.insert_tag(\'|\');return false" href=\"#\">|</a> <a onclick="rfd.insert_tag(\'[[ВП:ОКЗ]]\');return false" href=\"#\">[[ВП:ОКЗ]]</a> <a onclick="rfd.insert_tag(\'[[ВП:ЧНЯВ]]\');return false" href=\"#\">[[ВП:ЧНЯВ]]</a> <a onclick="rfd.insert_tag(\'[[ВП:МТФ]]\');return false" href=\"#\">[[ВП:МТФ]]</a> <a onclick="rfd.insert_tag(\'[[ВП:МТМР]]\');return false" href=\"#\">[[ВП:МТМР]]</a> <a onclick="rfd.insert_tag(\'[[ВП:НЕГУЩА]]\');return false" href=\"#\">[[ВП:НЕГУЩА]]</a> <a onclick="rfd.insert_tag(\'[[ВП:ПРОВ]]\');return false" href=\"#\">[[ВП:ПРОВ]]</a> <a onclick="rfd.insert_tag(\'[[ВП:БИО]]\');return false" href=\"#\">[[ВП:БИО]]</a> <a onclick="rfd.insert_tag(\'[[ВП:АИ]]\');return false" href=\"#\">[[ВП:АИ]]</a></td></tr>' +
			'<tr><td>Причина</td><td>' + '<textarea id="rfd-reason" rows="4" cols="60"></textarea></td></tr>' +
                                          '<tr><td></td><td><input type="checkbox" id="rfd-forcewrap" />Принудительно обернуть шаблон в тег &lt;noinclude&gt; (<a href="//ru.wikipedia.org/wiki/user_talk:Anonim.one/rfd.js\#Описание_работы_скрипта" target="_blank">?</a>)</td></tr>' + 
			'<tr><td><input type="button" id="rfd-confirm" value="ОК" /><input type="button" id="rfd-cancel" value="Отмена" />' +
			'</td></tr></table></div>';
		$( '#bodyContent' ).append( $.parseXML( $window ).firstChild );
		$( '#rfd-confirm' )[0].onclick = function() { rfd.execute() };
		$( '#rfd-cancel' )[0].onclick = function() {
			$( 'div#rfd-window' ).remove();
		};
	},
 
	execute: function() {
		this.$reason = $( '#rfd-reason' ).val();
		var titleParam = encodeURIComponent( this._rfd_page() )
		$.getJSON( mw.config.get('wgScriptPath') + '/api.php?format=json&action=query&prop=info&intoken=edit&titles=' + titleParam, function( $x ) { rfd.process_page( $x ) });
	},
 
	process_page: function( $data ) {
		for( var $i in $data['query']['pages'] ) {
			this.$token = $data['query']['pages'][$i]['edittoken'];
			this.rfdPageExists = $data.query.pages[$i].missing == undefined;
		}
		$.getJSON( mw.config.get('wgScriptPath') + '/api.php?format=json&action=parse&page=' + this._ae(mw.config.get('wgPageName')) + '&prop=wikitext', function( $data ) {
			if( typeof $data['parse'] == 'undefined' ) { alert( 'Статья уже не существует.' ); return false }
 
			var $content = $data['parse']['wikitext']['*'];
			if( $content.match( /{{к удалению/ig ) ) { alert( 'На статье уже стоит шаблон удаления.' ); return false }
 
			var $template = '{' + '{subst:afdd}}\n';
			$.post( mw.config.get('wgScriptPath') + '/api.php', { action: 'edit', title: mw.config.get('wgPageName'), minor: 1, summary: 'Страница вынесена на удаление: [[' + rfd._rfd_page() + '#' + mw.config.get('wgPageName') + '|тема]] ([[user talk:Anonim.one/rfd.js|RfD.js]])',
				token: rfd.$token, text: (($('#rfd-forcewrap').is(':checked')) ? '<' + 'noinclude>' : '') + $template + (($('#rfd-forcewrap').is(':checked')) ? '<' + 'noinclude>' : '') + $content, basetimestamp: rfd._ts(), format: 'json' }, function( $x ) { rfd.process_rfd( $x ) });
		});
	},
 
	process_rfd: function( $data ) {
		if( $data['edit']['result'] == 'editconflict' ) { alert( 'Конфликт правок. Запустите скрипт ещё раз.' ); return false }
		var $h2 = mw.config.get('wgPageName').replace( /_/g, ' ' );
		var $n = '\n\n== [[' + ( ( mw.config.get('wgNamespaceNumber') == 14 || mw.config.get('wgNamespaceNumber') == 6 ) ? ':' : '' ) + $h2 + ']] ==\n' + rfd.$reason + ' ~~' + '~~';
		            $.post( mw.config.get('wgScriptPath') + '/api.php', { action: 'edit', title: rfd._rfd_page(), minor: 1, summary: '\/*' + mw.config.get('wgPageName') + '*\/ новая тема (с помощью [[user talk:Anonim.one/rfd.js|RfD.js]])', token: rfd.$token, appendtext: (!rfd.rfdPageExists ? '\{\{ВПКУ-навигация\}\}' : '') + $n }, function() { window.location = mw.config.get('wgServer') + '/wiki/' + rfd._rfd_page() + '#' + mw.config.get('wgPageName') });
	},
 
	_rfd_page: function() {
		var $date = new Date();
		return this._xe( 'User:VasilievVV/Википедия:К_удалению/' + $date.getUTCDate() + ' ' + ( this._months[$date.getUTCMonth()] ) + 
			' ' + $date.getUTCFullYear() );
	},
 
	_xe: function( $i ) {
		return $i.replace(/\&/g,'&'+'amp;').replace(/</g,'&'+'lt;')
			.replace(/>/g,'&'+'gt;').replace(/\'/g,'&'+'apos;').replace(/\"/g,'&'+'quot;');
	},
        _ae: function( $i ) {
                return $i.replace(/\+/g,'%2B').replace(/&/g,'%26');
        },
 
	_ts: function() {
		var $d = new Date();
		return $d.getUTCFullYear()+'-'+($d.getUTCMonth()+1)+'-'+$d.getUTCDate()+'T'+$d.getUTCHours()+':'+$d.getUTCMinutes()+':'+$d.getUTCSeconds()+'Z';
	},
 
	_months: [ 'января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря' ]
}
 
$( function() {
	if( mw.config.get('wgCanonicalNamespace') != 'Special' && mw.config.get('wgArticleId') && $('#ca-viewsource').length == 0) {
		mw.util.addPortletLink("p-cactions", "javascript: rfd.show_window()", "КУ", "ca-contrib", "Вынести на удаление");
	}
});
 
mw.loader.load( 'jquery.textSelection', 'text/javascript', false );