MediaWiki:Common.js — различия между версиями
Материал из Н.Ф. Федоров
Petrov (обсуждение | вклад) |
Petrov (обсуждение | вклад) |
||
(не показаны 3 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
+ | var expandCaption, collapseCaption, zeroSectionTip; | ||
+ | if ( mw.config.get( 'wgUserLanguage' ) === 'en' ) { | ||
+ | expandCaption = 'show'; | ||
+ | collapseCaption = 'hide'; | ||
+ | zeroSectionTip = 'Edit lead section'; | ||
+ | } else { | ||
+ | expandCaption = 'показать'; | ||
+ | collapseCaption = 'скрыть'; | ||
+ | zeroSectionTip = 'Править преамбулу'; | ||
+ | } | ||
+ | |||
/** | /** | ||
− | * | + | * [[ВП:Сворачиваемые блоки]] |
*/ | */ | ||
− | var | + | // Число раскрытых по умолчанию навигационных (и не только) шаблонов, если им задан параметр |
− | + | // autocollapse. Участники могут переопределять это значение в личных JS. | |
− | + | var NavigationBarShowDefault; | |
− | + | if ( typeof NavigationBarShowDefault === 'undefined' ) { | |
− | + | NavigationBarShowDefault = 1; | |
− | + | } | |
− | + | ||
+ | // table.collapsible | ||
+ | function collapsibleTables( $content ) { | ||
+ | var $btn, | ||
+ | $a, | ||
+ | tblIdx = 0, | ||
+ | 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; | ||
} | } | ||
− | + | } ); | |
− | mw. | + | 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 ); | ||
+ | |||
+ | 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 collapsibleDivs( $content ) { | ||
+ | var navIdx = 0, | ||
+ | colNavs = [], | ||
+ | i, | ||
+ | $Divs = $content.find( 'div' ); | ||
+ | |||
+ | $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 collapseDiv( idx ) { | ||
+ | var $div = $( '#NavFrame' + idx ), | ||
+ | $btn = $( '#NavToggle' + idx ); | ||
+ | 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' ); | ||
+ | } ); | ||
+ | } |
Текущая версия на 23:10, 10 апреля 2018
var expandCaption, collapseCaption, zeroSectionTip; if ( mw.config.get( 'wgUserLanguage' ) === 'en' ) { expandCaption = 'show'; collapseCaption = 'hide'; zeroSectionTip = 'Edit lead section'; } else { expandCaption = 'показать'; collapseCaption = 'скрыть'; zeroSectionTip = 'Править преамбулу'; } /** * [[ВП:Сворачиваемые блоки]] */ // Число раскрытых по умолчанию навигационных (и не только) шаблонов, если им задан параметр // autocollapse. Участники могут переопределять это значение в личных JS. var NavigationBarShowDefault; if ( typeof NavigationBarShowDefault === 'undefined' ) { NavigationBarShowDefault = 1; } // table.collapsible function collapsibleTables( $content ) { var $btn, $a, tblIdx = 0, 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 = 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 ); 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 collapsibleDivs( $content ) { var navIdx = 0, colNavs = [], i, $Divs = $content.find( 'div' ); $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 collapseDiv( idx ) { var $div = $( '#NavFrame' + idx ), $btn = $( '#NavToggle' + idx ); 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' ); } ); }