Interested Article - Gadget-common-action-delete.js

JS-код ниже относится к гаджету common-action-delete . Связанный CSS-файл: MediaWiki:Gadget-common-action-delete.css . Он включён по умолчанию.

После сохранения или недавних изменений очистите кэш браузера .

function deletePage() {
	if ( window.disableDelScript ) {
		return;
	}

	var reasonList = OO.ui.DropdownWidget.static.infuse( '#wpDeleteReasonList'),
		reasonInput = OO.ui.TextInputWidget.static.infuse('#wpReason');
		
	if ( !reasonList || !reasonInput) {
		return;
	}
	
	reasonInput = new OO.ui.MultilineTextInputWidget( { 
		inputId : reasonInput.$input[0].id,
		tabIndex : reasonInput.$input[0].tabIndex,
		id : 'wpReason',  
		name : 'wpReason',  
		value : reasonInput.value,
	});
	// "reason" <input> → <textarea>
	$('#wpReason' ).replaceWith( reasonInput.$element );
	// save infusion data
	$('#wpReason').data( 'ooui-infused', reasonInput ); 
	$('#wpReason').attr( 'data-ooui', '' );
	var reason = $( '#ooui-php-2' );

	var menu = reasonList.dropdownWidget.getMenu();

	// "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 () {
			var focus = $( '#ooui-php-2' );
			if (focus && focus.is('textarea, input')) {
				var text = focus.textSelection('getSelection');
				text = (text) ? '[[' + text + ']]' : '[[]]';
				focus.textSelection( 'encapsulateSelection', {
						replace: true,
						peri: text
					} );
			}
		} )
		.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
	menu.getItems().forEach( function ( item ) {
		item.setLabel(
			item.getLabel().replace( /\[\[[^|]+\|([^\]]+)\]\]/,'$1' )
		);
	} );

	// список ниже должен быть синхронизирован с MediaWiki:Deletereason-dropdown и шаблонами быстрого удаления
	var delTemplates = {
		'О1:': 'бессвязно|nonsense|абсурд',
		'О2': 'тест|test',
		'О3: страница': 'вандализм|vandalism|attack',
		'О3: статья': 'hoax|мистификация',
		'О4': 'повторно|репост|repost',
		'О5': 'автор|author',
		'О6: подстраница': 'обсуждение|talk',
		'О6: страница': 'related|sub|под|doc|док',
		'О7': 'переименование|move|rename',
		'О8': 'дубль|fork|форк',
		'О9': 'спам|реклама|spam',
		'О10': 'badtalk',
		'О11': 'copyvio|копивио',
		'С1': 'пусто|empty|deleteslow',
		'С2: не': 'иностр|foreign|lang',
		'С2: машинный': 'машинный|машперевод',
		'С3': 'ссылки|nocontent',
		'С5': 'нз|nn|незначимо',
		'П1': 'в никуда|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 ma;
	
	function reasonKU( day, month, year ) {
		var monthsNames = ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'];
		reason.val(
			'согласно \[\[ВП:К удалению/'
			+ day.replace( /^0/,'' ) + ' ' + monthsNames[parseInt( month, 10 )-1] + ' ' + year
			+ '#' + mw.config.get( 'wgPageName' ).replace( /_/g, ' ' ) + ']]'
		);
		mw.notify( 'вставлена ссылка на ВП:КУ' );
	}

	function reasonKBU() {
		var name, dbReason;
		if ( ma = /\{\{\s*(db|уд)-([a-zа-я ]+[a-zа-я])\s*(\||\}\})/i.exec( reason.val().replace( "Deleteslow", "db-deleteslow" ) ) ) {
			dbReason = '|' + ma[2].toLowerCase();
		} else if ( ma = /\{\{\s*(db|уд|КБУ|d|del|delete)\s*\|\s*([ОСПКУ]1?\d)?([a-zа-я]{3,})?/i.exec( reason.val() ) ) {
			if (ma[2])
				name = ma[2];
			else if (ma[3])
				dbReason = '|' + ma[3].toLowerCase();
		}

		if ( name ) {
			selectLabel( name, ' согласно шаблону «' + ma[1] + '-' + ma[2] + '»' );
			return true;
		} else if ( dbReason ) {
			for ( name in delTemplates )
				if ( ( '|' + delTemplates[name] ).indexOf( dbReason ) != -1 ) {
					selectLabel( name, ' согласно шаблону «' + ma[1] + '-' + ma[2] + '»' );
					return true;
				}
		}
	}

	// from db-template inside quote 
	if ( reasonKBU() ) {
	// from {К удалению|2010-03-18} inside quote
	} else if( ma = /\{\{(КУ|к удалению) *\| *(\d\d\d\d)-(\d?\d)-(\d?\d)/i.exec( reason.val() ) ) {
		reasonKU( 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() ) ) {
		reasonKU( ma[2], ma[3], ma[4] );
	// КБУ в параметре
	} else if( ma = /\[\[ВП:КБУ#[ОСПУК]\d+\|([ОСПУК]\d+)\]\]\: [^;]*;?(.*)/i.exec( reason.val() ) ) {
		reason.val( ma[2].trim() ); // cut before semicolon
		selectLabel( ma[1] );
	// 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 ) {
		menu.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
	menu.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' );

    // Если страница была связана с викиданными, вставляем ссылку на элемент 
	try {
		var wikibase = $( '#t-wikibase a' )
			.attr( '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 ) {
			var wikitext, redirect;
			try {
				wikitext = data.query.pages[0].revisions[0].content;
				redirect = wikitext.match( /# *(redirect|перенаправление) *\[\[(.*)\]\]/i );
			} catch (e) {}
	
			if ( redirect ) {
				var rr = ' (→ [[' +  redirect[2] + ']])';
				reason.val( reason.val()+ rr );
				// В этом случае содержание страницы скорее всего не нужно
				toggleQuote( true );
			}
		} )
		.always( updateSummary );
	return;

	// FUNC

	function selectLabel( name, msg ) {
		menu.selectItemByLabel( name, true );
		reasonInput.focus();
		mw.notify( 'Выбрано ' + menu.findSelectedItem().getLabel() + ' ' + ( msg || '' ) );
	}

	function toggleQuote( isRemove ) {
		if ( isRemove === undefined ) { //toggle button
			isRemove = ( oldQuote === '' );
		}
		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( menu.findSelectedItem().getLabel() ) || /перенаправление на/.test( reason.val() )
		);
	}  

	function updateSummary (e) {
		var p1 = menu.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;
			}
			var pathname = encodeURI( p1.replace(/\?/g,'%3F' ).replace( /&/g,'%26' ) );
			return '<a href=' + mw.config.get('wgServer') + '/wiki/'  + pathname +' title=\'' + p1 + '\'>' + p2 + '</a>';
		} );
	updatePreviewOutput.html( text || '&nbsp;' );
}

if ( mw.config.get( 'wgAction' ) === 'delete' ) {
	mw.loader.using( [ 'mediawiki.util', 'oojs-ui' ] ).done( function () {
		mw.hook( 'wikipage.content' ).add( deletePage );
	} );
}
Источник —

Same as Gadget-common-action-delete.js