MediaWiki:Gadget-collapserefs.js (MediaWiki&Gadget-collapserefsQjs)

Перейти к навигации Перейти к поиску
JS-код ниже относится к гаджету «Компактный список сносок» (править описание). Связанный CSS-файл: MediaWiki:Gadget-collapserefs.css. Он включён по умолчанию.

После сохранения или недавних изменений очистите кэш браузера.

mw.loader.using( [
	'mediawiki.storage',
	'mediawiki.util'
], function() {
	if (
		!mw.config.get( 'wgIsArticle' )
		|| [ 'edit', 'submit' ].indexOf( mw.config.get( 'wgAction' ) ) > -1
		|| mw.util.getParamValue( 'printable' ) === 'yes'
		|| $( '.collapsible-heading' ).length > 0
	) {
		return;
	}
	
	var storageKey = 'gadget-collapserefs';
	var showCompact = '↑ Показать компактно';
	var showFull = '↓ Показать полностью';
	
	mw.hook( 'wikipage.content' ).add( function ( $content ) {
		var collapseState = mw.storage.get( storageKey ) === 'min' ? 'min' : 'max';
		var foundReflist;

		function findClassHolders( $reflists ) {
			var $classHolders = $();
			$reflists.each( function () {
				$classHolders = $classHolders.add( $( this ).children( '.mw-references-wrap' ).get( 0 ) || this );
			} );
			return $classHolders;
		}
		
		function changeState( e ) {
			var $collapseRefsLinks = $content.find( '.collapseRefs-link' ),
				$classHolders = findClassHolders( $collapseRefsLinks.parent().next() );
			
			e.preventDefault();
			
			collapseState = collapseState === 'max' ? 'min' : 'max';
			if ( collapseState === 'max' ) {  // when maximized
				$collapseRefsLinks.text( showCompact );
				$classHolders.removeClass( 'reflist-compact' );
			} else {                          // when minimized
				$collapseRefsLinks.text( showFull );
				$classHolders.addClass( 'reflist-compact' );
			}
			
			mw.storage.set( storageKey, collapseState );
		}
		
		$content.find( '.reflist, .references-small' ).each( function ( i, el ) {
			var computedStyle = el && window.getComputedStyle( el );
			if ( el.clientHeight <=
				( ( el.style.maxHeight &&
						el.style.maxHeight.replace( 'px', '' ) ) ||
					// clientHeight меньше height, если есть горизонтальная полоса прокрутки
					el.style.height.replace( 'px', '' ) ||
					// 40 — значение (в em) max-height у .reflist-compact в [[MediaWiki:Gadget-collapserefs.css]]
					( computedStyle && computedStyle.fontSize && computedStyle.fontSize.replace( 'px' , '' ) * 40 )
				) ||
				// Когда примечания уже обёрнуты в меньший по высоте блок (хотя такого не должно быть)
				 el.clientHeight > el.parentNode.clientHeight
			) {
				return;
			}
			foundReflist = true;
			
			if ( collapseState === 'min' ) {
				findClassHolders( $( el ) ).addClass( 'reflist-compact' );
			}
			$( '<div>' )
				.addClass( 'collapseRefs' +
					( $( el ).hasClass( 'not-references' ) ? ' collapseRefs-notRefs' : '' )
				)
				.append( $( '<a>' )
					.addClass( 'collapseRefs-link' )
					.attr( 'href', 'javascript:' )
					.attr( 'title', 'Большие блоки с примечаниями можно уменьшить' )
					.text( collapseState === 'max' ? showCompact : showFull )
					.click( changeState )
				)
				.insertBefore( el );
		} );
		if ( !foundReflist ) {
			return;
		}
	} );
} );