MediaWiki:Common.js
Замечание: Возможно, после публикации вам придётся очистить кэш своего браузера, чтобы увидеть изменения.
- Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl+F5 или Ctrl+R (⌘+R на Mac)
- Google Chrome: Нажмите Ctrl+Shift+R (⌘+Shift+R на Mac)
- Internet Explorer / Edge: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl+F5
- Opera: Нажмите Ctrl+F5.
/**
* Код MediaWiki:Common.js безусловно загружается всем пользователям на всех страницах. Во избежание
* отправки лишних запросов по возможности не используйте здесь mw.loader.using с модулями, которые
* не загружаются по умолчанию (см.
* [[Обсуждение MediaWiki:Common.js#Список модулей, загружаемых по умолчанию]]). В таком случае
* лучше создать скрытый гаджет, загружаемый по умолчанию, и добавить ему нужные модули в качестве
* зависимостей.
*/
/**
* Часто те или иные манипуляции со страницей нужно выполнить как можно раньше, но нет гарантии, что
* к моменту выполнения кода нужный участок DOM готов, а событие полной загрузки страницы происходит
* слишком поздно. В этой функции проверяется наличие элемента $testElement и в случае успеха
* функция-колбэк выполняется, иначе же её выполнение поручается другой функции. Если элемент
* в $testElement имеет содержимое, правильнее указать следующий за ним элемент, чтобы быть
* уверенным, что он загрузился до конца. Имейте в виду, что разные скины часто используют разные
* названия классов и идентификаторов.
*/
function runAsEarlyAsPossible( callback, $testElement, func ) {
func = func || $;
$testElement = $testElement || $( '#footer' );
if ( $testElement.length ) {
callback();
} else {
func( callback );
}
}
// Изолируем код из глобальной области видимости
( function () {
/**
* Загрузка скриптов через систему подгаджетов
*/
var namespaceNumber = mw.config.get( 'wgNamespaceNumber' );
// Скрипты для служебных страниц
if ( namespaceNumber === -1 ) {
var specialGadgets = [
'Search',
'Upload'
];
var canonicalSpecialPageName = mw.config.get( 'wgCanonicalSpecialPageName' );
if ( specialGadgets.indexOf( canonicalSpecialPageName ) > -1 ) {
mw.loader.load( 'ext.gadget.common-special-' + canonicalSpecialPageName.toLowerCase() );
}
} else {
// Скрипты для пространств имён
var namespaceGadgets = {
6: [ 'ext.gadget.common-namespace-file' ]
};
if ( namespaceGadgets[ namespaceNumber ] ) {
mw.loader.load( namespaceGadgets[ namespaceNumber ] );
}
}
}() );
/**
* Настройка обработки «е» и «ё» при сортировке в таблицах
*/
mw.config.set( 'tableSorterCollation', { 'Ё': 'Е', 'ё': 'е' } );
/**
* Код, который нужно выполнить как можно раньше. Он выполняется, если загружен подвал страницы,
* иначе же ждёт наступления события 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 ) {
mw.loader.load('https://руни.рф/index.php?title=MediaWiki:Script/' + name + '.js&action=raw&ctype=text/javascript');
}
} );
}
} );
/**
* Чтобы ссылки на очистку кэша не требовали подтверждения (они должны быть помещены в тег с классом
* 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 );
mw.hook( 've.loadModules' ).add( function( addPlugin ) {
/**
* Поддержка Викификатора в новом режиме вики-текста aka 2017 wikitext editor
*/
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 );
}
} );
}
// На странице есть [[шаблон:Спрятать хлебные крошки]] для скрытия некорректных ссылок на «надстраницу»
if ( $( 'div.hide_crumbs' ).length ) {
document.getElementsByClassName('subpages')[0].style.visibility = 'hidden';
}
}, $( '#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 ) {
mw.loader.load('https://руни.рф/index.php?title=MediaWiki:Imagemap-Highlight.js&action=raw&ctype=text/javascript');
}
/**
* imgToggle
*/
// На странице есть как минимум один элемент div.img_toggle
if ( $( 'div.img_toggle' ).length ) {
mw.loader.load( 'ext.gadget.imgToggle' );
}
/**
* pgnviewer
*/
// На странице есть как минимум один элемент div.pgn-source-wrapper
if ( $( 'div.pgn-source-wrapper' ).length ) {
mw.loader.load( 'ext.gadget.pgnviewer' );
}
/**
* Авторазбиение списков на колонки. Будет работать только для однострочных списков. 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' );
} );
/**
* Строки. Иноязычный интерфейс предположительно включают весьма редко, поэтому раздувать этот
* список не стоит. При необходимости добавить много сообщений во много языков можно использовать
* механизм системных сообщений (= страниц в пространстве MediaWiki, у которых могут быть суффиксы
* типа /en). См., как их получение реализовано в MediaWiki:Gadget-sidebarRelated.js.
*/
var expandCaption, collapseCaption, zeroSectionTip;
if ( mw.config.get( 'wgUserLanguage' ) === 'en' ) {
expandCaption = 'show';
collapseCaption = 'hide';
zeroSectionTip = 'Edit lead section';
} else {
expandCaption = 'показать';
collapseCaption = 'скрыть';
zeroSectionTip = 'Править преамбулу';
}