MediaWiki:Gadget-common-action-delete.js

Материал из Универсал-вики
Перейти к навигации Перейти к поиску

Замечание. Возможно, после сохранения вам придётся очистить кэш своего браузера, чтобы увидеть изменения.

  • Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl-F5 или Ctrl-R (⌘-R на Mac)
  • Google Chrome: Нажмите Ctrl-Shift-R (⌘-Shift-R на Mac)
  • Internet Explorer: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl-F5
  • Opera: Перейдите в Menu → Настройки (Opera → Настройки на Mac), а затем Безопасность → Очистить историю посещений → Кэшированные изображения и файлы
function deletePage(){
	if( window.disableDelScript ) return;

	//"reason" <input> → <textarea>
	$( '#wpReason' ).replaceWith(
		$( '<textarea>' )
			.attr( {
				id: 'wpReason',
				name: 'wpReason',
				rows: '3',
				maxlength: '500'
				}
			)
			.val( $( '#wpReason' ).val() )
	);

	var dropdown = OO.ui.DropdownWidget.static.infuse("#ooui-php-2").dropdownWidget; 
		reason = $( '#wpReason' );
		
	if ( !dropdown || !reason[0] ) return;
	
	//"script info" link
	$( '<a href="https://ru.wikipedia.org/wiki/MediaWiki_talk:Gadget-common-action-delete.js#Документация">Про скрипт</a><span> | </span>' )
		.prependTo( '.mw-delete-editreasons' );
		
	//append "special" buttons
	$ ( '<div>' )
		.attr( 'id', 'deletePage-summaryButtons' )
		.appendTo( $( '#wpWatch' ).closest( 'div' ) );
		
	$( '<input>' )
		.attr( {
			title: 'Вставить в поле причины',
			value: '[[]]',
			type: 'button'
			}
		)
		.click( function(){ $( '#wpReason' ).val( $( '#wpReason' ).val() + '[[]]' ) })
		.appendTo( '#deletePage-summaryButtons' );
	
	//automatic summary preview
	updatePreviewInput = reason;
	updatePreviewOutput = $( '<div>' )
		.attr( 'id', 'deletePage-summaryPreview' )
		.insertAfter( '#wpReason' );
	reason.on( 'keyup mouseup', function(){
		updateSummary(); 
	});

	//simplify dropdown list
	dropdown.getMenu().getItems().forEach( function( item ){
		item.setLabel(item.getLabel().replace(/\[\[[^|]+\|([^\]]+)\]\]/,'$1'));
	});

		
	var delTemplates = {
		'О1':'бессвязно|nonsense|абсурд|nocontext',
		'О2':'тест|test',
		'О3':'ванд|vand|вандал|vandal|attack ',
		'О4':'повторно|repost',
		'О5':'автор|author',
		'О6':'обсужд|talk|doc|док|под|sub|обс|обсуждение|related',
		'О7':'переим|move|переименование|rename',
		'О8':'дубль|fork',
		'О9':'спам|реклама|spam',
		'О10':'badtalk',
		'О11':'copyvio|копивио',
		'С1':'пусто|empty|deleteslow',
		'С2':'иностр|foreign|badtranslt',
		'С3':'ссылки|nocontent',
		'С5':'нз|nn|незначимо',
		'П1':'в никуда|redirect|redirnone',
		'П2':'межпространственный|redirspace',
		'П3':'опечатка|ошибка|redirtypo',
		'П4':'падеж|redirflect',
		'П5':'смысл|redirsense',
		'П6':'redirtalk',
		'К1':'пусткат|catempty|emptycat',
		'К2':'перекат|rencat',
		'У1':'владелец|owner|self|user',
		'У2':'anon|анон',
		'У3':'несущ|nouser',
		'У4':'нецелевое|baduserpage',
		'У5':'неактив|inactive'
	};
	//try to select the reason automatically ...
	var dbReason, ma, str_reason;
	
	var ru_month = 'января,февраля,марта,апреля,мая,июня,июля,августа,сентября,октября,ноября,декабря'.split(',');
	function updateReason(day, month, year) {
		reason.val(
			'согласно \[\[ВП:К удалению/'
			+ day.replace(/^0/,'')+' '+ ru_month[parseInt(month,10)-1]+ ' '+year
			+ '#'+mw.config.get('wgPageName').replace(/_/g, ' ')+']]'
		);
		mw.notify( 'вставлена ссылка на ВП:КУ' );
	}

	function selectReason() {
		var result = false;
		if( ma = /\{\{\s*(db|уд)-?([\wа-яА-Я\s]+)(?:\|\s*([а-яА-Я]+))?.*(?:\}\}|…\*\/)/i.exec( reason.val().replace( "Deleteslow", "db-deleteslow" ) ) ) {
		dbReason = '|' + ma[2].toLowerCase();
		var freason = '';
		if ( ma[3] !== undefined ) {
			freason = ma[3].toLowerCase();
		}
		for (var name in delTemplates)
			if ( ( '|'+delTemplates[name] ).indexOf( dbReason ) != -1 ) {
				if ( name === 'С2'  ) {
					if (freason !== '') {
						selectLabel( name, ' согласно шаблону «' + ma[1] + '-' + ma[2] + '»', freason );
					} else {
						selectLabel( name, ' согласно шаблону «' + ma[1] + '-' + ma[2] + '»', 'не' );
					}
				} else if ( name === 'О6'  ) {
					if (freason !== '') {
						selectLabel( name, ' согласно шаблону «' + ma[1] + '-' + ma[2] + '»', freason );
					} else {
						selectLabel( name, ' согласно шаблону «' + ma[1] + '-' + ma[2] + '»', 'подстраница' );
					}
				} else	if ( name === 'К1' ) {
					if ( freason !== '' ) {
						selectLabel( name, ' согласно шаблону «' + ma[1] + '-' + ma[2] + '»', freason );
					} else {
						selectLabel( name, ' согласно шаблону «' + ma[1] + '-' + ma[2] + '»', 'пустая' );
					}
				} else {
					selectLabel( name, ' согласно шаблону «' + ma[1] + '-' + ma[2] + '»' );
				}
				result = true;
				break;
			}
		}
		return result;
	}

	//from URL param (added by MediaWiki:Group-sysop.js)
	dbReason = mw.util.getParamValue( 'dbreason' );
	if( dbReason !== null ){
		if (! ( ( dbReason === 'К1' ) && selectReason() ) ) {
				selectLabel( dbReason, 'согласно шаблону удаления' );
		}
	//from db-template inside quote 
	} else if ( selectReason() ) {
	//from {К удалению|2010-03-18} inside quote
	} else if( ma = /\{\{(КУ|к удалению) *\| *(\d\d\d\d)-(\d?\d)-(\d?\d)/i.exec( reason.val() ) ){
		updateReason(ma[4], ma[3], ma[2]) 
	//from {К удалению|18-03-2010} inside quote
	} else if( ma = /\{\{(КУ|к удалению) *\| *(\d?\d)-(\d?\d)-(\d\d\d\d)/i.exec( reason.val() ) ){
		updateReason(ma[2], ma[3], ma[4]) 
	// for talk page, except user_talk  
	} else if( mw.config.get( 'wgNamespaceNumber' ) %2 && mw.config.get( 'wgNamespaceNumber' ) != 3 ){
		if( $( '#ca-talk' ).prev().hasClass( 'new' ) && ! /wpreason=/i.test( document.URL )  ) 
			selectLabel( 'О6', '', 'страница' ); //orphaned talk page
		else if( /# *(redirect|перенаправление) *\[\[обсужден/i.test(reason.val()) )
			selectLabel( 'П6' ); //redirect talk page
	}

	if( mw.config.get( 'wgNamespaceNumber' ) == 6 ) {
		dropdown.getMenu().on('select', updateSummary );
		updateSummary();
		return; //nothing to do: there is no /*quote*/ when deleting a file
	}

	var rxQuote = /\/\* *(.*?) *\*\/ ?/, oldQuote = '';

	// /*text quote*/ : automatically remove on "vandalism" reasons
	dropdown.getMenu().on('select', removeBadQuote );
	removeBadQuote(); //also remove on load

	// /*text quote*/ : manually toggle with "x" button 
	if ( rxQuote.test( reason.val() ) )
		$( '<input>' )
			.attr( {
				id: 'btn-quote',
				type: 'button',
				value: 'Убрать цитату',
				title: 'Убрать или добавить начало удаляемой страницы в описание причины удаления'
				}
			)
			.click( function(){ toggleQuote(); reason.focus() } )
			.appendTo( '#deletePage-summaryButtons' );

	//remove dropdown groups that cannot be used
	var hideGroup = function (lbl){
		dropdown.getMenu().getItems().forEach( function( item ){
			if (item.getLabel() === lbl) {
				item.toggle();
				return;
			}
		});
	};
	if ( mw.config.get( 'wgNamespaceNumber' ) !== 0 && mw.config.get( 'wgNamespaceNumber' ) != 102
			&& !/википедия:.*(инкубатор|черновик)/i.test( mw.config.get( 'wgPageName' ) ) ) hideGroup ( 'Статьи' );

    // Если страница была связана с викиданными, вставляем ссылку на элемент 
	try {
		var wikibase=document.getElementById('t-wikibase').getElementsByTagName('a')[0].href.match('Q[0-9]*');
		var rr = ' ([[d:' + wikibase + '|' + wikibase + ']])';
		reason.val(reason.val()+ rr);
	} catch(e) {}
	
	// Если удаляемая страница перенаправление, то вставляем перенаправление в поле причины удаления
  	var api = new mw.Api();
	var params = {
			action: 'query',
            prop: 'revisions',
            titles: mw.config.get('wgPageName'),
            rvprop: 'content',
            formatversion: 2
		};
	api.get(params).done(function(data){
		if(!data || !data.query || !data.query.pages || data.query.pages[0]
		  || data.query.pages[0].revisions || data.query.pages[0].revisions[0]) {
			return;
		}
		var wikitext = data.query.pages[0].revisions[0].content;
        var redirect = wikitext.match(/# *(redirect|перенаправление) *\[\[(.*)\]\]/i);
        if (redirect) {
   		   var rr = ' (перенаправление на [[' +  redirect[2] + ']])';
		   reason.val(reason.val()+ rr);
		   // В этом случае содержание страницы скорее всего не нужно
		   toggleQuote(true);
        }
    });

	updateSummary();

	return;

	// FUNC

	function selectLabel( name, msg, rsn ) {
		pattern = name + ':';
		if ( rsn !== undefined ) {
			pattern = pattern + ' ' + rsn;	
		}
		dropdown.getMenu().selectItemByLabel(pattern, true);
		reason.focus();
		mw.notify( 'выбран ' + dropdown.getMenu().findSelectedItem().getLabel() + ' ' + ( msg||'' ) );
	}

	function toggleQuote( isRemove ) {
		if ( isRemove === undefined ) isRemove = ( oldQuote === '' ); //toggle button
		var rr = reason.val();
		if ( isRemove && ( oldQuote = rxQuote.exec(rr) ) ) {
			oldQuote = oldQuote[0]
			rr = rr.replace( rxQuote, '' )
			mw.notify( 'Цитата убрана' )
			$('#btn-quote').val('Восстановить цитату') 
		} else if ( !isRemove && oldQuote  && ! rxQuote.test(rr) ) { //restore
			rr = oldQuote + rr
			oldQuote = ''
			mw.notify( 'Цитата восстановлена' )
			$('#btn-quote').val('Убрать цитату')
		}
		reason.val( rr );
		updateSummary();
	}

	function removeBadQuote(){
		toggleQuote( /вандализм/.test( dropdown.getMenu().findSelectedItem().getLabel() ) || /перенаправление на/.test( reason.val() ))
	}  

	function updateSummary (e) {
		var p1 = dropdown.getMenu().findSelectedItem().getData();
		if( p1 == 'other' ) p1 = '';
		var p2 = reason.val();
		var text = p1 + (p1 && p2 ? ': ' : '') + p2;
		var leftN = 255 - text.length;
		
		updateSummaryPreview(text);
		
		if ( leftN >= 0 || e == 0 ) return;
		var caret = reason.prop( 'selectionStart' );
		reason.val( reason.val().replace( rxQuote, function( s, q ) {
			var newLen = q.length - (- leftN) - 6;
			if ( newLen >= 10 ) {
				return '/*' + q.substring( 0, newLen ) + '…*/ ';
			}
			return '';
		} ) );
		reason.prop( 'selectionStart', caret );
		reason.prop( 'selectionEnd', caret );
		updateSummary( 0 );
	}
}//main

//needs global vars:    updatePreviewInput, updatePreviewOutput
	
function updateSummaryPreview( text, maxChars ){
	//preview
	text = text
		.replace(/ +/g, ' ')
		.replace(/</g,'&lt;')
		.replace(/\/\* *(.*?) *\*\//, '<span class=autocomment>$1</span>') // /* text */
		.replace(/\[\[:?([^\]><}{|]+)\|?([^\]><]*)?\]\]([a-zа-я]*)/gi, function(str,p1,p2, tail){ //[ [ p1 | p2 ] ]
	if ( !p2 ) p2 = p1
	if ( tail ) p2 += tail
		return '<a href='+mw.config.get('wgServer')+'/wiki/'  + encodeURI(p1.replace(/\?/g,'%3F').replace(/&/g,'%26'))
			+' title=\'' + p1 + '\'>' + p2 + '</a>' })
		updatePreviewOutput.html((text || '&nbsp;'))
}

if ( $.inArray( mw.config.get( 'wgAction' ), ['delete'] ) !== -1 ) {
	mw.loader.using( [ 'mediawiki.util', 'oojs-ui' ] ).done( function () {
		mw.hook( 'wikipage.content' ).add( deletePage );
	} );
}