MediaWiki:Gadget-common-special-search.js

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
JS-код ниже относится к скрытому гаджету common-special-search. Связанный CSS-файл: MediaWiki:Gadget-common-special-search.css. Он включён по умолчанию.

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

// Не удаляйте проверку на название спецстраницы
$( function () {
	if ( mw.config.get( 'wgCanonicalSpecialPageName' ) !== 'Search' ) {
		return;
	}

	// External search engines
	var searchInput = document.querySelector( '#searchText input' );
	var list = {
		'Google': 'https://google.com/search?q=%s+site:ru.wikipedia.org&hl=ru',
		'Яндексе': 'https://yandex.ru/yandsearch?text=%s&site=ru.wikipedia.org',
		'Bing': 'https://www.bing.com/search?q=%s+site:ru.wikipedia.org',
	};
	var listKeys = Object.keys( list );

	var searchEngines = document.createElement( 'p' );
	searchEngines.id = 'searchEngines';
	searchEngines.innerHTML = 'Искать в (';
	if (!searchInput) return;

	for ( var i in list ) {
		var link = document.createElement( 'a' );
		link.href = list[ i ].replace( '%s', encodeURIComponent( searchInput.value ) );
		link.textContent = i;
		searchEngines.appendChild( link );

		if ( listKeys.indexOf( i ) < listKeys.length - 1 ) {
			searchEngines.appendChild( document.createTextNode( ' | ' ) );
		}
	}
	searchEngines.appendChild(document.createTextNode( ')' ));

	$( '.searchresults > .mw-search-visualclear' ).last().after( searchEngines );
	
	// Добавить ссылку «Искать на подстраницах» в поиск с префиксом
	var urlParams = new URLSearchParams( location.search );
	var prefix = urlParams.get( 'prefix' );
	if ( prefix && prefix.includes( '/' ) ) {
		var basePage = prefix.split( '/' )[ 0 ];
		var $searchAllLink = $( '#mw-content-subtitle a' );
		
		if ( $searchAllLink.length ) {
			var $searchPrefix = $searchAllLink.clone();
			$searchPrefix.text( 'Искать на подстраницах «' + basePage + '»' );
			$searchPrefix.attr( 'href', $searchPrefix.attr( 'href' ) + '&prefix=' + encodeURIComponent( basePage ) );
	
			$searchAllLink.after( $searchPrefix );
			$searchAllLink.after( '&nbsp;| ' );
		}
	}

	// Таблица ключевых слов для поиска: привязываем обработчик к ссылке «Ключевые слова»,
	// дооформляем, делаем ключевые слова кликабельными
	var $pseudolinkWrapper = $( '#keywords-popup-pseudolink-wrapper' );
	if ( !$pseudolinkWrapper.length ) return;

	var $popup = $( '#keywords-popup' );
	$popup.attr( 'aria-labelledby', 'keywords-popup-pseudolink-wrapper' );
	$( '#mw-indicator-mw-helplink a' ).text( 'Полная справка' );
	var popupShownFirstTime = true;
	
	function clickOnKeydown( e ) {
		if ( [ 'Space', 'Enter' ].includes( e.code ) ) {
			e.preventDefault();
			this.click();
		}
	}

	$pseudolinkWrapper
		.show()
		.find( 'a' )
		.removeAttr( 'title' )
		.attr( 'role', 'button' )
		.attr( 'aria-controls', 'keywords-popup' )
		.attr( 'aria-expanded', false )
		.on( 'click', function ( e ) {
			e.preventDefault();
			const isCollapsed = !$popup.hasClass( 'mwe-popups-fade-in-up' );
			$( this ).attr( 'aria-expanded', isCollapsed );

			// Используем классы [[mw:Extension:Popups]] (работают даже при выключенных
			// всплывающих окнах)
			if ( isCollapsed ) {
				$popup
					.show()
					.removeClass( 'mwe-popups-fade-out-down' )
					.addClass( 'mwe-popups-fade-in-up' );
				if ( popupShownFirstTime ) {
					// Позиционируем «хвост» попапа
					var $populTailPart1 = $( '#keywords-popup-tail-part1' );
					var $populTailPart2 = $( '#keywords-popup-tail-part2' );
					var popupTailPart1Left = $pseudolinkWrapper.offset().left + ( $pseudolinkWrapper.width() / 2 ) -
						$popup.offset().left - (
							( $populTailPart1.outerWidth() / 2 ) - (
								(
									parseInt( $pseudolinkWrapper.find( 'a' ).css( 'padding-left' ) ) -
									$( '.dropdown-icon' ).outerWidth( true )
								) / 2
							)
						);
					$populTailPart1.css( 'left', popupTailPart1Left + 'px' );
					$populTailPart2.css( 'left', ( popupTailPart1Left - 3 ) + 'px' );
				}
				popupShownFirstTime = false;
			} else {
				$popup
					.removeClass( 'mwe-popups-fade-in-up' )
					.addClass( 'mwe-popups-fade-out-down' );
				setTimeout( function () {
					// Состояние не изменилось: ссылка «Ключевые слова» не была кликнута
					// в середине затухания
					if ( $popup.hasClass( 'mwe-popups-fade-out-down' ) ) {
						$popup.hide();
					}
				}, 150 );
			}
		} )
		.on( 'keydown', clickOnKeydown );
	$popup.find( 'a' ).attr( 'target', '_blank' );

	var $searchBox = $( '#searchText input' );
	var pseudolinkHref = $pseudolinkWrapper.find( 'a' ).attr( 'href' );
	$( '.keywords-popup-keyword' ).wrap( $( '<a>' )
		.attr( 'href', pseudolinkHref )
		.attr( 'role', 'button' )
		.attr( 'title', 'Вставить ключевое слово в поле поиска' )
		.on( 'click', function( e ) {
			e.preventDefault();
			$searchBox.val( $searchBox.val() + $( this ).find( '.keywords-popup-keyword' )
				.data( 'keyword' ).replace( / /g, ' ' ) ).focus();
		} )
		.on( 'keydown', clickOnKeydown )
	);
} );