MediaWiki:Common.js: различия между версиями
Kerisar (обсуждение | вклад) мНет описания правки |
Pok (обсуждение | вклад) м port MediaWiki:Common.js from ruwiki |
||
| Строка 986: | Строка 986: | ||
}); | }); | ||
// SS220 import end | // SS220 import end | ||
/** | |||
* Taken from https://ru.wikipedia.org/wiki/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', { 'Ё': 'Е', 'ё': 'е' } ); | |||
/** | |||
* [https://w.wiki/DnhB Сворачиваемые блоки] | |||
*/ | |||
// Число раскрытых по умолчанию навигационных (и не только) шаблонов, если им задан параметр | |||
// 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() { | |||
var wrapper = document.querySelector( '.tochidden-wrapper' ); | |||
if ( wrapper === null ) { | |||
return; | |||
} | |||
mw.loader.using( 'mediawiki.toc', () => { | |||
var checkbox = wrapper.querySelector( '#toctogglecheckbox' ); | |||
// Убирает все ивенты с чекбокса, чтобы от раскрытия/скрытия не менялась куки | |||
checkbox.outerHTML = checkbox.outerHTML; | |||
checkbox = wrapper.querySelector( '#toctogglecheckbox' ); | |||
checkbox.checked = true; | |||
wrapper.classList.add( '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' ); | |||
} ); | |||
// wiki import end | |||