Чемпион Южной Америки 1916 Чемпион Южной Америки 1917 Чемпион Южной Америки 1920 Чемпион Южной Америки 1923 Олимпийский чемпион и чемпион мира среди любителей 1924 Чемпион Южной Америки 1924 Чемпион Южной Америки 1926 Олимпийский чемпион и чемпион мира среди любителей 1928 Чемпион мира 1930 Чемпион Южной Америки 1935 Чемпион Южной Америки 1942 Чемпион мира 1950 Чемпион Южной Америки 1956 Чемпион Южной Америки 1959 (Эквадор) Чемпион Южной Америки 1967 Победитель Мундиалито 1980-81 Победитель Кубка Америки 1983 Победитель Кубка Америки 1987 Победитель Кубка Америки 1995 Победитель Кубка Америки 2011

MediaWiki:Common.js — различия между версиями

Материал из CelestePedia
Перейти к: навигация, поиск
 
(не показаны 4 промежуточные версии этого же участника)
Строка 1: Строка 1:
//import scripts
+
/*if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) {
importScript('MediaWiki:Editpage.js');
+
        mw.loader.load( '/mediawiki/index.php?title=MediaWiki:Gadget-wikificator.js&action=raw&ctype=text/javascript' );
importScript('MediaWiki:Collapsebuttons.js');
+
}
importScript('User:X-romix/SciRefs.js');
 
importScript('MediaWiki:Refstandard.js');
 
  
addLoadEvent = addOnloadHook
+
var customizeToolbar = function() {
importScript_ = importScript
 
  
 +
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
 +
        'section': 'advanced',
 +
        'group': 'format',
 +
        'tools': {
 +
                'wikify': {
 +
                        label: 'Викификатор',
 +
                        type: 'button',
 +
                        icon: '//upload.wikimedia.org/wikipedia/commons/0/06/Wikify-toolbutton.png',
 +
                            action: {
 +
                                  type: 'callback',
 +
                                      execute: function(context){
 +
                                              Wikify();
 +
                                      }
 +
                            }
 +
                }
 +
        }
 +
} );
 +
};
 +
 +
if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) {
 +
        mw.loader.using( 'user.options', function () {
 +
                if ( mw.user.options.get('usebetatoolbar') ) {
 +
                        mw.loader.using( 'ext.wikiEditor.toolbar', function () {
 +
                                $(document).ready( customizeToolbar );
 +
                        } );
 +
                }
 +
        } );
 +
}
 +
*/
 +
/*
 +
var importScript_ = importScript;
 +
importScript = function ( page, proj ) {
 +
if ( !proj ) {
 +
importScript_( page );
 +
} else {
 +
if ( proj.indexOf( '.' ) === -1 ) {
 +
proj += 'celeste-rus.ru';
 +
}
 +
mw.loader.using( 'mediawiki.util' ).done( function () {
 +
mw.loader.load( 'https://' + proj + '/mediawiki/index.php?title=' + mw.util.wikiUrlencode( page ) +
 +
'&action=raw&ctype=text/javascript' );
 +
} );
 +
}
 +
};
 +
*/
 +
importScript = function ( page, proj ) {
 +
mw.loader.using( 'mediawiki.util' ).done( function () {
 +
mw.loader.load( 'https://celeste-rus.ru/index.php?title=' + mw.util.wikiUrlencode( page ) +
 +
'&action=raw&ctype=text/javascript' );
 +
} );
 +
};
  
// for backwards compatibility
+
function runAsEarlyAsPossible( callback, $testElement, func ) {
var addLoadEvent = addOnloadHook;
+
func = func || $;
var import_script = importScript;
+
$testElement = $testElement || $( '#footer' );
var import_style = importStylesheet;
 
var importScript_ = importScript;
 
 
 
//
 
  
function addLoadEvent(func)
+
if ( $testElement.length ) {
{
+
callback();
if (window.addEventListener)  
+
} else {
  window.addEventListener("load", func, false);
+
func( callback );
else if (window.attachEvent)
+
}
  window.attachEvent("onload", func);
 
 
}
 
}
  
//Edit zero section
+
/**
if (wgAction == 'view' && wgNamespaceNumber >=0)
+
  * Настройка обработки «е» и «ё» при сортировке в таблицах
addOnloadHook(function(){
+
  */
  var h2s = document.getElementsByTagName('H2');
+
mw.config.set( 'tableSorterCollation', { 'Ё': 'Е', 'ё': 'е' } );
  var h2 = h2s[0];
 
if (!h2) return;
 
if (h2.parentNode.id == 'toctitle') h2 = h2s[1];
 
if (!h2) return;
 
var span = h2.firstChild;
 
if (!span || span.className != 'editsection') return;
 
var zero = span.cloneNode(true);
 
if (document.getElementById('featured-star')) zero.style.marginRight = '25px'
 
var parent = document.getElementsByTagName('H1')[0];
 
parent.insertBefore(zero, parent.firstChild);
 
var a = zero.getElementsByTagName('A')[0];
 
a.title = a.title.replace(/:.*$/,': 0');
 
a.setAttribute('href', a.href.replace(/&section=1/,'&section=0'));
 
})
 
 
 
// hasClass()
 
var hasClass = (function () {
 
    var reCache = {};
 
    return function (element, className) {
 
      return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
 
    };
 
})();
 
 
  
function sysopProtectPage(){
+
// Messages
var inp = document.getElementById('mwProtect-level-edit')  
+
var expandCaption, collapseCaption, zeroSectionTip;
if (inp) addHandler(inp, 'change', noMoveAutoconfirmedProtection)
+
if ( mw.config.get( 'wgUserLanguage' ) === 'en' ) {
function noMoveAutoconfirmedProtection(){
+
expandCaption = 'show';
  var inp = document.getElementById('mwProtectUnchained')
+
collapseCaption = 'hide';
  if (!inp || inp.checked) return
+
zeroSectionTip = 'Edit lead section';
  inp = document.getElementById('mwProtect-level-move')
+
} else {
  if (inp && inp.selectedIndex==1) inp.selectedIndex = 0
+
expandCaption = 'показать';
  inp = document.getElementById('mwProtect-level-delete')
+
collapseCaption = 'скрыть';
  if (inp && inp.selectedIndex==1) inp.selectedIndex = 0
+
zeroSectionTip = 'Править преамбулу';
}
 
 
}
 
}
  
addOnloadHook(sysopProtectPage);
+
// Collapsiblе: [[:ru:ВП:СБ]]
  
function newSectionLink(){
+
var NavigationBarShowDefault;
var plus = document.getElementById('ca-addsection')
+
if ( typeof NavigationBarShowDefault === 'undefined' ) {
if (!plus) return
+
NavigationBarShowDefault = 1;
var custom = document.getElementById('add-custom-section')
 
if (!custom) return
 
plus.firstChild.setAttribute('href', custom.getElementsByTagName('a')[0].href)
 
 
}
 
}
  
// подключение загрузчика карт "Google maps"
+
// table.collapsible
var gm2wiki_language = "RU"; // RU/EN value correct only
+
// collapsibleTablesItrIdx - временное решение, чтобы не дублировались id,
document.write('<script type="text/javascript" src="http://ru.gm2.wikia.com/index.php?title=MediaWiki:GmapsLoader.js&action=raw&ctype=text/javascript&dontcountme=s"></script>');
+
// если во время срабатывания хука 'wikipage.content' добавляются новые сворачиваемые блоки
 +
var collapsibleTablesItrIdx = 0;
 +
 +
function collapsibleTables( $content ) {
 +
var $btn,
 +
$a,
 +
tblIdx = collapsibleTablesItrIdx,
 +
navboxCount = 0,
 +
notNavboxCount = 0,
 +
colTables = [],
 +
$Tables = $content.find( 'table' );
  
//See http://ru.wikipedia.org/wiki/project:code
+
$Tables.each( function ( i, table ) {
+
if ( $( table ).hasClass( 'collapsible' ) ) {
importScript_ = importScript
+
var $table = $( this ),
importScript = function (page, proj){
+
$row = $table.find( 'tr' ).first(),
if (!proj) importScript_(page)
+
$cell = $row.find( 'th' ).first();
else {
+
if ( !$cell.length ) {
  if (proj.indexOf('.')==-1) proj += '.wikipedia.org'
+
return;
  importScriptURI('http://'+proj+'/w/index.php?action=raw&ctype=text/javascript&title='+encodeURIComponent(page.replace(/ /g,'_')))
+
}
}
+
$table.attr( 'id', 'collapsibleTable' + tblIdx );
 +
$btn = $( '<span>' ).addClass( 'collapseButton' );
 +
$a = $( '<a>' )
 +
.attr( 'id', 'collapseButton' + tblIdx )
 +
.attr( 'href', 'javascript:collapseTable(' + tblIdx + ');' )
 +
// Изменяем цвет ссылки, только если цвет текста в навбоксе нестандартный
 +
.css( 'color', $cell.css( 'color' ) === $( '.mw-body' ).css( 'color' ) ? 'auto' :
 +
$cell.css( 'color' ) )
 +
.text( collapseCaption );
 +
$btn
 +
.append( '[' )
 +
.append( $a )
 +
.append( ']' );
 +
if ( $cell.contents().length ) {
 +
$btn.insertBefore( $cell.contents().first() );
 +
} else {
 +
$btn.appendTo( $cell );
 +
}
 +
// hasClass( 'navbox' ) — временное решение для навшаблонов, ещё не переведённых
 +
// на {{Навигационная таблица}} (также ниже)
 +
if ( $table.hasClass( 'navbox-inner' ) || $table.hasClass( 'navbox' ) ) {
 +
navboxCount++;
 +
} else {
 +
notNavboxCount++;
 +
}
 +
colTables[tblIdx++] = $table;
 +
}
 +
} );
 +
for ( var i = collapsibleTablesItrIdx; i < tblIdx; i++ ) {
 +
if ( colTables[i].hasClass( 'collapsed' ) ||
 +
( colTables[i].hasClass( 'autocollapse' ) &&
 +
( ( ( colTables[i].hasClass( 'navbox-inner' ) || colTables[i].hasClass( 'navbox' ) ) &&
 +
navboxCount > NavigationBarShowDefault ) ||
 +
( !( colTables[i].hasClass( 'navbox-inner' ) || colTables[i].hasClass( 'navbox' ) ) &&
 +
notNavboxCount > NavigationBarShowDefault ) ) ) )
 +
{
 +
collapseTable( i );
 +
}
 +
}
 +
collapsibleTablesItrIdx = tblIdx;
 +
// Нужно переписать код на "mw-collapsible", и заменить использование хука на "wikipage.collapsibleContent"
 +
mw.hook( 'common.collapsibleContent' ).fire( colTables );
 
}
 
}
  
//Collapsiblе: [[ВП:СБ]]
+
mw.hook( 'wikipage.content' ).add( collapsibleTables );
  
var hasClass = (function (){
+
function collapseTable( idx ) {
var reCache = {}
+
var $table = $( '#collapsibleTable' + idx ),
return function (element, className){
+
$rows = $table.children().children( 'tr' ),
  return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className)
+
$btn = $( '#collapseButton' + idx );
  }
+
if ( !$table.length || !$rows.length || !$btn.length ) {
})()
+
return false;
 +
}
  
function collapsibleTables(){
+
var isExpanded = ( $btn.text() === collapseCaption ),
var Table, HRow,  HCell, btn, a, tblIdx = 0, colTables = []
+
cssDisplay = isExpanded ? 'none' : $rows.first().css( 'display' );
var allTables = document.getElementsByTagName('table')
+
 
for (var i=0; Table = allTables[i]; i++){
+
$btn.text( isExpanded ? expandCaption : collapseCaption );
  if (!hasClass(Table, 'collapsible')) continue
+
$rows.slice( 1 ).each( function () {
  if (!(HRow=Table.rows[0])) continue
+
$( this ).css( 'display', cssDisplay );
  if (!(HCell=HRow.getElementsByTagName('th')[0])) continue
+
} );
  Table.id = 'collapsibleTable' + tblIdx
 
  btn = document.createElement('span')
 
  btn.style.cssText = 'float:right; font-weight:normal; font-size:smaller'
 
  a = document.createElement('a')
 
  a.id = 'collapseButton' + tblIdx
 
  a.href = 'javascript:collapseTable(' + tblIdx + ');'
 
  a.style.color = HCell.style.color
 
  a.appendChild(document.createTextNode(NavigationBarHide))
 
  btn.appendChild(a)
 
  HCell.insertBefore(btn, HCell.childNodes[0])
 
  colTables[tblIdx++] = Table
 
}
 
for (var i=0; i < tblIdx; i++)
 
  if ((tblIdx > NavigationBarShowDefault && hasClass(colTables[i], 'autocollapse')) || hasClass(colTables[i], 'collapsed'))
 
    collapseTable(i)
 
 
}
 
}
  
function collapseTable (idx){
+
// div.NavFrame
var Table = document.getElementById('collapsibleTable' + idx)
+
var navFrameExpandCaption = '[' + expandCaption + ']',
var btn = document.getElementById('collapseButton' + idx)
+
navFrameCollapseCaption = '[' + collapseCaption + ']';
if (!Table || !btn) return false
 
var Rows = Table.rows
 
var isShown = (btn.firstChild.data == NavigationBarHide)
 
btn.firstChild.data = isShown ?  NavigationBarShow : NavigationBarHide
 
var disp = isShown ? 'none' : Rows[0].style.display
 
for (var i=1; i < Rows.length; i++)
 
    Rows[i].style.display = disp
 
}
 
  
function collapsibleDivs(){
+
// Изолируем код из глобальной области видимости
var navIdx = 0, colNavs = [], i, NavFrame
+
( function () {
var divs = document.getElementById('content').getElementsByTagName('div')
+
function collapsibleDivs( $content ) {
for (i=0; NavFrame = divs[i]; i++) {
+
var navFrameIndex = 0,
  if (!hasClass(NavFrame, 'NavFrame')) continue
+
navFrames = [],
  NavFrame.id = 'NavFrame' + navIdx
+
i;
  var a = document.createElement('a')
 
  a.className = 'NavToggle'
 
  a.id = 'NavToggle' + navIdx
 
  a.href = 'javascript:collapseDiv(' + navIdx + ');'
 
  a.appendChild(document.createTextNode(NavigationBarHide))
 
  for (var j=0; j < NavFrame.childNodes.length; j++)
 
    if (hasClass(NavFrame.childNodes[j], 'NavHead'))
 
      NavFrame.childNodes[j].appendChild(a)
 
  colNavs[navIdx++] = NavFrame
 
}
 
for (i=0; i < navIdx; i++)
 
  if ((navIdx > NavigationBarShowDefault && !hasClass(colNavs[i], 'expanded')) || hasClass(colNavs[i], 'collapsed'))
 
    collapseDiv(i)
 
}
 
  
function collapseDiv(idx) {
+
$content.find( 'div' ).each( function () {
var div = document.getElementById('NavFrame' + idx)
+
var $div = $( this );
var btn = document.getElementById('NavToggle' + idx)
+
if ( $div.hasClass( 'NavFrame' ) ) {
if (!div || !btn) return false
+
var $btn = $( '<a>' )
var isShown = (btn.firstChild.data == NavigationBarHide)
+
.addClass( 'NavToggle' )
btn.firstChild.data = isShown ? NavigationBarShow : NavigationBarHide
+
.attr( 'href', 'javascript:' )
var disp = isShown ? 'none' : 'block'
+
.text( navFrameCollapseCaption )
for (var child = div.firstChild; child != null; child = child.nextSibling)
+
.click( navToggleClickHandler );
  if (hasClass(child, 'NavPic') || hasClass(child, 'NavContent'))
+
$div.children( '.NavHead' ).append( $btn );
      child.style.display = disp
+
navFrames[ navFrameIndex++ ] = $div;
}
+
}
 +
} );
 +
for ( i = 0; i < navFrameIndex; i++ ) {
 +
if ( navFrames[ i ].hasClass( 'collapsed' ) ||
 +
( navFrameIndex > NavigationBarShowDefault &&
 +
!navFrames[ i ].hasClass( 'expanded' )
 +
)
 +
) {
 +
toggleDiv( navFrames[ i ] );
 +
}
 +
}
 +
}
  
 +
mw.hook( 'wikipage.content' ).add( collapsibleDivs );
  
 +
function navToggleClickHandler() {
 +
var $btn = $( this );
 +
toggleDiv( $btn.closest( '.NavFrame' ), $btn );
 +
}
  
//Execution
+
function toggleDiv( $div, $btn ) {
mw.loader.using( 'mediawiki.util', function() {
+
$btn = $btn || $div.find( '.NavToggle' ).first();
 +
if ( !$div.length || !$btn.length ) return false;
 +
var isExpanded = ( $btn.text() === navFrameCollapseCaption );
 +
$btn.text( isExpanded ? navFrameExpandCaption : navFrameCollapseCaption );
 +
$div.children( '.NavContent, .NavPic' ).each( function () {
 +
$( this ).css( 'display', isExpanded ? 'none' : 'block' );
 +
} );
 +
}
  
 +
/**
 +
* Загрузка скриптов через систему подгаджетов
 +
*/
 +
var namespaceNumber = mw.config.get( 'wgNamespaceNumber' );
  
if (wgCanonicalNamespace == 'Special'){
+
// Скрипты для служебных страниц
 +
if ( namespaceNumber === -1 ) {
 +
var specialGadgets = [
 +
'Abusefilter',
 +
'Block',
 +
'Log',
 +
'Movepage',
 +
'Newpages',
 +
'Search',
 +
'Upload'
 +
];
 +
var canonicalSpecialPageName = mw.config.get( 'wgCanonicalSpecialPageName' );
 +
if ( specialGadgets.indexOf( canonicalSpecialPageName ) > -1 ) {
 +
mw.loader.load( 'ext.gadget.common-special-' + canonicalSpecialPageName.toLowerCase() );
 +
}
 +
} else {
 +
// Скрипты для действий
 +
var action = mw.config.get( 'wgAction' );
 +
var actionGadgets = {
 +
'edit': [ 'ext.gadget.common-action-edit', 'ext.gadget.wikificator', 'ext.gadget.summaryButtons' ]
 +
};
 +
actionGadgets[ 'submit' ] = actionGadgets[ 'edit' ];
  
if (/^(Uplo|Sear|Stat|Spec|Abus|Prefe|Move|Watch|Newp)/i.test(wgCanonicalSpecialPageName))
+
if ( actionGadgets[ action ] ) {
  importMW(wgCanonicalSpecialPageName)
+
mw.loader.load( actionGadgets[ action ] );
 +
}
  
}else switch (wgAction){
+
// Скрипты для пространств
 +
var namespaceGadgets = {
 +
6: [ 'ext.gadget.common-namespace-file' ]
 +
};
  
case 'history': importMW('History'); break
+
if ( namespaceGadgets[ namespaceNumber ] ) {
 +
mw.loader.load( namespaceGadgets[ namespaceNumber ] );
 +
}
 +
}
 +
}() );
  
  case 'delete': importMW('Deletepage'); break
+
/**
 +
  * Старые коды
 +
*/
 +
if ( navigator.platform.indexOf( 'Win' ) !== -1 ) {
 +
mw.loader.using( 'mediawiki.util' ).done( function () {
 +
mw.util.addCSS( '.IPA, .Unicode { font-family: "Arial Unicode MS", "Lucida Sans Unicode"; }' );
 +
} );
 +
}
  
  case 'edit': case 'submit': importMW('Editpage') //and continue with the default: view, purge
+
// Закрываем меню при клике за его пределами
 +
mw.hook( 'wikipage.content' ).add( function () {
 +
var $items = $( '.main-footer-menuToggle' ),
 +
$target;
 +
 +
document.body.addEventListener( 'click', function ( event ) {
 +
    $target = $( event.target ).parents( '.main-footer-menuToggle' )[0];
 +
    $items.each( function () {
 +
        if( this !== $target && !$( this ).hasClass( 'mw-collapsible-toggle-collapsed' ) ) {
 +
            $( this ).click();
 +
        }
 +
    } );
 +
}, true );
 +
} );
 +
}
  
  default:
+
/**
 +
  * Выполнение скриптов из пространства MediaWiki, указанных в URL
 +
* См. также https://www.mediawiki.org/wiki/Snippets/Load_JS_and_CSS_by_URL
 +
*/
 +
var withJS = location.href.match( /[&?]withjs=((mediawiki:)?([^&#]+))/i );
 +
if ( withJS ) {
 +
//importScript_( 'MediaWiki:' + withJS[3] );
 +
importScript( 'MediaWiki:' + withJS[3] );
 +
}
  
  $(editZeroSection)
+
/**
  addOnloadHook(collapsibleDivs)
+
* Код, который нужно выполнить как можно раньше. Он выполняется, если загружен подвал страницы,
  addOnloadHook(collapsibleTables)
+
* иначе же ждёт наступления события wikipage.content (см. выше определение runAsEarlyAsPossible
  mw.loader.load('//meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js&action=raw&ctype=text/javascript&smaxage=21600&maxage=86400')
+
* и ниже про wikipage.content).
  if( document.location && document.location.protocol == 'https:' )
+
*/
    importMW('Secure')
+
runAsEarlyAsPossible( function () {
  if (navigator.platform.indexOf('Win') != -1)
+
/**
    mw.util.addCSS('.IPA, .Unicode { font-family: "Arial Unicode MS", "Lucida Sans Unicode"; }')
+
* {{выполнить скрипт}}
 +
*/
 +
$( '.executeJS' ).each( function () {
 +
var names = $( this ).data( 'scriptnames' );
 +
if (names) {
 +
names.split( ' ' ).forEach( function ( name ) {
 +
name = name.replace( /[^\w_-]/g, '' );
 +
if ( name ) {
 +
importScript( 'MediaWiki:Script/' + name + '.js' );
 +
}
 +
} );
 +
}
 +
} );
  
 +
/**
 +
* Чтобы ссылки на очистку кэша не требовали подтверждения (они должны быть помещены в тег с классом
 +
* purgelink и именем страницы в атрибуте data-pagename, например как в шаблоне {{очистить кэш}})
 +
*/
 +
$( '.purgelink a' ).click( function ( e ) {
 +
mw.loader.using( [ 'mediawiki.api', 'mediawiki.util' ] ).done( function () {
 +
var pageName = $( this ).parent( '.purgelink' ).data( 'pagename' ) || mw.config.get( 'wgPageName' );
 +
new mw.Api().post( {
 +
action: 'purge',
 +
titles: pageName
 +
} ).then( function () {
 +
var url = mw.util.getUrl( pageName );
 +
if ( e.ctrlKey ) {
 +
if ( !window.open( url ) ) {
 +
location.assign( url );
 +
}
 +
} else {
 +
location.assign( url );
 +
}
 +
}, function () {
 +
mw.notify( 'Не удалось очистить кэш.', { type: 'error' } );
 +
} );
 +
e.preventDefault();
 +
} );
 +
} );
 +
}, $( '#footer' ), mw.hook( 'wikipage.content' ).add );
  
 
+
// Не включаем сюда проверку на наличие #ca-view.selected, чтобы не вычёркивать случай,
  switch( wgNamespaceNumber ){
+
// когда визред открыт без Ajax и по выходу из него нужно заменить URL’ы в ссылках.
    case 0: case 100:
+
if ( $( '#ca-current' ).length && !/[?&](oldid|diff)=\d+/.test( location.search ) ) {
      $(LinkFA)
+
fixEditLinksForStableRevs( true );
      importMW('Osm')
+
      if( wgArticleId==4401 ) importMW('Mainpage')
+
mw.hook( 've.deactivationComplete' ).add( function () {
      break
+
fixEditLinksForStableRevs( false );
    case 6:
+
} );
      importMW('Filepage')
+
}
      break
+
} );
  }  
+
 +
/**
 +
* Поддержка Викификатора в новом режиме вики-текста aka 2017 wikitext editor
 +
*/
 +
mw.libs.ve.addPlugin( function () {
 +
return mw.loader.using( 'ext.gadget.wikificator' );
 +
} );
 +
} );
  
 +
/**
 +
* {{TOC hidden}}
 +
*/
 +
function TOChidden() {
 +
$( '.tochidden-wrapper > #toc > #toctogglecheckbox' ).prop('checked', true );
 +
$( '.tochidden-wrapper' ).attr( "class", "toc-wrapper" );
 
}
 
}
  
 +
runAsEarlyAsPossible( function () {
 +
if ( $( '.tochidden-wrapper' ).length ) {
 +
mw.loader.using( [ 'mediawiki.cookie' ] ).done( function () {
 +
if ( mw.cookie.get( 'hidetoc' ) === null ) {
 +
$.when( mw.loader.using( [ 'mediawiki.toc' ] ), $.ready ).then( TOChidden );
 +
}
 +
} );
 +
}
 +
}, $( '#toc' ), mw.hook( 'wikipage.content' ).add );
  
if( wgUserName ){
+
/**
  if( wgNamespaceNumber==2 && wgTitle.indexOf(wgUserName)==0 && wgArticleId==0 && /\/skin\.(js|css)$/.test(wgTitle) )
+
* Код, выполняемый по событию wikipage.content (его обработчики выполняются раньше колбэков для $,
    window.location.href = window.location.href.replace(/skin\.(css|js)$/, skin+'.$1')
+
* хотя в глубине это одно и то же событие, просто колбэк, инициирующий wikipage.content, становится
}else{ //hide FlaggedRevs
+
* в очередь раньше). Так как wikipage.content инициируется после обновления страницы в результате
  mw.util.addCSS('#mw-fr-revisiontag {display:none}')
+
* Ajax-запросов (например, гаджетом быстрого предпросмотра), не добавляйте сюда коды, которые
}
+
* должны гарантированно выполниться не более одного раза на странице.
 +
*/
 +
mw.hook( 'wikipage.content' ).add( function () {
 +
/**
 +
* Отключение обтекания раздела примечаний, если в нём есть колонки.
 +
* Короткие (до 15 ссылок, если общее число символов не менее 3000) списки примечаний обтекаются
 +
* только справа.
 +
*/
 +
$( '.reflist.columns' ).each( function () {
 +
var clear = 'both',
 +
$refs = $( this ).find( 'ol.references > li' );
 +
if ( $refs.length <= 10 ) return;
 +
if ( $refs.length <= 15 && $refs.text().length < 3000 ) {
 +
clear = 'left';
 +
}
 +
$( this )
 +
.prevUntil( 'h1, h2, h3, h4, h5, h6' )
 +
.addBack()
 +
.first()
 +
.prev()
 +
.css( 'clear', clear );
 +
} );
  
 +
/**
 +
* Imagemap Highlight
 +
*/
 +
// На странице есть как минимум один элемент .imageMapHighlighter, а браузер поддерживает <canvas>
 +
if ( $( '.imageMapHighlighter' ).length && $( '<canvas>' )[ 0 ].getContext ) {
 +
importScript( 'MediaWiki:Imagemap-Highlight.js' );
 +
}
  
// ВП:СО, кроме статей  В Контакте, Одноклассники и Facebook
+
/**
if (wgArticleId!=639373 && wgArticleId!=932117 && wgArticleId!=1297302 && wgArticleId!=25133866)
+
* imgToggle
importMW('Wikibugs')
+
*/
 +
// На странице есть как минимум один элемент div.img_toggle
 +
if ( $( 'div.img_toggle' ).length ) {
 +
mw.loader.load( 'ext.gadget.imgToggle' );
 +
}
  
 +
/**
 +
* Авторазбиение списков на колонки. Будет работать только для однострочных списков. 35em
 +
* (из Mediawiki:Common.css) является предварительным числом, а фактическое будет посчитано исходя
 +
* из ширины элементов. Должно использоваться только для UL внутри DIV. Пример использования —
 +
* шаблон {{Wikidata/SisterCities}}.
 +
*/
 +
$("div.autocolumns").each(function(d, div) {
 +
var parentWidth = $(div).parent()[0].offsetWidth;
 +
if (!parentWidth) return;
  
// iwiki sorting
+
var maxWidth = 0;
if (!wgUserName
+
var elements = 0;
    || (wgUserName
+
$(div).find("ul>li").each(function(l, li) {
        && (((typeof wgLangPrefs == 'undefined') ? false : true)
+
elements++;
            || ((typeof wgAddLangHints == 'undefined') ? false : wgAddLangHints)
+
var jLi = $(li);
            || ((typeof wgUseUserLanguage == 'undefined') ? false : wgUseUserLanguage))))
+
if (jLi.children().length != jLi.contents().length)
    importMW('Interwiki-links');
+
jLi.wrapInner(document.createElement("span"));
  
 +
var liWidth = 0;
 +
jLi.children().each(function(c, child) {
 +
liWidth += child.offsetWidth;
 +
});
 +
if (liWidth > maxWidth)
 +
maxWidth = liWidth;
 +
});
 +
if ( maxWidth === 0 ) return;
 +
// UL/LI bullet width + padding
 +
maxWidth += 22.5 * 2;
  
})    
+
var maxColumns = "" + Math.ceil( elements / 5 );
   
+
$(div).css({"-moz-columns": maxWidth + "px " + maxColumns, "columns" : maxWidth + "px " + maxColumns});
   
+
});
//extra scripts
+
});
  
var withJS = document.URL.match(/[&?]withjs=((mediawiki:)?([^&#]+))/i)
+
/**
if( withJS ) importScript_('MediaWiki:'+withJS[3])
+
* Кнопки описания правок для визуального редактора
 +
*/
 +
mw.hook( 've.activationComplete' ).add( function () {
 +
mw.loader.load( 'ext.gadget.summaryButtons' );
 +
} );
  
var execJS = document.getElementById('executeJS')
+
// A high frequency of errors come from old scripts referencing addPortletLink.
if( execJS )
+
// Can be removed when https://global-search.toolforge.org/?q=%5B%5E%5C.%5DaddPortletLink%5C%28&regex=1&namespaces=&title=.*%5C.js has no nl.wikipedia results.
$.each( execJS.className.split(' '), function(i, sc){
+
window.addPortletLink = function () {
    sc = $.trim( sc.replace(/[^\w ]/g,'') )
+
// @todo: Please Translate
    if( sc ) importMW('Script/' + sc)
+
mw.notify('One of your user scripts is broken. Please inspect your error console and remove.');
  })
+
mw.log.warn('addPortletLink is deprecated. Please use mw.util.addPortletLink')
 +
};

Текущая версия на 21:18, 2 декабря 2022

/*if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) {
        mw.loader.load( '/mediawiki/index.php?title=MediaWiki:Gadget-wikificator.js&action=raw&ctype=text/javascript' );
}

var customizeToolbar = function() {

$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
        'section': 'advanced',
        'group': 'format',
        'tools': {
                'wikify': {
                        label: 'Викификатор',
                        type: 'button',
                        icon: '//upload.wikimedia.org/wikipedia/commons/0/06/Wikify-toolbutton.png',
                             action: {
                                  type: 'callback',
                                       execute: function(context){
                                              Wikify();
                                       } 
                             }
                }
        }
} );
};
 
if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) {
        mw.loader.using( 'user.options', function () {
                if ( mw.user.options.get('usebetatoolbar') ) {
                        mw.loader.using( 'ext.wikiEditor.toolbar', function () {
                                $(document).ready( customizeToolbar );
                        } );
                }
        } );
}
*/
/*
var importScript_ = importScript;
importScript = function ( page, proj ) {
	if ( !proj ) {
		importScript_( page );
	} else {
		if ( proj.indexOf( '.' ) === -1 ) {
			proj += 'celeste-rus.ru';
		}
		mw.loader.using( 'mediawiki.util' ).done( function () {
			mw.loader.load( 'https://' + proj + '/mediawiki/index.php?title=' + mw.util.wikiUrlencode( page ) +
				'&action=raw&ctype=text/javascript' );
		} );
	}
};
*/
importScript = function ( page, proj ) {
	mw.loader.using( 'mediawiki.util' ).done( function () {
		mw.loader.load( 'https://celeste-rus.ru/index.php?title=' + mw.util.wikiUrlencode( page ) +
			'&action=raw&ctype=text/javascript' );
	} );
};

function runAsEarlyAsPossible( callback, $testElement, func ) {
	func = func || $;
	$testElement = $testElement || $( '#footer' );

	if ( $testElement.length ) {
		callback();
	} else {
		func( callback );
	}
}

/**
 * Настройка обработки «е» и «ё» при сортировке в таблицах
 */
mw.config.set( 'tableSorterCollation', { 'Ё': 'Е', 'ё': 'е' } );

// Messages
var expandCaption, collapseCaption, zeroSectionTip;
if ( mw.config.get( 'wgUserLanguage' ) === 'en' ) {
	expandCaption = 'show';
	collapseCaption = 'hide';
	zeroSectionTip = 'Edit lead section';
} else {
	expandCaption = 'показать';
	collapseCaption = 'скрыть';
	zeroSectionTip = 'Править преамбулу';
}

// Collapsiblе: [[:ru:ВП:СБ]]

var NavigationBarShowDefault;
if ( typeof NavigationBarShowDefault === 'undefined' ) {
	NavigationBarShowDefault = 1;
}

// table.collapsible
// collapsibleTablesItrIdx - временное решение, чтобы не дублировались id,
// если во время срабатывания хука 'wikipage.content' добавляются новые сворачиваемые блоки
var collapsibleTablesItrIdx = 0;
	
function collapsibleTables( $content ) {
	var $btn,
		$a,
		tblIdx = collapsibleTablesItrIdx,
		navboxCount = 0,
		notNavboxCount = 0,
		colTables = [],
		$Tables = $content.find( 'table' );

	$Tables.each( function ( i, table ) {
		if ( $( table ).hasClass( 'collapsible' ) ) {
			var $table = $( this ),
				$row = $table.find( 'tr' ).first(),
				$cell = $row.find( 'th' ).first();
			if ( !$cell.length ) {
				return;
			}
			$table.attr( 'id', 'collapsibleTable' + tblIdx );
			$btn = $( '<span>' ).addClass( 'collapseButton' );
			$a = $( '<a>' )
				.attr( 'id', 'collapseButton' + tblIdx )
				.attr( 'href', 'javascript:collapseTable(' + tblIdx + ');' )
				// Изменяем цвет ссылки, только если цвет текста в навбоксе нестандартный
				.css( 'color', $cell.css( 'color' ) === $( '.mw-body' ).css( 'color' ) ? 'auto' :
					$cell.css( 'color' ) )
				.text( collapseCaption );
			$btn
				.append( '[' )
				.append( $a )
				.append( ']' );
			if ( $cell.contents().length ) {
				$btn.insertBefore( $cell.contents().first() );
			} else {
				$btn.appendTo( $cell );
			}
			// hasClass( 'navbox' ) — временное решение для навшаблонов, ещё не переведённых
			// на {{Навигационная таблица}} (также ниже)
			if ( $table.hasClass( 'navbox-inner' ) || $table.hasClass( 'navbox' ) ) {
				navboxCount++;
			} else {
				notNavboxCount++;
			}
			colTables[tblIdx++] = $table;
		}
	} );
	for ( var i = collapsibleTablesItrIdx; i < tblIdx; i++ ) {
		if ( colTables[i].hasClass( 'collapsed' ) ||
			( colTables[i].hasClass( 'autocollapse' ) &&
				( ( ( colTables[i].hasClass( 'navbox-inner' ) || colTables[i].hasClass( 'navbox' ) ) &&
						navboxCount > NavigationBarShowDefault ) ||
					( !( colTables[i].hasClass( 'navbox-inner' ) || colTables[i].hasClass( 'navbox' ) ) &&
						notNavboxCount > NavigationBarShowDefault ) ) ) )
		{
			collapseTable( i );
		}
	}
	collapsibleTablesItrIdx = tblIdx;
	// Нужно переписать код на "mw-collapsible", и заменить использование хука на "wikipage.collapsibleContent"
	mw.hook( 'common.collapsibleContent' ).fire( colTables );
}

mw.hook( 'wikipage.content' ).add( collapsibleTables );

function collapseTable( idx ) {
	var $table = $( '#collapsibleTable' + idx ),
		$rows = $table.children().children( 'tr' ),
		$btn = $( '#collapseButton' + idx );
	if ( !$table.length || !$rows.length || !$btn.length ) {
		return false;
	}

	var isExpanded = ( $btn.text() === collapseCaption ),
		cssDisplay = isExpanded ? 'none' : $rows.first().css( 'display' );

	$btn.text( isExpanded ? expandCaption : collapseCaption );
	$rows.slice( 1 ).each( function () {
		$( this ).css( 'display', cssDisplay );
	} );
}

// div.NavFrame
var navFrameExpandCaption = '[' + expandCaption + ']',
	navFrameCollapseCaption = '[' + collapseCaption + ']';

// Изолируем код из глобальной области видимости
( function () {
	function collapsibleDivs( $content ) {
		var navFrameIndex = 0,
			navFrames = [],
			i;

		$content.find( 'div' ).each( function () {
			var $div = $( this );
			if ( $div.hasClass( 'NavFrame' ) ) {
				var $btn = $( '<a>' )
					.addClass( 'NavToggle' )
					.attr( 'href', 'javascript:' )
					.text( navFrameCollapseCaption )
					.click( navToggleClickHandler );
				$div.children( '.NavHead' ).append( $btn );
				navFrames[ navFrameIndex++ ] = $div;
			}
		} );
		for ( i = 0; i < navFrameIndex; i++ ) {
			if ( navFrames[ i ].hasClass( 'collapsed' ) ||
				( navFrameIndex > NavigationBarShowDefault &&
					!navFrames[ i ].hasClass( 'expanded' )
				)
			) {
				toggleDiv( navFrames[ i ] );
			}
		}
	}

	mw.hook( 'wikipage.content' ).add( collapsibleDivs );

	function navToggleClickHandler() {
		var $btn = $( this );
		toggleDiv( $btn.closest( '.NavFrame' ), $btn );
	}

	function toggleDiv( $div, $btn ) {
		$btn = $btn || $div.find( '.NavToggle' ).first();
		if ( !$div.length || !$btn.length ) return false;
		var isExpanded = ( $btn.text() === navFrameCollapseCaption );
		$btn.text( isExpanded ? navFrameExpandCaption : navFrameCollapseCaption );
		$div.children( '.NavContent, .NavPic' ).each( function () {
			$( this ).css( 'display', isExpanded ? 'none' : 'block' );
		} );
	}

	/**
	 * Загрузка скриптов через систему подгаджетов
	 */
	var namespaceNumber = mw.config.get( 'wgNamespaceNumber' );

	// Скрипты для служебных страниц
	if ( namespaceNumber === -1 ) {
		var specialGadgets = [
			'Abusefilter',
			'Block',
			'Log',
			'Movepage',
			'Newpages',
			'Search',
			'Upload'
		];
		var canonicalSpecialPageName = mw.config.get( 'wgCanonicalSpecialPageName' );
		if ( specialGadgets.indexOf( canonicalSpecialPageName ) > -1 ) {
			mw.loader.load( 'ext.gadget.common-special-' + canonicalSpecialPageName.toLowerCase() );
		}
	} else {
		// Скрипты для действий
		var action = mw.config.get( 'wgAction' );
		var actionGadgets = {
			'edit': [ 'ext.gadget.common-action-edit', 'ext.gadget.wikificator', 'ext.gadget.summaryButtons' ]
		};
		actionGadgets[ 'submit' ] = actionGadgets[ 'edit' ];

		if ( actionGadgets[ action ] ) {
			mw.loader.load( actionGadgets[ action ] );
		}

		// Скрипты для пространств
		var namespaceGadgets = {
			6: [ 'ext.gadget.common-namespace-file' ]
		};

		if ( namespaceGadgets[ namespaceNumber ] ) {
			mw.loader.load( namespaceGadgets[ namespaceNumber ] );
		}
	}
}() );

/**
 * Старые коды
 */
if ( navigator.platform.indexOf( 'Win' ) !== -1 ) {
	mw.loader.using( 'mediawiki.util' ).done( function () {
		mw.util.addCSS( '.IPA, .Unicode { font-family: "Arial Unicode MS", "Lucida Sans Unicode"; }' );
	} );
}

	// Закрываем меню при клике за его пределами
	mw.hook( 'wikipage.content' ).add( function () {
		var $items =  $( '.main-footer-menuToggle' ),
			$target;
			
		document.body.addEventListener( 'click', function ( event ) {
		    $target = $( event.target ).parents( '.main-footer-menuToggle' )[0];
		    $items.each( function () {
		        if( this !== $target && !$( this ).hasClass( 'mw-collapsible-toggle-collapsed' ) ) {
		            $( this ).click();
		        }
		    } );
		}, true );
	} );
}

/**
 * Выполнение скриптов из пространства MediaWiki, указанных в URL
 * См. также https://www.mediawiki.org/wiki/Snippets/Load_JS_and_CSS_by_URL
 */
var withJS = location.href.match( /[&?]withjs=((mediawiki:)?([^&#]+))/i );
if ( withJS ) {
	//importScript_( 'MediaWiki:' + withJS[3] );
	importScript( 'MediaWiki:' + withJS[3] );
}

/**
 * Код, который нужно выполнить как можно раньше. Он выполняется, если загружен подвал страницы,
 * иначе же ждёт наступления события wikipage.content (см. выше определение runAsEarlyAsPossible
 * и ниже про wikipage.content).
 */
runAsEarlyAsPossible( function () {
	/**
	 * {{выполнить скрипт}}
	 */
	$( '.executeJS' ).each( function () {
		var names = $( this ).data( 'scriptnames' );
		if (names) {
			names.split( ' ' ).forEach( function ( name ) {
				name = name.replace( /[^\w_-]/g, '' );
				if ( name ) {
					importScript( 'MediaWiki:Script/' + name + '.js' );
				}
			} );
		}
	} );

	/**
	 * Чтобы ссылки на очистку кэша не требовали подтверждения (они должны быть помещены в тег с классом
	 * purgelink и именем страницы в атрибуте data-pagename, например как в шаблоне {{очистить кэш}})
	 */
	$( '.purgelink a' ).click( function ( e ) {
		mw.loader.using( [ 'mediawiki.api', 'mediawiki.util' ] ).done( function () {
			var pageName = $( this ).parent( '.purgelink' ).data( 'pagename' ) || mw.config.get( 'wgPageName' );
			new mw.Api().post( {
				action: 'purge',
				titles: pageName
			} ).then( function () {
				var url = mw.util.getUrl( pageName );
				if ( e.ctrlKey ) {
					if ( !window.open( url ) ) {
						location.assign( url );
					}
				} else {
					location.assign( url );
				}
			}, function () {
				mw.notify( 'Не удалось очистить кэш.', { type: 'error' } );
			} );
			e.preventDefault();
		} );
	} );
}, $( '#footer' ), mw.hook( 'wikipage.content' ).add );

		// Не включаем сюда проверку на наличие #ca-view.selected, чтобы не вычёркивать случай,
		// когда визред открыт без Ajax и по выходу из него нужно заменить URL’ы в ссылках.
		if ( $( '#ca-current' ).length && !/[?&](oldid|diff)=\d+/.test( location.search ) ) {
			fixEditLinksForStableRevs( true );
		
			mw.hook( 've.deactivationComplete' ).add( function () {
				fixEditLinksForStableRevs( false );
			} );
		}
	} );
	
	/**
	 * Поддержка Викификатора в новом режиме вики-текста aka 2017 wikitext editor
	 */
	mw.libs.ve.addPlugin( function () {
		return mw.loader.using( 'ext.gadget.wikificator' );
	} );
} );

/**
 * {{TOC hidden}}
 */
function TOChidden() {
	$( '.tochidden-wrapper > #toc > #toctogglecheckbox' ).prop('checked', true );
	$( '.tochidden-wrapper' ).attr( "class", "toc-wrapper" );
}

runAsEarlyAsPossible( function () {
	if ( $( '.tochidden-wrapper' ).length ) {
		mw.loader.using( [ 'mediawiki.cookie' ] ).done( function () {
			if ( mw.cookie.get( 'hidetoc' ) === null ) {
				$.when( mw.loader.using( [ 'mediawiki.toc' ] ), $.ready ).then( TOChidden );
			}
		} );
	}
}, $( '#toc' ), mw.hook( 'wikipage.content' ).add );

/**
 * Код, выполняемый по событию wikipage.content (его обработчики выполняются раньше колбэков для $,
 * хотя в глубине это одно и то же событие, просто колбэк, инициирующий wikipage.content, становится
 * в очередь раньше). Так как wikipage.content инициируется после обновления страницы в результате
 * Ajax-запросов (например, гаджетом быстрого предпросмотра), не добавляйте сюда коды, которые
 * должны гарантированно выполниться не более одного раза на странице.
 */
mw.hook( 'wikipage.content' ).add( function () {
	/**
	 * Отключение обтекания раздела примечаний, если в нём есть колонки.
	 * Короткие (до 15 ссылок, если общее число символов не менее 3000) списки примечаний обтекаются
	 * только справа.
	 */
	$( '.reflist.columns' ).each( function () {
		var clear = 'both',
			$refs = $( this ).find( 'ol.references > li' );
		if ( $refs.length <= 10 ) return;
		if ( $refs.length <= 15 && $refs.text().length < 3000 ) {
			clear = 'left';
		}
		$( this )
			.prevUntil( 'h1, h2, h3, h4, h5, h6' )
			.addBack()
			.first()
			.prev()
			.css( 'clear', clear );
	} );

	/**
	 * Imagemap Highlight
	 */
	// На странице есть как минимум один элемент .imageMapHighlighter, а браузер поддерживает <canvas>
	if ( $( '.imageMapHighlighter' ).length && $( '<canvas>' )[ 0 ].getContext ) {
		importScript( 'MediaWiki:Imagemap-Highlight.js' );
	}

	/**
	 * imgToggle
	 */
	// На странице есть как минимум один элемент div.img_toggle
	if ( $( 'div.img_toggle' ).length ) {
		mw.loader.load( 'ext.gadget.imgToggle' );
	}

	/**
	 * Авторазбиение списков на колонки. Будет работать только для однострочных списков. 35em
	 * (из Mediawiki:Common.css) является предварительным числом, а фактическое будет посчитано исходя
	 * из ширины элементов. Должно использоваться только для UL внутри DIV. Пример использования —
	 * шаблон {{Wikidata/SisterCities}}.
	 */
	$("div.autocolumns").each(function(d, div) {
		var parentWidth = $(div).parent()[0].offsetWidth;
		if (!parentWidth) return;

		var maxWidth = 0;
		var elements = 0;
		$(div).find("ul>li").each(function(l, li) {
			elements++;
			var jLi = $(li);
			if (jLi.children().length != jLi.contents().length)
				jLi.wrapInner(document.createElement("span"));

			var liWidth = 0;
			jLi.children().each(function(c, child) {
				liWidth += child.offsetWidth;
			});
			if (liWidth > maxWidth)
				maxWidth = liWidth;
		});
		if ( maxWidth === 0 ) return;
		// UL/LI bullet width + padding
		maxWidth += 22.5 * 2;

		var maxColumns = "" + Math.ceil( elements / 5 );
		$(div).css({"-moz-columns": maxWidth + "px " + maxColumns, "columns" : maxWidth + "px " + maxColumns});
	});
});

/**
 * Кнопки описания правок для визуального редактора
 */
mw.hook( 've.activationComplete' ).add( function () {
	mw.loader.load( 'ext.gadget.summaryButtons' );
} );

// A high frequency of errors come from old scripts referencing addPortletLink.
// Can be removed when https://global-search.toolforge.org/?q=%5B%5E%5C.%5DaddPortletLink%5C%28&regex=1&namespaces=&title=.*%5C.js has no nl.wikipedia results.
window.addPortletLink = function () {
	// @todo: Please Translate
	mw.notify('One of your user scripts is broken. Please inspect your error console and remove.');
	mw.log.warn('addPortletLink is deprecated. Please use mw.util.addPortletLink')
};