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

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
/**
 * Скрипт, который добавляет три дополнительные боковые панели.
 */

mw.loader.using('mediawiki.util').then(function () {

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 linkMenus = {
  'rqRFDs' : null,
  'rqRFAs' : null,
  'rqRFBs' : null,

  'pageMenu' : {
    'Журнал страницы' : {
      'uri' : '?title=Special:Log&page=%%PAGE%%',
      'id' : 'linkmenu-logs',
      'tooltip' : 'Просмотреть журнал страницы',
      'exists' : 1
    },
    'Статистика посещаемости' : {
      'uri' : 'http://stats.grok.se/ru/latest/%%PAGE%%',
      'id' : 'linkmenu-viewstats',
      'tooltip' : 'Просмотреть статистику посещаемости',
      'exists' : 1
    },
    'Анализ истории' : {
      'uri' : 'http://vs.aka-online.de/cgi-bin/wppagehiststat.pl?lang=ru.wikipedia&page=%%PAGE%%',
      'id' : 'linkmenu-historystats',
      'tooltip' : 'Анализ истории правок',
      'exists' : 1
    },
    'Подстраницы' : {
      'uri' : '?title=Special:Prefixindex/%%PAGE%%/',
      'id' : 'linkmenu-subpages',
      'tooltip' : 'Просмотреть список подстраниц',
      'exists' : 0
    },
    'Анализ страницы' : {
      'uri' : 'http://ru.wikichecker.com/article/?a=%%PAGE%%',
      'id' : 'linkmenu-pageanalysis',
      'tooltip' : 'Анализ истории правок',
      'exists' : 1
    },
    'Очистить кэш' : {
      'uri' : '?title=%%PAGE%%&action=purge',
      'id' : 'linkmenu-purge',
      'tooltip' : 'Очистить кэш страницы',
      'exists' : 0
    },
    'Последняя правка' : {
      'uri' : '?title=%%PAGE%%&diff=0',
      'id' : 'linkmenu-lastedit',
      'tooltip' : 'Последняя правка страницы',
      'exists' : 1
    },
  },
  'userMenu' : {
    'Счётчик правок' : {
      'uri' : 'http://toolserver.org/~vvv/yaec.php?wiki=ruwiki_p&user=%%USER%%',
      'id' : 'linkmenu-editcount',
      'tooltip' : 'Показать анализ правок участника',
    },
    'Описания правок' : {
      'uri' : 'http://toolserver.org/~tparis/editsummary/index.php?lang=ru&wiki=wikipedia&name=%%USER%%',
      'id' : 'linkmenu-editsummaries',
      'tooltip' : 'Статистика использования участником описаний правок',
    },
    'Анализ вклада' : {
      'uri' : 'http://ru.wikichecker.com/user/?l=all&t=%%USER%%',
      'id' : 'linkmenu-useranalysis',
      'tooltip' : 'Анализ вклада участника',
    },
    'SUL-информация' : {
      'uri' : 'http://toolserver.org/~vvv/sulutil.php?user=%%USER%%',
      'id' : 'linkmenu-sulutil',
      'tooltip' : 'Показать информацию об учётных записях участника на других проектах'
    },
    'Загруженные изображения' : {
      'uri' : 'http://toolserver.org/~daniel/WikiSense/Gallery.php?wikilang=ru&&wikifam=.wikipedia.org&format=html&&order=-img_timestamp&img_user_text=%%USER%%',
      'id' : 'linkmenu-userimages',
      'tooltip' : 'Галерея изображений, загруженных участником',
    },
    'Журнал прав (локальный)' : {
      'uri' : '?title=Special:Log/rights&page=User:%%USER%%',
      'id' : 'linkmenu-rightsloglocal',
      'tooltip' : 'Журнал изменения прав участника',
    },
    'Журнал прав (Мета)' : {
      'uri' : 'http://meta.wikimedia.org/w/index.php?title=Special:Log/rights&page=User:%%USER%%@ruwiki',
      'id' : 'linkmenu-rightslogmeta',
      'tooltip' : 'Журнал изменения прав участника стюардами',
    },
  },
  'searchMenu' : {
    'В архивах ЗКА' : {
      'prefix' : 'Википедия:Запросы к администраторам',
      'id' : 'linkmenu-search-ani',
      'tooltip' : 'Искать в архивах ВП:ЗКА'
    },
    'В архивах ФА' : {
      'prefix' : 'Википедия:Форум администраторов',
      'id' : 'linkmenu-search-an',
      'tooltip' : 'Искать в архивах ВП:ФА'
    },
    'В архивах ФП' : {
      'prefix' : 'Википедия:Форум патрулирующих',
      'id' : 'linkmenu-search-pn',
      'tooltip' : 'Искать в архивах ВП:ФП'
    },
    'В архивах ВУ' : {
      'prefix' : 'Википедия:Форум/Архив/Вниманию участников',
      'id' : 'linkmenu-search-flameplace',
      'tooltip' : 'Искать в архивах ВП:ВУ'
    },
    'В архивах форумов' : {
      'prefix' : 'Википедия:Форум/Архив',
      'id' : 'linkmenu-search-vp',
      'tooltip' : 'Искать в архивах форума'
    },
    'В архивах АК' : {
      'prefix' : 'Википедия:Заявки на арбитраж',
      'id' : 'linkmenu-search-rfar',
      'tooltip' : 'Искать в исках в АК'
    },
    'В архивах ЗЛВЧ' : {
      'prefix' : 'Википедия:Проект:Знаете ли вы/Архив рубрики',
      'id' : 'linkmenu-search-dyk',
      'tooltip' : 'Искать в архивах рубрики "Знаете ли вы"'
    },
    'В архивах работы недели' : {
      'prefix' : 'Википедия:Кандидаты на работу недели/Архив',
      'id' : 'linkmenu-search-cotw',
      'tooltip' : 'Искать в архивах "совместной работы недели"'
    },
  },

  'portletHeaders' : {
    'page' : 'Страница',
    'search' : 'Поиск',
    'user' : 'Участник',
  },

  'addTalkpageLinks' : function() {
    talkpage = mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceNumber') + 1] + ':' + mw.config.get('wgTitle');
    linkMenus.rqRFDs = new XMLHttpRequest();
    var uri = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?action=raw&title=' + encodeURIComponent( talkpage );

    linkMenus.rqRFDs.onreadystatechange = linkMenus.onTalkpageLoaded;
    linkMenus.rqRFDs.open( "GET", uri, true );
    linkMenus.rqRFDs.send( '' );
  },

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

    pgtext = this.responseText;

    var rfdRegex = /\{\{\s*(оставлен[оа]|kept)\s*\|\s*((\d?\d \S+ \d\d\d\d\|?)+)\s*\}\}/ig;
    var facRegex = /\{\{\s*Сообщение ИС\s*\|\s*\d?\d \S+ \d\d\d\d\|([^|}]+)/ig;
    var gacRegex = /\{\{\s*Сообщение ХС\s*\|\s*\d?\d \S+ \d\d\d\d/ig;
    var dateRegex = /(\d\d \S+ \d\d\d\d)/ig;

    var matches = pgtext.match( rfdRegex );
    if( matches && matches.length > 0 ) {
      matches = matches[0].match( dateRegex ) || [];
      for( i = 0; i < matches.length; i++ ) {
        rfdUri = 'http://ru.wikipedia.org/wiki/Википедия:К_удалению/' + matches[i] + '#' + wfAnchorEncode( mw.config.get('wgPageName') );
        idx = i > 0 ? " (" + String(i + 1) + ")" : "";
        mw.util.addPortletLink( 'p-linkmenu-page', rfdUri, "Обсуждение на ВП:КУ" + idx, "linkmenu-rfd" + i, "Ссылка на обсуждение об удалении статьи" );
      }
    }

    matches = pgtext.match( facRegex );
    if( matches && matches.length > 0 ) {
      for( i = 0; i < matches.length; i++ ) {
	    facName = matches[i].replace( /\{\{\s*Сообщение ИС\s*\|\s*\d?\d \S+ \d\d\d\d\|/ig, '' )
        facUri = 'http://ru.wikipedia.org/wiki/Википедия:Кандидаты_в_избранные_статьи/' + encodeURIComponent( facName );
        idx = i > 0 ? " (" + String(i + 1) + ")" : "";
        mw.util.addPortletLink( 'p-linkmenu-page', facUri, "Обсуждение на ВП:КИС" + idx, "linkmenu-fac" + i, "Ссылка на обсуждение об избрании статьи в избранные" );
      }
    }

    matches = pgtext.match( gacRegex );
    if( matches && matches.length > 0 ) {
      matches = matches[0].match( dateRegex );
      if( matches && matches.length > 0 ) {
	      for( i = 0; i < matches.length; i++ ) {
	        gacUri = 'http://ru.wikipedia.org/wiki/Википедия:Кандидаты_в_хорошие_статьи/' + matches[i] + '#' + wfAnchorEncode( mw.config.get('wgPageName') );
	        idx = i > 0 ? " (" + String(i + 1) + ")" : "";
	        mw.util.addPortletLink( 'p-linkmenu-page', gacUri, "Обсуждение на ВП:КХС" + idx, "linkmenu-gac" + i, "Ссылка на обсуждение об избрании статьи в хорошие" );
	      }
      }
    }
  },

  'addRFXLinks' : function() {
    rfaPrefix = encodeURIComponent( 'Заявки_на_статус_администратора/' + mw.config.get('wgTitle') );
    rfbPrefix = encodeURIComponent( 'Заявки_на_статус_бюрократа/' + mw.config.get('wgTitle') );
    linkMenus.rqRFAs = new XMLHttpRequest();
    linkMenus.rqRFBs = new XMLHttpRequest();

    linkMenus.rqRFAs.onreadystatechange = linkMenus.onRFXLinks;
    linkMenus.rqRFAs.open( "GET", mw.config.get('wgScriptPath') + '/api.php?format=json&action=query&list=allpages&aplimit=100&apnamespace=4&apprefix=' + rfaPrefix, true );
    linkMenus.rqRFAs.typeR = 'администратора';
    linkMenus.rqRFAs.send( '' );

    linkMenus.rqRFBs.onreadystatechange = linkMenus.onRFXLinks;
    linkMenus.rqRFBs.open( "GET", mw.config.get('wgScriptPath') + '/api.php?format=json&action=query&list=allpages&aplimit=100&apnamespace=4&apprefix=' + rfbPrefix, true );
    linkMenus.rqRFBs.typeR = 'бюрократа';
    linkMenus.rqRFBs.send( '' );
  },

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

    result = eval( '(' + this.responseText + ')' );
    pages = result.query.allpages
    for( i = 0; i < pages.length; i++ ) {
      title = pages[i].title;
      rfxUri = mw.config.get('wgScript') + "?title=" + encodeURIComponent( title );
      idx = i > 0 ? " (" + String(i + 1) + ")" : "";
      mw.util.addPortletLink( 'p-linkmenu-user', rfxUri, "Заявка на статус " + this.typeR + idx, "linkmenu-rfx-" + i, "Выборы" );
    }
  },

  'addPortlets' : function( addUserLinks ) {
    var portlets = [ 'page', 'search' ];
	var skin = mw.config.get( 'skin' );
    if( addUserLinks )
      portlets[portlets.length] = 'user';

    columnOne = document.getElementById( skin == 'vector' ? 'mw-panel' : 'sidebar' );
    interwikis = document.getElementById( 'p-lang' );
    for( i = 0; i < portlets.length; i++ ) {
      newPortletId = 'p-linkmenu-' + portlets[i];
      newPortlet = document.createElement( 'div' );
      newPortlet.setAttribute( 'id', newPortletId );
      newPortlet.setAttribute( 'class', skin == 'vector' ? 'vector-menu vector-menu-portal portal' : 'portlet' );
      newPortlet.innerHTML = '<h3>' + linkMenus.portletHeaders[portlets[i]] + '</h3><div class="' + (skin == 'vector' ? 'vector-menu-content body' : 'pBody') + '"><ul></ul></div>';
      if( interwikis && columnOne )
        columnOne.insertBefore( newPortlet, interwikis );
      else if ( columnOne )
        columnOne.appendChild( newPortlet );
    }
  },

  'addLinks' : function() {
    if( mw.config.get('wgNamespaceNumber') < 0 )
      return;

    userExists = !document.getElementsByClassName( 'mw-userpage-userdoesnotexist' ).length;
    var addUserLinks = ( mw.config.get('wgNamespaceNumber') == 2 || mw.config.get('wgNamespaceNumber') == 3 ) && mw.config.get('wgTitle').indexOf( "/" ) == -1 && userExists;
    var addTalkpageLinks = mw.config.get('wgNamespaceNumber') % 2 == 0;

    linkMenus.addPortlets( addUserLinks );

    for( title in linkMenus.pageMenu ) {
      elem = linkMenus.pageMenu[title];
      if( elem.exists && !mw.config.get('wgArticleId') )
        continue;
      uri = elem.uri;
      uri = uri.replace( '%%PAGE%%', encodeURIComponent( mw.config.get('wgPageName') ) );
      if( uri.substr( 0, 1 ) == '?' )
        uri = mw.config.get('wgScript') + uri;
      mw.util.addPortletLink( 'p-linkmenu-page', uri, title, elem.id, elem.tooltip );
    }

    if( addUserLinks ) {
      for( title in linkMenus.userMenu ) {
        elem = linkMenus.userMenu[title];
        if( elem.exists && !userExists )
          continue;
        uri = elem.uri;
        uri = uri.replace( '%%USER%%', encodeURIComponent( mw.config.get('wgTitle') ) );
        if( uri.substr( 0, 1 ) == '?' )
          uri = mw.config.get('wgScript') + uri;
        mw.util.addPortletLink( 'p-linkmenu-user', uri, title, elem.id, elem.tooltip );
      }
      linkMenus.addRFXLinks();
    }

    for( title in linkMenus.searchMenu ) {
      elem = linkMenus.searchMenu[title];
      uri = mw.config.get('wgScript') + '?title=Special:Search&fulltext=1&search=' + encodeURIComponent( mw.config.get('wgTitle') ) +
        ' prefix:' + encodeURIComponent( elem.prefix )
      mw.util.addPortletLink( 'p-linkmenu-search', uri, title, elem.id, elem.tooltip );
    }

    if( addTalkpageLinks )
      linkMenus.addTalkpageLinks();
  }
};

$( linkMenus.addLinks );

} );