MediaWiki:Gadget-sidebarRelated.js

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
JS-код ниже относится к гаджету: Переносить ссылку на Викиданные из раздела «Инструменты» в раздел «В других проектах» (править описание). Он включён по умолчанию.

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

// Переместить ссылку на элемент Викиданных в секцию «В других проектах»
function addOtherProjects() {
	var cfSkin = mw.config.get( 'skin' );
	
	if (
		mw.config.get( 'wgAction' ) !== 'view' ||
		mw.config.get( 'wgNamespaceNumber' ) % 2 ||
		mw.config.get( 'wgWikibaseItemId' ) === null
	) {
		return;
	}

	function initMove( $list ) {
		var $tWikibase = $( '#t-wikibase' );
		var $pOtherLink = $tWikibase.clone()
			.addClass( 'wb-otherproject-link wb-otherproject-wikidata' )
			.css( 'display', 'list-item' )
			.appendTo( $list );
		$tWikibase.remove();
	}

	function moveWikidataElementLink() {
		// Найти блок «Печать/экспорт»
		// (id различается в зависимости от пространства имён)
		var $pPrintExport = $( '#p-coll-print_export,#p-electronpdfservice-sidebar-portlet-heading' );
		if ( $pPrintExport.length === 0 ) {
			return;
		}
		
		// Клонировать «Печать/экспорт»
		$pOther = $pPrintExport
			.first()
			.clone()
			.removeClass( 'emptyPortlet' )
			.attr( 'id', 'p-wikibase-otherprojects' );
			
		var labelSelector = 'h3';
		if ( cfSkin === 'vector' ) {
			labelSelector = '.vector-menu-heading-label';
		}
		if ( cfSkin === 'vector-2022' ) {
			labelSelector = '.vector-menu-heading';
		}
		var $pOtherLabel = $pOther.find( labelSelector );
		$pOtherList = $pOther.find( 'ul' ).empty();
		$pOtherLabel.text( mw.msg( 'wikibase-otherprojects' ) );

		if ( cfSkin === 'vector' ) {
			$pOther.attr( 'aria-labelledby', 'p-wikibase-otherprojects-label' );
			$pOtherLabel.attr( 'id', 'p-wikibase-otherprojects-label' );
		}
		
		// Переместить ссылку Викиданных в новый список
		initMove( $pOtherList );
		
		// Вставить новый блок перед / после «На других языках» если есть, или в конец сайдбара
		var $pLang = $( '#p-lang' );
		var $mwSidebar = $pPrintExport.parent();
		if( $pLang.length > 0 ) {
			if ( cfSkin === 'timeless' ) {
				$pOther.insertAfter( $pLang );
			} else {
				$pOther.insertBefore( $pLang );
			}
		} else if( $mwSidebar.length > 0 ) {
			$pOther.appendTo( $mwSidebar );
		}
	}

	var $pOther = $( '#p-wikibase-otherprojects' );
	var $pOtherList = $pOther.find( 'ul' );

	if ( $pOther.length > 0 ) {
		$pOther.removeClass( 'emptyPortlet' );
		initMove( $pOtherList );
	} else {
		// Секции не существует, создать новую
		if ( mw.config.get( 'wgUserLanguage' ) === 'ru' ) {
			mw.messages.set( 'wikibase-otherprojects', 'В других проектах' );
			moveWikidataElementLink();
		} else {
			$.when( mw.loader.using( [ 'mediawiki.api' ] ) )
				.then( function () {
					// Загрузить системные сообщения
					return new mw.Api().loadMessagesIfMissing( [
						'wikibase-otherprojects'
					] );
				} )
				.then( moveWikidataElementLink );
		}
	}
}

// In case other projects copypaste the code and forget to implement
// runAsEarlyAsPossible() in MediaWiki:Common.js, which is too easy a mistake to
// make to not account for.
if ( typeof runAsEarlyAsPossible === 'undefined' ) {
	$( addOtherProjects );
} else {
	runAsEarlyAsPossible( addOtherProjects );
}