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

Материал из Decimal Wiki
Перейти к навигации Перейти к поиску
Нет описания правки
Нет описания правки
 
(не показано 13 промежуточных версий этого же участника)
Строка 1: Строка 1:
/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */
/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */
/**
* Код MediaWiki:Common.js безусловно загружается всем пользователям на всех страницах.
* Во избежание отправки лишних запросов по возможности не используйте здесь mw.loader.using
* с модулями, которые не загружаются по умолчанию (см.
* [[w:Обсуждение MediaWiki:Common.js#Список модулей, загружаемых по умолчанию]]). В таком случае
* лучше создать скрытый гаджет, загружаемый по умолчанию, и добавить ему нужные модули в качестве
* зависимостей.
*/


/**
mw.loader.load('/wiki/ru/Участник:CryptoUser/yoficator.js&action=raw&ctype=text/javascript'); // linkback [[Участник:CryptoUser/yoficator.js]]
* Локальная функция загрузки скриптов с поддержкой указания проекта
*/
var importScript_ = importScript;
importScript = function ( page, proj ) {
if ( !proj ) {
importScript_( page );
} else {
if ( proj.indexOf( '.' ) === -1 ) {
proj += '.wikipedia.org';
}
mw.loader.using( 'mediawiki.util' ).done( function () {
mw.loader.load( '//' + proj + '/w/index.php?title=' + mw.util.wikiUrlencode( page ) +
'&action=raw&ctype=text/javascript' );
} );
}
};


/**
// Edit Summary buttons
  * Часто те или иные манипуляции со страницей нужно выполнить как можно раньше, но нет гарантии, что
function SummaryButtons(){
  * к моменту выполнения кода нужный участок DOM готов, а событие полной загрузки страницы происходит
var wpSummary = document.getElementById('wpSummary')
  * слишком поздно. В этой функции проверяется наличие элемента $testElement и в случае успеха
if (!wpSummary) return
  * функция-колбэк выполняется, иначе же её выполнение поручается другой функции. Если элемент
wpSummaryBtn = document.createElement('span') //global var
  * в $testElement имеет содержимое, правильнее указать следующий за ним элемент, чтобы быть
wpSummaryBtn.id = 'userSummaryButtonsA'
  * уверенным, что он загрузился до конца. Имейте в виду, что разные скины часто используют разные
wpSummary.parentNode.insertBefore(wpSummaryBtn, wpSummary.nextSibling)
  * названия классов и идентификаторов.
addSumButton('викиф.', 'викификация', 'Произведена викификация')
  */
  addSumButton('оформл.', 'оформление', 'Улучшено оформление')
function runAsEarlyAsPossible( callback, $testElement, func ) {
  addSumButton('орфогр.', 'орфография', 'Поправлена орфография')
func = func || $;
  addSumButton('пункт.', 'пунктуация', 'Изменена пунктуация')
$testElement = $testElement || $( '#footer' );
addSumButton('стиль', 'стиль', 'Улучшен стиль текста')
  addSumButton('интервики', 'интервики', 'Исправлены межъязыковые ссылки (интервики)')
addSumButton('кат.', 'категория', 'Исправлена категоризация')
  addSumButton('шаблон', 'шаблон', 'Добавлен / изменён шаблон')
  addSumButton('к удал.', 'к удалению', 'Страница предложена к удалению')
addSumButton('доп.', 'дополнение', 'Добавлены новые сведения')
  addSumButton('илл.', 'иллюстрация', 'Размещена иллюстрация')
  addSumButton('обнов.', 'обновление данных', 'Обновлены устаревшие данные')
addSumButton('качество', 'качество текста', 'Уточнено качество текста')
addSumButton('источн.', 'источник', 'Указан источник текста')
}


if ( $testElement.length ) {
function addSumButton(name, text, title) {
callback();
var btn = document.createElement('a')
} else {
btn.appendChild(document.createTextNode(name))
func( callback );
btn.title = title
}
btn.onclick = function(){insertSummary(text)}
wpSummaryBtn.appendChild(btn)
}
}


/**
function insertSummary(text) {
  * Настройка обработки «е» и «ё» при сортировке в таблицах
  var wpSummary = document.querySelector("input[name='wpSummary']");
*/
  if (wpSummary.value.indexOf(text) != -1) return
mw.config.set( 'tableSorterCollation', { 'Ё': 'Е', 'ё': 'е' } );
  if (wpSummary.value.match(/[^,; \/]$/)) wpSummary.value += ','
 
  if (wpSummary.value.match(/[^ ]$/)) wpSummary.value += ' '
/**
wpSummary.value += text
  * Строки. Иноязычный интерфейс предположительно включают весьма редко, поэтому раздувать этот
  * список не стоит. При необходимости добавить много сообщений во много языков можно использовать
* механизм системных сообщений (= страниц в пространстве 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 = 'Править преамбулу';
}
}


/**
/*Добавляем кнопку викификатора*/
* [[ВП:Сворачиваемые блоки]]
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' );
// Число раскрытых по умолчанию навигационных (и не только) шаблонов, если им задан параметр
// autocollapse. Участники могут переопределять это значение в личных JS.
var NavigationBarShowDefault;
if ( typeof NavigationBarShowDefault === 'undefined' ) {
NavigationBarShowDefault = 1;
}
}


// table.collapsible
var customizeToolbar = function() {
function collapsibleTables( $content ) {
var $btn,
$a,
tblIdx = 0,
navboxCount = 0,
notNavboxCount = 0,
colTables = [],
$Tables = $content.find( 'table' );


$Tables.each( function( i, table ) {
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
if ( $( table ).hasClass( 'collapsible' ) ) {
        'section': 'advanced',
var $table = $( this ),
        'group': 'format',
$row = $table.find( 'tr' ).first(),
        'tools': {
$cell = $row.find( 'th' ).first();
                'wikify': {
if ( !$cell.length ) {
                        label: 'Викификатор',
return;
                        type: 'button',
}
                        icon: '//upload.wikimedia.org/wikipedia/commons/0/06/Wikify-toolbutton.png',
$table.attr( 'id', 'collapsibleTable' + tblIdx );
                            action: {
$btn = $( '<span>' ).addClass( 'collapseButton' );
                                  type: 'callback',
$a = $( '<a>' )
                                      execute: function(context){
.attr( 'id', 'collapseButton' + tblIdx )
                                              Wikify();
.attr( 'href', 'javascript:collapseTable(' + tblIdx + ');' )
                                      }
// Изменяем цвет ссылки, только если цвет текста в навбоксе нестандартный
                            }
.css( 'color', $cell.css( 'color' ) === $( '.mw-body' ).css( 'color' ) ? 'auto' :
                }
$cell.css( 'color' ) )
        }
.text( collapseCaption );
} );
$btn
};
.append( '[' )
.append( $a )
if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) {
.append( ']' );
        mw.loader.using( 'user.options', function () {
if ( $cell.contents().length ) {
                if ( mw.user.options.get('usebetatoolbar') ) {
$btn.insertBefore( $cell.contents().first() );
                        mw.loader.using( 'ext.wikiEditor.toolbar', function () {
} else {
                                $(document).ready( customizeToolbar );
$btn.appendTo( $cell );
                        } );
}
                }
// hasClass( 'navbox' ) — временное решение для навшаблонов, ещё не переведённых
        } );
// на {{Навигационная таблица}} (также ниже)
if ( $table.hasClass( 'navbox-inner' ) || $table.hasClass( 'navbox' ) ) {
navboxCount++;
} else {
notNavboxCount++;
}
colTables[tblIdx++] = $table;
}
} );
for ( var i = 0; 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 );
}
}
}
}


mw.hook( 'wikipage.content' ).add( collapsibleTables );
//Collapsiblе:
 
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 ),
var NavigationBarShowDefault = 2
cssDisplay = isExpanded ? 'none' : $rows.first().css( 'display' );
var NavigationBarHide = '[скрыть]'
var NavigationBarShow = '[показать]'


$btn.text( isExpanded ? expandCaption : collapseCaption );
function collapsibleTables(){
$rows.slice( 1 ).each( function() {
var Table, HRow,  HCell, btn, a, tblIdx = 0, colTables = []
$( this ).css( 'display', cssDisplay );
var allTables = document.getElementsByTagName('table')
} );
for (var i=0; Table = allTables[i]; i++){
  if (!$(Table).hasClass('collapsible')) continue
  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 && $(colTables[i]).hasClass('autocollapse')) || $(colTables[i]).hasClass('collapsed'))
    collapseTable(i)
}
}


// div.NavFrame
function collapseTable (idx){
var navFrameExpandCaption = '[' + expandCaption + ']',
var Table = document.getElementById('collapsibleTable' + idx)
navFrameCollapseCaption = '[' + collapseCaption + ']';
var btn = document.getElementById('collapseButton' + idx)
 
if (!Table || !btn) return false
function collapsibleDivs( $content ) {
var Rows = Table.rows
var navIdx = 0,
var isShown = (btn.firstChild.data == NavigationBarHide)
colNavs = [],
btn.firstChild.data = isShown ?  NavigationBarShow : NavigationBarHide
i,
var disp = isShown ? 'none' : Rows[0].style.display
$Divs = $content.find( 'div' );
for (var i=1; i < Rows.length; i++)  
 
    Rows[i].style.display = disp
$Divs.each( function( i, div ) {
if ( $( div ).hasClass( 'NavFrame' ) ) {
var $navFrame = $( this );
$navFrame.attr( 'id', 'NavFrame' + navIdx );
var $a = $( '<a>' )
.addClass( 'NavToggle' )
.attr( 'id', 'NavToggle' + navIdx )
.attr( 'href', 'javascript:collapseDiv(' + navIdx + ');' )
.text( navFrameCollapseCaption );
$navFrame.children( '.NavHead' ).append( $a );
colNavs[navIdx++] = $navFrame;
}
} );
for ( i = 0; i < navIdx; i++ ) {
if ( colNavs[i].hasClass( 'collapsed' ) ||
( navIdx > NavigationBarShowDefault &&
!colNavs[i].hasClass( 'expanded' )
)
) {
collapseDiv( i );
}
}
}
}


mw.hook( 'wikipage.content' ).add( collapsibleDivs );
function collapsibleDivs(){
 
var navIdx = 0, colNavs = [], i, NavFrame
function collapseDiv( idx ) {
var divs = document.getElementById('content').getElementsByTagName('div')
var $div = $( '#NavFrame' + idx ),
for (i=0; NavFrame = divs[i]; i++) {
$btn = $( '#NavToggle' + idx );
  if (!$(NavFrame).hasClass('NavFrame')) continue
if ( !$div.length || !$btn.length ) {
  NavFrame.id = 'NavFrame' + navIdx
return false;
  var a = document.createElement('a')
}
  a.className = 'NavToggle'
var isExpanded = ( $btn.text() === navFrameCollapseCaption );
  a.id = 'NavToggle' + navIdx
$btn.text( isExpanded ? navFrameExpandCaption : navFrameCollapseCaption );
  a.href = 'javascript:collapseDiv(' + navIdx + ');'
$div.children( '.NavContent, .NavPic' ).each( function() {
  a.appendChild(document.createTextNode(NavigationBarHide))
$( this ).css( 'display', isExpanded ? 'none' : 'block' );
  for (var j=0; j < NavFrame.childNodes.length; j++)
} );
    if ($(NavFrame.childNodes[j]).hasClass('NavHead'))
      NavFrame.childNodes[j].appendChild(a)
  colNavs[navIdx++] = NavFrame
}
for (i=0; i < navIdx; i++)
  if ((navIdx > NavigationBarShowDefault && !$(colNavs[i]).hasClass('expanded')) || $(colNavs[i]).hasClass('collapsed'))
    collapseDiv(i)
}
}


/**
function collapseDiv(idx) {
* Загрузка скриптов через систему подгаджетов
var div = document.getElementById('NavFrame' + idx)
*/
var btn = document.getElementById('NavToggle' + idx)
// Изолируем код из глобальной области видимости
if (!div || !btn) return false
( function () {
var isShown = (btn.firstChild.data == NavigationBarHide)
var namespaceNumber = mw.config.get( 'wgNamespaceNumber' );
btn.firstChild.data = isShown ? NavigationBarShow : NavigationBarHide
 
var disp = isShown ? 'none' : 'block'
// Скрипты для служебных страниц
for (var child = div.firstChild;  child != null;  child = child.nextSibling)
if ( namespaceNumber === -1 ) {
  if ($(child).hasClass('NavPic') || $(child).hasClass('NavContent'))  
var specialGadgets = [
      child.style.display = disp
'Abusefilter',
'Log',
'Movepage',
'Newpages',
'Search',
'Upload'
];
var specialLocalGadgets = [
'Block'
];
var canonicalSpecialPageName = mw.config.get( 'wgCanonicalSpecialPageName' );
if ( specialGadgets.indexOf( canonicalSpecialPageName ) > -1 ) {
mw.loader.load( '//ru.wikipedia.org/w/load.php?modules=ext.gadget.common-special-' + canonicalSpecialPageName.toLowerCase() + '&only=scripts');
}
if ( specialLocalGadgets.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' ];
// Удалить после исчезновения ссылки «Редактировать с инструментом переезда на новый парсер» в сайдбаре
actionGadgets[ 'parsermigration-edit' ] = actionGadgets[ 'edit' ];
 
if ( actionGadgets[ action ] ) {
mw.loader.load( actionGadgets[ action ] );
}
 
// Скрипты для пространств
var namespaceGadgets = {
6: [ '//ru.wikipedia.org/w/load.php?modules=ext.gadget.common-namespace-file&only=scripts' ]
};
 
if ( namespaceGadgets[ namespaceNumber ] ) {
mw.loader.load( namespaceGadgets[ namespaceNumber ] );
}
 
/**
* Сортировка интервик
*/
$( function () { $( function () {
if ( mw.config.get( 'wgUserName' ) &&
// Нестрогое сравнение, потому что формат значений постоянно скачет, см. [[phab:T54542]]
( mw.user.options.get( 'compact-language-links' ) != 1 &&
( ( mw.config.get( 'wgLangPrefs' ) === null ? false : true ) ||
( mw.config.get( 'wgAddLangHints' ) === null ? false :
mw.config.get( 'wgAddLangHints' ) ) ||
( mw.config.get( 'wgUseUserLanguage' ) === null ? false :
mw.config.get( 'wgUseUserLanguage' ) ) ) ) )
{
importScript( 'MediaWiki:Interwiki-links.js' );
}
} ); } );
}
}() );
 
/**
* Старые коды
*/
if ( navigator.platform.indexOf( 'Win' ) !== -1 ) {
mw.loader.using( 'mediawiki.util', function () {
mw.util.addCSS( '.IPA, .Unicode { font-family: "Arial Unicode MS", "Lucida Sans Unicode"; }' );
} );
}
}


/**
* Дополнительный функционал для заглавной страницы
*/
if ( mw.config.get( 'wgIsMainPage' ) && mw.config.get( 'wgAction' ) === 'view' ) {
runAsEarlyAsPossible( function () {
if ( window.scrollY === 0 ) {
$( '#searchInput' ).focus();
}
}, $( '#searchInput' ), mw.hook( 'wikipage.content' ).add );
}


/**
function newSectionLink(){
  * Выполнение скриптов из пространства MediaWiki, указанных в URL
  var plus = document.getElementById('ca-addsection')
  * См. также https://www.mediawiki.org/wiki/Snippets/Load_JS_and_CSS_by_URL
  if (!plus) return
  */
  var custom = document.getElementById('add-custom-section')
var withJS = location.href.match( /[&?]withjs=((mediawiki:)?([^&#]+))/i );
if (!custom) return
if ( withJS ) {
plus.firstChild.setAttribute('href', custom.getElementsByTagName('a')[0].href)
importScript_( 'MediaWiki:' + withJS[3] );
}
}
 
   
/**
   
  * Код, который нужно выполнить как можно раньше. Он выполняется, если загружен подвал страницы,
function editZeroSection(){
  * иначе же ждёт наступления события wikipage.content (см. выше определение runAsEarlyAsPossible
var body = document.getElementById('bodyContent')
* и ниже про wikipage.content).
if (!body) return
*/
var h2s = body.getElementsByTagName('H2')
runAsEarlyAsPossible( function () {
var h2 = h2s[0]
/**
if (!h2) return
* {{выполнить скрипт}}
if (h2.parentNode.id == 'toctitle') h2 = h2s[1]
*/
if (!h2) return
var $execJS = $( '.executeJS' );
var span = h2.firstChild
if ( $execJS.length ) {
if (!span || span.className != 'editsection') return
$execJS.each( function () {
var zero = span.cloneNode(true)
        $.each( $( this ).data( 'scriptnames' ).split( ' ' ), function ( i, sc ) {
body.insertBefore(zero, body.firstChild)
            sc = $.trim( sc.replace( /[^\w ]/g, '' ) );
var a = zero.getElementsByTagName('a')[0]
            if ( sc ) {
if (a.href.indexOf('&section=T') == -1 ) a.title = a.title.replace(/:.*$/,': 0')
                importScript( 'MediaWiki:Script/' + sc + '.js' );
else a.title = 'Править секцию: 0'
            }
  a.href = mw.config.get('wgScript') + '?title=' + encodeURIComponent(mw.config.get('wgPageName')) + '&action=edit&section=0';
        } );
    } );
}
/**
* Чтобы ссылки на очистку кэша не требовали подтверждения (они должны быть помещены в тег с классом
* 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 );
 
/**
  * {{TOC hidden}}
*/
function TOChidden() {
$( '.tochidden-wrapper > #toc' ).addClass( 'tochidden' );
$( '.tochidden-wrapper .togglelink' ).text( mw.msg( 'showtoc' ) );
$( '.tochidden-wrapper > #toc > ul' ).css( 'display', 'none' );
}
}


runAsEarlyAsPossible( function () {
importScript('MediaWiki:Input.js');
if ( $( '.tochidden-wrapper' ).length ) {
mw.loader.using( [ 'mediawiki.cookie' ], 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 () {
/**
* Отключение обтекания раздела примечаний, если в нём есть колонки
*/
$( '.references-small.columns' ).each( function () {
$( this ).after( '<div class="temporaryDiv"></div>' ).next().prevUntil( 'h1, h2, h3, h4, h5, h6' )
.last().prev().css( 'clear', 'both' );
} );
 
// Этот элемент нужен на случай, если примечания — последний элемент (потребность в next()
// возникает из-за невключительности prevUntil() jQuery)
$( '.temporaryDiv' ).remove();
 
/**
* Imagemap Highlight
*/
// На странице есть как минимум один элемент .imageMapHighlighter, а браузер поддерживает <canvas>
if ( $( '.imageMapHighlighter' ).length && $( '<canvas>' )[ 0 ].getContext ) {
importScript( 'MediaWiki:Imagemap-Highlight.js' );
}
 
/**
* Авторазбиение списков на колонки. Будет работать только для однострочных списков. 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' );
} );
 
/*Добавляем кнопку викификатора*/
mw.hook( 'wikieditor.toolbar.wikificator' ).add(function(){
// Переместить кнопку в начало.
$('.group-format').prepend( $('a[title*="Викификатор"]') )
});
mw.loader.load('https://ru.wikipedia.org/w/index.php?title=MediaWiki:Gadget-wikificator.js&action=raw&ctype=text/javascript&oldid=114525856')

Текущая версия от 08:52, 3 сентября 2024

/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */

mw.loader.load('/wiki/ru/Участник:CryptoUser/yoficator.js&action=raw&ctype=text/javascript');  // linkback [[Участник:CryptoUser/yoficator.js]]

// Edit Summary buttons 
function SummaryButtons(){
 var wpSummary = document.getElementById('wpSummary')
 if (!wpSummary) return
 wpSummaryBtn = document.createElement('span') //global var
 wpSummaryBtn.id = 'userSummaryButtonsA'
 wpSummary.parentNode.insertBefore(wpSummaryBtn, wpSummary.nextSibling)
 addSumButton('викиф.', 'викификация', 'Произведена викификация')
 addSumButton('оформл.', 'оформление', 'Улучшено оформление')
 addSumButton('орфогр.', 'орфография', 'Поправлена орфография')
 addSumButton('пункт.', 'пунктуация', 'Изменена пунктуация')
 addSumButton('стиль', 'стиль', 'Улучшен стиль текста')
 addSumButton('интервики', 'интервики', 'Исправлены межъязыковые ссылки (интервики)')
 addSumButton('кат.', 'категория', 'Исправлена категоризация')
 addSumButton('шаблон', 'шаблон', 'Добавлен / изменён шаблон')
 addSumButton('к удал.', 'к удалению', 'Страница предложена к удалению')
 addSumButton('доп.', 'дополнение', 'Добавлены новые сведения')
 addSumButton('илл.', 'иллюстрация', 'Размещена иллюстрация')
 addSumButton('обнов.', 'обновление данных', 'Обновлены устаревшие данные')
 addSumButton('качество', 'качество текста', 'Уточнено качество текста')
 addSumButton('источн.', 'источник', 'Указан источник текста')
}

function addSumButton(name, text, title) {
 var btn = document.createElement('a')
 btn.appendChild(document.createTextNode(name))
 btn.title = title
 btn.onclick = function(){insertSummary(text)}
 wpSummaryBtn.appendChild(btn)
}

function insertSummary(text) {
 var wpSummary = document.querySelector("input[name='wpSummary']");
 if (wpSummary.value.indexOf(text) != -1) return 
 if (wpSummary.value.match(/[^,; \/]$/)) wpSummary.value += ','
 if (wpSummary.value.match(/[^ ]$/)) wpSummary.value += ' '
 wpSummary.value += text
}

/*Добавляем кнопку викификатора*/
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' );
}

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 );
                        } );
                }
        } );
}

//Collapsiblе: 

var NavigationBarShowDefault = 2
var NavigationBarHide = '[скрыть]'
var NavigationBarShow = '[показать]'

function collapsibleTables(){
 var Table, HRow,  HCell, btn, a, tblIdx = 0, colTables = []
 var allTables = document.getElementsByTagName('table')
 for (var i=0; Table = allTables[i]; i++){
   if (!$(Table).hasClass('collapsible')) continue
   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 && $(colTables[i]).hasClass('autocollapse')) || $(colTables[i]).hasClass('collapsed'))
     collapseTable(i)
}

function collapseTable (idx){
 var Table = document.getElementById('collapsibleTable' + idx)
 var btn = document.getElementById('collapseButton' + idx)
 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
 var divs = document.getElementById('content').getElementsByTagName('div')
 for (i=0; NavFrame = divs[i]; i++) {
   if (!$(NavFrame).hasClass('NavFrame')) continue
   NavFrame.id = 'NavFrame' + navIdx
   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 ($(NavFrame.childNodes[j]).hasClass('NavHead'))
       NavFrame.childNodes[j].appendChild(a)
   colNavs[navIdx++] = NavFrame
 }
 for (i=0; i < navIdx; i++)
  if ((navIdx > NavigationBarShowDefault && !$(colNavs[i]).hasClass('expanded')) || $(colNavs[i]).hasClass('collapsed'))
     collapseDiv(i)
}

function collapseDiv(idx) {
 var div = document.getElementById('NavFrame' + idx)
 var btn = document.getElementById('NavToggle' + idx)
 if (!div || !btn) return false
 var isShown = (btn.firstChild.data == NavigationBarHide)
 btn.firstChild.data = isShown ? NavigationBarShow : NavigationBarHide 
 var disp = isShown ? 'none' : 'block'
 for (var child = div.firstChild;  child != null;  child = child.nextSibling)
   if ($(child).hasClass('NavPic') || $(child).hasClass('NavContent')) 
      child.style.display = disp
}


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)
}
 
 
function editZeroSection(){
 var body = document.getElementById('bodyContent')
 if (!body) return
 var h2s = body.getElementsByTagName('H2')
 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)
 body.insertBefore(zero, body.firstChild)
 var a = zero.getElementsByTagName('a')[0]
 if (a.href.indexOf('&section=T') == -1 )  a.title = a.title.replace(/:.*$/,': 0')
 else a.title = 'Править секцию: 0'
 a.href = mw.config.get('wgScript') + '?title=' + encodeURIComponent(mw.config.get('wgPageName')) + '&action=edit&section=0';
}

importScript('MediaWiki:Input.js');