Interested Article - Gadget-common-action-delete.js
amity
- 2020-02-13
- 1
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,'<' )
.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 || ' ' );
}
if ( mw.config.get( 'wgAction' ) === 'delete' ) {
mw.loader.using( [ 'mediawiki.util', 'oojs-ui' ] ).done( function () {
mw.hook( 'wikipage.content' ).add( deletePage );
} );
}
amity
- 2020-02-13
- 1