Участник:VasilievVV/oneclickkeep.js

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
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 );