MediaWiki:Common.js — Википедия
Article Images
JS-код ниже относится ко всем темам оформления стационарной версии Википедии. CSS-файл: MediaWiki:Common.css.
После сохранения или недавних изменений очистите кэш браузера.
/** * Код 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 ); } } /** * Настройка обработки «е» и «ё» при сортировке в таблицах */ mw.config.set( 'tableSorterCollation', { 'Ё': 'Е', 'ё': 'е' } ); /** * Строки. Иноязычный интерфейс предположительно включают весьма редко, поэтому раздувать этот * список не стоит. При необходимости добавить много сообщений во много языков можно использовать * механизм системных сообщений (= страниц в пространстве MediaWiki, у которых могут быть суффиксы * типа /en). См., как их получение реализовано в MediaWiki:Gadget-sidebarRelated.js. */ var zeroSectionTip; if ( mw.config.get( 'wgUserLanguage' ) === 'en' ) { zeroSectionTip = 'Edit lead section'; } else { zeroSectionTip = 'Править преамбулу'; } /** * [[ВП:Сворачиваемые блоки]] */ // Число раскрытых по умолчанию навигационных (и не только) шаблонов, если им задан параметр // autocollapse. Участники могут переопределять это значение в личных JS. var NavigationBarShowDefault; if ( typeof NavigationBarShowDefault === 'undefined' ) { NavigationBarShowDefault = 1; } // Изолируем код из глобальной области видимости ( function () { // table.collapsible /** * Collapsible tables; reimplemented with mw-collapsible * Styling is also in place to avoid FOUC * * Allows tables to be collapsed, showing only the header. See [[Help:Collapsing]]. * @version 3.0.0 (2018-05-20) * @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-collapsibleTables.js * @author [[User:R. Koot]] * @author [[User:Krinkle]] * @author [[User:TheDJ]] * @deprecated Since MediaWiki 1.20: Use class="mw-collapsible" instead which * is supported in MediaWiki core. Shimmable since MediaWiki 1.32 * * @param {jQuery} $content */ function makeCollapsibleMwCollapsible( $content ) { var $tables = $content .find( 'table.collapsible:not(.mw-collapsible)' ) .addClass( 'mw-collapsible' ); $.each( $tables, function ( index, table ) { if ( $( table ).hasClass( 'collapsed' ) ) { $( table ).addClass( 'mw-collapsed' ); } } ); if ( $tables.length > 0 ) { mw.loader.using( 'jquery.makeCollapsible' ).then( function () { $tables.makeCollapsible(); } ); } } mw.hook( 'wikipage.content' ).add( makeCollapsibleMwCollapsible ); /** * Add support to mw-collapsible for autocollapse, innercollapse and outercollapse * * Maintainers: TheDJ */ function mwCollapsibleSetup( $collapsibleContent ) { var $element; var $toggle; var autoCollapseThreshold = NavigationBarShowDefault + 1; // Changed for ruwiki: Autocollapse according to the number of navbox elements var $navboxEls = $collapsibleContent.filter( '.navbox-inner' ); $.each( $collapsibleContent, function ( index, element ) { $element = $( element ); if ( $element.hasClass( 'collapsible' ) ) { $element.find( 'tr:first > th:first' ).prepend( $element.find( 'tr:first > * > .mw-collapsible-toggle' ) ); } if ( $navboxEls.length >= autoCollapseThreshold && $element.hasClass( 'autocollapse' ) ) { $element.data( 'mw-collapsible' ).collapse(); } else if ( $element.hasClass( 'innercollapse' ) ) { if ( $element.parents( '.outercollapse' ).length > 0 ) { $element.data( 'mw-collapsible' ).collapse(); } } // because of colored backgrounds, style the link in the text color // to ensure accessible contrast $toggle = $element.find( '.mw-collapsible-toggle' ); if ( $toggle.length ) { // Make the toggle inherit text color (Updated for T333357 2023-04-29) if ( $toggle.parent()[ 0 ].style.color ) { $toggle.css( 'color', 'inherit' ); $toggle.find( '.mw-collapsible-text' ).css( 'color', 'inherit' ); } } } ); } mw.hook( 'wikipage.collapsibleContent' ).add( mwCollapsibleSetup ); }() ); /** * Исправление поведения FlaggedRevs в сочетании с визуальным редактором, чтобы * в стабилизированных статьях на правку в визреде открывалась последняя версия, что * соответствует поведению обычного редактора. См. [[phab:T165283]], * [[Википедия:Форум/Архив/Общий/2017/12#Серьёзная проблема с анонимными правками в стабилизированных статьях]]. */ mw.loader.using( 'ext.visualEditor.desktopArticleTarget.init' ).then( function () { // По какой-то причине фикс для FlaggedRevs работает только при использовании then(), но не done(). runAsEarlyAsPossible( function () { function fixEditLinksForStableRevs( removeClickHandlers ) { if ( $( '#ca-view.selected' ).length ) { // При выходе из визреда (сохранении или переключении) ссылки работают правильно // и убирать обработчики событий нет нужды — только исправить URL’ы на случай // открытия правки в новой вкладке. if ( removeClickHandlers ) { $( '#ca-ve-edit, .mw-editsection-visualeditor' ).off( 'click' ); } $( '#ca-ve-edit a, .mw-editsection-visualeditor' ).each( function () { var href = $( this ).attr( 'href' ); if ( !/[?&]stable=0/.test( href ) ) { $( this ).attr( 'href', href .replace( /&veaction=edit/, '&stable=0&veaction=edit' ) .replace( /&oldid=\d+/, '' ) ); } } ); } } // Не включаем сюда проверку на наличие #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 ); } ); } } ); } ); mw.hook( 've.loadModules' ).add( function( addPlugin ) { /** * Поддержка Викификатора в новом режиме вики-текста aka 2017 wikitext editor */ addPlugin( function () { return mw.loader.using( 'ext.gadget.wikificator' ); } ); } ); /** * {{TOC hidden}} */ function TOChidden() { if ( !$( '.tochidden-wrapper' ).length ) { return; } mw.loader.using( 'mediawiki.toc', function() { $( '.tochidden-wrapper #toctogglecheckbox' ).prop('checked', true ); $( '.tochidden-wrapper' ).addClass( 'tochidden-done' ); } ); } runAsEarlyAsPossible( 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( '.mw-heading, h1, h2, h3, h4, h5, h6' ) .addBack() .first() .prev() .css( 'clear', clear ); } ); }); /** * Кнопки описания правок для визуального редактора */ mw.hook( 've.activationComplete' ).add( function () { mw.loader.load( 'ext.gadget.summaryButtons' ); } );