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

Материал из Википедии — свободной энциклопедии
if( typeof( wfAnchorEncode ) != "function" ) {
  function wfAnchorEncode(str) {
    str = encodeURIComponent( str );
    str = str.replace( /%/g, "." );
    str = str.replace( /\.20/g, "_" );
    str = str.replace( /\.3A/g, ":" );
    return str;
  }
}

var wgKeepPage = {
  'rq' : null,
  'newtext' : '',
  'talktext' : '',
  'editsummary' : '',
  'edittoken' : '',

  'addKeepTab' : function() {
    if( !document.getElementById( 'request_for_deletion' ) ) return;

    mw.util.addPortletLink( 'p-cactions', 'javascript:wgKeepPage.keepPage()', 'Оставить', 'ca-keep', 'Снять эту страницу с удаления' );
  },

  'onTextDownload' : function() {
    if( this.readyState != 4 ) return;
    if( this.status != 200 ) return;

    var pgtext = this.responseText;
    var rfdRegex = /(?:\s*<\s*noinclude\s*>)?\s*\{\{\s*К удалению\s*\|\s*\d{4}-\d{2}-\d{2}\s*\}\}\s*(?:<\/noinclude>\s*)?/ig;
    var matches = pgtext.match( rfdRegex );
    if( matches.length < 1 ) {
      alert( 'Не найдена пометка {{' + 'к удалению}}' );
      return;
    }
    var date = matches[0].match(/(\d{4})-(\d{2})-(\d{2})/);
    wgKeepPage.newtext = pgtext.replace( rfdRegex, "" );
    wgKeepPage.talktext = "{{оставлено|" + date[0] + "}}\n";
    wgKeepPage.editsummary = 'оставлено согласно \[\[Википедия:К удалению/' + (date[3][0] == '0' ? date[3][1] : date[3]) + ' ' +
                             'января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября|декабря'
                             .split('|')[(date[2][0] == '0' ? parseInt(date[2][1]) : parseInt(date[2]))-1] + ' ' + date[1] +
                             '#' + mw.config.get('wgPageName').replace(/_/g, ' ') + ']]';

    var uri = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?format=json&action=query&prop=info&intoken=edit&titles=' + encodeURIComponent( mw.config.get('wgPageName') );
    wgKeepPage.rq.onreadystatechange = wgKeepPage.onTokenDownload;
    wgKeepPage.rq.open( "GET", uri, true );
    wgKeepPage.rq.send( "" );
  },

  'onTokenDownload' : function() {
    if( this.readyState != 4 ) return;
    if( this.status != 200 ) return;

    result = eval('('+this.responseText+')');
    wgKeepPage.edittoken = result.query.pages[mw.config.get('wgArticleId')].edittoken;
    if( !wgKeepPage.edittoken ) {
      alert( 'Редактирование невозможно' );
      return;
    }

    var uri = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?format=json&action=edit&title=' + encodeURIComponent( mw.config.get('wgPageName') );
    var rq = "summary=" + encodeURIComponent( wgKeepPage.editsummary ) +
      "&text=" + encodeURIComponent( wgKeepPage.newtext ) +
      "&token=" + encodeURIComponent( wgKeepPage.edittoken );

    wgKeepPage.rq.onreadystatechange = wgKeepPage.onEditSaved;
    wgKeepPage.rq.open( "POST", uri, true );
    wgKeepPage.rq.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
    wgKeepPage.rq.send( rq );
  },

  'onEditSaved' : function() {
    if( this.readyState != 4 ) return;
    if( this.status != 200 ) return;

    result = eval('('+this.responseText+')');
    if( typeof( result.error ) != 'undefined' ) {
      alert( "Не удалось сохранить страницу: " + result.error.info );
      return;
    }

    var title;
    if( mw.config.get('wgNamespaceNumber') == 0 ) {
      title = "Обсуждение:" + mw.config.get('wgPageName');
    } else if( mw.config.get('wgNamespaceNumber') == 2 ) {
      title = "Обсуждение участника:" + mw.config.get('wgPageName');
    } else if( mw.config.get('wgNamespaceNumber') == 4 ) {
      title = "Обсуждение Википедии:" + mw.config.get('wgPageName');
    } else if( mw.config.get('wgNamespaceNumber') == 6 ) {
      title = "Обсуждение файла:" + mw.config.get('wgPageName');
    } else if( mw.config.get('wgNamespaceNumber') == 10 ) {
      title = "Обсуждение шаблона:" + mw.config.get('wgPageName');
    } else if( mw.config.get('wgNamespaceNumber') == 14 ) {
      title = "Обсуждение категории:" + mw.config.get('wgPageName');
    } else {
      jsMsg( 'Страница была успешно снята с удаления. <a href="javascript:location.reload()">Перезагрузить страницу</a>');
      return;
    }

    var uri = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?format=json&action=edit&title=' + encodeURIComponent( title );
    var rq = "summary=" + encodeURIComponent( wgKeepPage.editsummary ) +
      "&prependtext=" + encodeURIComponent( wgKeepPage.talktext ) +
      "&token=" + encodeURIComponent( wgKeepPage.edittoken );

    wgKeepPage.rq.onreadystatechange = wgKeepPage.onTalkSaved;
    wgKeepPage.rq.open( "POST", uri, true );
    wgKeepPage.rq.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
    wgKeepPage.rq.send( rq );
  },

  'onTalkSaved' : function() {
    if( this.readyState != 4 ) return;
    if( this.status != 200 ) return;

    result = eval('('+this.responseText+')');
    if( typeof( result.error ) != 'undefined' ) {
      alert( "Не удалось сохранить страницу обсуждения: " + result.error.info );
      return;
    }

    jsMsg( 'Страница была успешно снята с удаления; на страницу обсуждения был поставлен шаблон {{' + 'оставлено}}. ' +
      '<a href="javascript:location.reload()">Перезагрузить страницу</a>' );
  },

  'keepPage' : function() {
    var uri = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?action=raw&title=' + encodeURIComponent( mw.config.get('wgPageName') );
    this.rq = sajax_init_object();

    this.rq.onreadystatechange = this.onTextDownload;
    this.rq.open( "GET", uri, true );
    this.rq.send( "" );
  }
}

$( wgKeepPage.addKeepTab );