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

Материал из Википедии — свободной энциклопедии
/**
 * Скрипт, добавляющий три дополнительные боковые панели со ссылками.
 * Взят там: https://ru.wikipedia.org/wiki/User:VasilievVV/links.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 wgLinkMenus = {
  '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%%',*/
      /* Пока так, ибо ссылка выше перестала работать. */
      'uri' : 'http://greatmusiclover.github.io/statsview/?pagename=%%PAGE%%&daysago=30',
      'id' : 'linkmenu-viewstats',
      'tooltip' : 'Просмотреть статистику посещаемости',
      'exists' : 1
    },
    'Статистика посещаемости 2' : {
      'uri' : 'https://tools.wmflabs.org/pageviews/?project=ru.wikipedia.org&platform=all-access&agent=user&range=latest-30&pages=%%PAGE%%',
      'id' : 'linkmenu-viewstats2',
      'tooltip' : 'Просмотреть статистику посещаемости',
      'exists' : 1
    },
    'Поиск копивио' : {
      'uri' : 'https://tools.wmflabs.org/copyvios/?lang=ru&project=wikipedia&title=%%PAGE%%&oldid=&action=search&use_engine=1&use_links=0&turnitin=0',
      'id' : 'linkmenu-copyvio',
      '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/~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' : 'Анализ вклада участника',
    },
    'Журнал прав (локальный)' : {
      '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-afd',
      'tooltip' : 'Искать в архивах ВП:КУ'
    },
    'В архивах ЗКА' : {
      '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');
    wgLinkMenus.rqRFDs = new XMLHttpRequest();
    var uri = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?action=raw&title=' + encodeURIComponent( talkpage );

    wgLinkMenus.rqRFDs.onreadystatechange = wgLinkMenus.onTalkpageLoaded;
    wgLinkMenus.rqRFDs.open( "GET", uri, true );
    wgLinkMenus.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.loader.using('mediawiki.util').done(function () {
          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.loader.using('mediawiki.util').done(function () {
          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 );
      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.loader.using('mediawiki.util').done(function () {
          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') );
    wgLinkMenus.rqRFAs = new XMLHttpRequest();
    wgLinkMenus.rqRFBs = new XMLHttpRequest();

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

    wgLinkMenus.rqRFBs.onreadystatechange = wgLinkMenus.onRFXLinks;
    wgLinkMenus.rqRFBs.open( "GET", mw.config.get('wgScriptPath') + '/api.php?format=json&action=query&list=allpages&aplimit=100&apnamespace=4&apprefix=' + rfbPrefix, true );
    wgLinkMenus.rqRFBs.typeR = 'бюрократа';
    wgLinkMenus.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.loader.using('mediawiki.util').done(function () {
        mw.util.addPortletLink('p-linkmenu-user', rfxUri, "Заявка на статус " + this.typeR + idx, "linkmenu-rfx-" + i, "Выборы");
      });
    }
  },

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

    columnOne = document.getElementById( 'p-logo' ).parentElement;
    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' ? 'portal' : 'portlet' );
      newPortlet.innerHTML = '<h3>' + wgLinkMenus.portletHeaders[portlets[i]] + '</h3><div class="' + (skin == 'vector' ? 'body' : 'pBody') + '"><ul></ul></div>';
      if( interwikis )
        columnOne.insertBefore( newPortlet, interwikis );
      else
        columnOne.appendChild( newPortlet );
    }
  },

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

    userExists = !getElementsByClassName( document, '*', '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;

    wgLinkMenus.addPortlets( addUserLinks );

    for( var title in wgLinkMenus.pageMenu ) {
      elem = wgLinkMenus.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.loader.using('mediawiki.util').done(function () {
        mw.util.addPortletLink('p-linkmenu-page', uri, title, elem.id, elem.tooltip);
      });
    }

    if( addUserLinks ) {
      for( title in wgLinkMenus.userMenu ) {
        elem = wgLinkMenus.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.loader.using('mediawiki.util').done(function () {
          mw.util.addPortletLink('p-linkmenu-user', uri, title, elem.id, elem.tooltip);
        });
      }
      wgLinkMenus.addRFXLinks();
    }

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

    if( addTalkpageLinks )
      wgLinkMenus.addTalkpageLinks();
  }
};

$( wgLinkMenus.addLinks );