Чемпион Южной Америки 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
Перейти к: навигация, поиск
 
(не показаны 2 промежуточные версии этого же участника)
Строка 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
 
importScript_ = importScript
 
 
 
 
 
// for backwards compatibility
 
var addLoadEvent = addOnloadHook;
 
var import_script = importScript;
 
var import_style = importStylesheet;
 
var importScript_ = importScript;
 
var zeroSectionTip = 'Править'
 
 
 
//
 
 
 
function addLoadEvent(func)
 
{
 
if (window.addEventListener)
 
  window.addEventListener("load", func, false);
 
else if (window.attachEvent)
 
  window.attachEvent("onload", func);
 
}
 
 
 
//Edit zero section
 
function editZeroSection(){
 
if( !wgArticleId ) return
 
mw.util.$content.find('h2')
 
.children('.mw-editsection:first')
 
.clone().prependTo('#bodyContent')
 
.css('float','right')
 
.find('a')
 
.attr('title', zeroSectionTip)
 
.attr('href', wgScript + '?title='+mw.util.wikiUrlencode(wgPageName) + '&action=edit&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(){
 
var inp = document.getElementById('mwProtect-level-edit')
 
if (inp) addHandler(inp, 'change', noMoveAutoconfirmedProtection)
 
function noMoveAutoconfirmedProtection(){
 
  var inp = document.getElementById('mwProtectUnchained')
 
  if (!inp || inp.checked) return
 
  inp = document.getElementById('mwProtect-level-move')
 
  if (inp && inp.selectedIndex==1) inp.selectedIndex = 0
 
  inp = document.getElementById('mwProtect-level-delete')
 
  if (inp && inp.selectedIndex==1) inp.selectedIndex = 0
 
}
 
}
 
 
 
addOnloadHook(sysopProtectPage);
 
 
 
function newSectionLink(){
 
var plus = document.getElementById('ca-addsection')
 
if (!plus) return
 
var custom = document.getElementById('add-custom-section')
 
if (!custom) return
 
plus.firstChild.setAttribute('href', custom.getElementsByTagName('a')[0].href)
 
}
 
 
 
/*WikiEditor/Викификатор*/
 
if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) {
 
         mw.loader.load( '//ru.wikipedia.org/w/index.php?title=MediaWiki:Gadget-wikificator.js&action=raw&ctype=text/javascript' );
 
 
}
 
}
  
Строка 105: Строка 33:
 
         } );
 
         } );
 
}
 
}
 +
*/
 +
/*
 +
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' );
  
//See http://ru.wikipedia.org/wiki/project:code
+
if ( $testElement.length ) {
+
callback();
importScript_ = importScript
+
} else {
importScript = function (page, proj){
+
func( callback );
if (!proj) importScript_(page)
+
}
else {
 
  if (proj.indexOf('.')==-1) proj += '.wikipedia.org'
 
  importScriptURI('http://'+proj+'/w/index.php?action=raw&ctype=text/javascript&title='+encodeURIComponent(page.replace(/ /g,'_')))
 
}
 
 
}
 
}
  
//Collapsiblе: [[ВП:СБ]]
+
/**
 +
* Настройка обработки «е» и «ё» при сортировке в таблицах
 +
*/
 +
mw.config.set( 'tableSorterCollation', { 'Ё': 'Е', 'ё': 'е' } );
  
var hasClass = (function (){
+
// Messages
var reCache = {}
+
var expandCaption, collapseCaption, zeroSectionTip;
return function (element, className){
+
if ( mw.config.get( 'wgUserLanguage' ) === 'en' ) {
  return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className)
+
expandCaption = 'show';
  }
+
collapseCaption = 'hide';
})()
+
zeroSectionTip = 'Edit lead section';
 +
} else {
 +
expandCaption = 'показать';
 +
collapseCaption = 'скрыть';
 +
zeroSectionTip = 'Править преамбулу';
 +
}
  
function collapsibleTables(){
+
// Collapsiblе: [[:ru:ВП:СБ]]
var Table, HRow,  HCell, btn, a, tblIdx = 0, colTables = []
+
 
var allTables = document.getElementsByTagName('table')
+
var NavigationBarShowDefault;
for (var i=0; Table = allTables[i]; i++){
+
if ( typeof NavigationBarShowDefault === 'undefined' ) {
  if (!hasClass(Table, 'collapsible')) continue
+
NavigationBarShowDefault = 1;
  if (!(HRow=Table.rows[0])) continue
 
  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){
+
// table.collapsible
var Table = document.getElementById('collapsibleTable' + idx)
+
// collapsibleTablesItrIdx - временное решение, чтобы не дублировались id,
var btn = document.getElementById('collapseButton' + idx)
+
// если во время срабатывания хука 'wikipage.content' добавляются новые сворачиваемые блоки
if (!Table || !btn) return false
+
var collapsibleTablesItrIdx = 0;
var Rows = Table.rows
+
var isShown = (btn.firstChild.data == NavigationBarHide)
+
function collapsibleTables( $content ) {
btn.firstChild.data = isShown ? NavigationBarShow : NavigationBarHide
+
var $btn,
var disp = isShown ? 'none' : Rows[0].style.display
+
$a,
for (var i=1; i < Rows.length; i++)
+
tblIdx = collapsibleTablesItrIdx,
    Rows[i].style.display = disp
+
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 );
 
}
 
}
  
function collapsibleDivs(){
+
mw.hook( 'wikipage.content' ).add( collapsibleTables );
var navIdx = 0, colNavs = [], i, NavFrame
+
 
var divs = document.getElementById('content').getElementsByTagName('div')
+
function collapseTable( idx ) {
for (i=0; NavFrame = divs[i]; i++) {
+
var $table = $( '#collapsibleTable' + idx ),
  if (!hasClass(NavFrame, 'NavFrame')) continue
+
$rows = $table.children().children( 'tr' ),
  NavFrame.id = 'NavFrame' + navIdx
+
$btn = $( '#collapseButton' + idx );
  var a = document.createElement('a')
+
if ( !$table.length || !$rows.length || !$btn.length ) {
  a.className = 'NavToggle'
+
return false;
  a.id = 'NavToggle' + navIdx
+
}
  a.href = 'javascript:collapseDiv(' + navIdx + ');'
+
 
  a.appendChild(document.createTextNode(NavigationBarHide))
+
var isExpanded = ( $btn.text() === collapseCaption ),
  for (var j=0; j < NavFrame.childNodes.length; j++)
+
cssDisplay = isExpanded ? 'none' : $rows.first().css( 'display' );
    if (hasClass(NavFrame.childNodes[j], 'NavHead'))
+
 
      NavFrame.childNodes[j].appendChild(a)
+
$btn.text( isExpanded ? expandCaption : collapseCaption );
  colNavs[navIdx++] = NavFrame
+
$rows.slice( 1 ).each( function () {
}
+
$( this ).css( 'display', cssDisplay );
for (i=0; i < navIdx; i++)
+
} );
  if ((navIdx > NavigationBarShowDefault && !hasClass(colNavs[i], 'expanded')) || hasClass(colNavs[i], 'collapsed'))
 
    collapseDiv(i)
 
 
}
 
}
  
function collapseDiv(idx) {
+
// div.NavFrame
var div = document.getElementById('NavFrame' + idx)
+
var navFrameExpandCaption = '[' + expandCaption + ']',
var btn = document.getElementById('NavToggle' + idx)
+
navFrameCollapseCaption = '[' + collapseCaption + ']';
if (!div || !btn) return false
+
 
var isShown = (btn.firstChild.data == NavigationBarHide)
+
// Изолируем код из глобальной области видимости
btn.firstChild.data = isShown ? NavigationBarShow : NavigationBarHide
+
( function () {
var disp = isShown ? 'none' : 'block'
+
function collapsibleDivs( $content ) {
for (var child = div.firstChild;  child != null;  child = child.nextSibling)
+
var navFrameIndex = 0,
  if (hasClass(child, 'NavPic') || hasClass(child, 'NavContent'))
+
navFrames = [],
      child.style.display = disp
+
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 );
  
//Execution
+
function navToggleClickHandler() {
mw.loader.using( 'mediawiki.util', function() {
+
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' );
 +
} );
 +
}
  
if (wgCanonicalNamespace == 'Special'){
+
/**
 +
* Загрузка скриптов через систему подгаджетов
 +
*/
 +
var namespaceNumber = mw.config.get( 'wgNamespaceNumber' );
  
if (/^(Uplo|Sear|Stat|Spec|Abus|Prefe|Move|Watch|Newp)/i.test(wgCanonicalSpecialPageName))
+
// Скрипты для служебных страниц
  importMW(wgCanonicalSpecialPageName)
+
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' ];
  
}else switch (wgAction){
+
if ( actionGadgets[ action ] ) {
 +
mw.loader.load( actionGadgets[ action ] );
 +
}
  
case 'history': importMW('History'); break
+
// Скрипты для пространств
 +
var namespaceGadgets = {
 +
6: [ 'ext.gadget.common-namespace-file' ]
 +
};
  
case 'delete': importMW('Deletepage'); break
+
if ( namespaceGadgets[ namespaceNumber ] ) {
 +
mw.loader.load( namespaceGadgets[ namespaceNumber ] );
 +
}
 +
}
 +
}() );
  
  case 'edit': case 'submit': importMW('Editpage') //and continue with the default: view, purge
+
/**
 +
  * Старые коды
 +
*/
 +
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"; }' );
 +
} );
 +
}
  
  default:
+
// Закрываем меню при клике за его пределами
 +
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 );
 +
} );
 +
}
  
  $(editZeroSection)
+
/**
  addOnloadHook(collapsibleDivs)
+
* Выполнение скриптов из пространства MediaWiki, указанных в URL
  addOnloadHook(collapsibleTables)
+
* См. также https://www.mediawiki.org/wiki/Snippets/Load_JS_and_CSS_by_URL
  mw.loader.load('//meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js&action=raw&ctype=text/javascript&smaxage=21600&maxage=86400')
+
*/
  if( document.location && document.location.protocol == 'https:' )
+
var withJS = location.href.match( /[&?]withjs=((mediawiki:)?([^&#]+))/i );
    importMW('Secure')
+
if ( withJS ) {
  if (navigator.platform.indexOf('Win') != -1)
+
//importScript_( 'MediaWiki:' + withJS[3] );
    mw.util.addCSS('.IPA, .Unicode { font-family: "Arial Unicode MS", "Lucida Sans Unicode"; }')
+
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' );
 +
}
 +
} );
 +
}
 +
} );
  
 
+
/**
  switch( wgNamespaceNumber ){
+
* Чтобы ссылки на очистку кэша не требовали подтверждения (они должны быть помещены в тег с классом
    case 0: case 100:
+
* purgelink и именем страницы в атрибуте data-pagename, например как в шаблоне {{очистить кэш}})
      $(LinkFA)
+
*/
      importMW('Osm')
+
$( '.purgelink a' ).click( function ( e ) {
      if( wgArticleId==4401 ) importMW('Mainpage')
+
mw.loader.using( [ 'mediawiki.api', 'mediawiki.util' ] ).done( function () {
      break
+
var pageName = $( this ).parent( '.purgelink' ).data( 'pagename' ) || mw.config.get( 'wgPageName' );
    case 6:
+
new mw.Api().post( {
      importMW('Filepage')
+
action: 'purge',
      break
+
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 );
  
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')
};