var OneClickKeep = function () {
this.transformRevision = this.transformRevision.bind( this );
this.onEditSuccess = this.onEditSuccess.bind( this );
this.onEditError = this.onEditError.bind( this );
this.onTalkEditSuccess = this.onTalkEditSuccess.bind( this );
this.onTalkEditError = this.onTalkEditError.bind( this );
};
var oneClickKeepPrototype = {
addKeepTab: function () {
if ( !$( '#request_for_deletion' ).length ) return;
mw.loader.using( 'mediawiki.util', function () {
mw.util.addPortletLink(
'p-cactions',
'javascript:oneClickKeep.keepPage();',
'Оставить',
'ca-keep',
'Снять эту страницу с удаления'
);
});
},
getApi: function () {
return new mw.Api( {
parameters: {
formatversion: 2,
errorformat: 'html',
errorlang: mw.config.get( 'wgUserLanguage' ),
errorsuselocal: true,
},
} );
},
notify: function ( html, type ) {
type = type || 'info';
mw.notify( $.parseHTML( html ), { type: type } );
},
transformRevision: function ( revision ) {
var rfdRegex = /(?:\s*<\s*noinclude\s*>)?\s*\{\{\s*(КУ|К удалению)\s*\|\s*\d{4}-\d{1,2}-\d{1,2}\s*\}\}\s*(?:<\/noinclude>\s*)?/ig;
var matches = revision.content.match( rfdRegex );
if ( !matches ) {
return $.Deferred().reject( 'script' ).promise();
}
var newText = revision.content.replace( rfdRegex, '' );
var date = matches[ 0 ].match( /(\d{4})-(\d{1,2})-(\d{1,2})/ );
this.talkText = '{' + '{оставлено|' + date[ 0 ] + '}}\n';
var month = 'января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября|декабря'
.split( '|' )[ parseInt( date[ 2 ] ) - 1 ];
this.editSummary = (
'оставлено согласно [[Википедия:К удалению/' +
parseInt( date[ 3 ] ) +
' ' +
month +
' ' +
date[ 1 ] +
'#' +
this.title.getPrefixedText() +
']] ([[Участник:VasilievVV/oneclickkeep.js|oneclickkeep.js]])'
);
return {
summary: this.editSummary,
text: newText,
};
},
keepPage: function () {
mw.loader.using( [ 'mediawiki.Title', 'mediawiki.api' ] ).then( function () {
oneClickKeep.title = new mw.Title( mw.config.get( 'wgPageName' ) );
oneClickKeep.getApi()
.edit( oneClickKeep.title, oneClickKeep.transformRevision )
.then( oneClickKeep.onEditSuccess, oneClickKeep.onEditError );
} );
},
onEditSuccess: function () {
if ( this.title.isTalkPage() ) {
this.notify(
'Страница была успешно снята с удаления. <a href="javascript:location.reload();">Перезагрузить страницу</a>.',
'success'
);
return;
}
this.getApi()
.postWithEditToken( {
action: 'edit',
title: this.title.getTalkPage().getPrefixedText(),
summary: this.editSummary,
prependtext: this.talkText,
} )
.then( this.onTalkEditSuccess, this.onTalkEditError );
},
onEditError: function ( code, data ) {
var text;
if ( code === 'script' ) {
text = 'Не найдена пометка <code>{' + '{к удалению}}</code>.';
} else if ( code === 'http' ) {
text = 'Не удалось отредактировать страницу: Сетевая ошибка.';
} else {
text = 'Не удалось отредактировать страницу: ' + data.errors[ 0 ].html;
}
this.notify( text, 'error' );
},
onTalkEditSuccess: function () {
this.notify(
'Страница была успешно снята с удаления. На страницу обсуждения был поставлен шаблон <code>{' + '{оставлено}}</code>. <a href="javascript:location.reload();">Перезагрузить страницу</a>.',
'success'
);
},
onTalkEditError: function ( code, data ) {
var text;
if ( code === 'http' ) {
text = 'Не удалось отредактировать страницу обсуждения: Сетевая ошибка.';
} else {
text = 'Не удалось отредактировать страницу обсуждения: ' + data.errors[ 0 ].html;
}
this.notify( text, 'error' );
},
};
Object.assign( OneClickKeep.prototype, oneClickKeepPrototype );
var oneClickKeep = new OneClickKeep();
$( oneClickKeep.addKeepTab );