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;| ' );
		}
	}
	
	function clickOnKeydown( e ) {
		if ( [ 'Space', 'Enter' ].includes( e.code ) ) {
			e.preventDefault();
			this.click();
		}
	}
	
	// Таблица ключевых слов для поиска
	mw.loader.using( [
		'mediawiki.util',
		'oojs-ui-core',
		'oojs-ui-widgets'
	], () => {
		var $pseudolinkWrapper = $( '#keywords-popup-pseudolink-wrapper' );
		if ( !$pseudolinkWrapper.length ) return;

		var $helpLink = $( '#mw-indicator-mw-helplink a' );
		$helpLink.html( $helpLink.html().replace( 'Справка', 'Полная справка' ) );
	
		mw.util.addCSS( '.mw-indicators { display: flex; align-items: center; }' );
		var keywordsButton = new OO.ui.PopupButtonWidget( {
			id: 'keywords-button',
			label: 'Ключевые слова',
			indicator: 'down',
			flags: [
				'progressive'
			],
			icon: 'keywords',
			framed: false,
			popup: {
				$content: $( '<div>' ).html( $( '#keywords-popup' ).html() ),
				padded: true,
				align: 'down',
				width: 420
			}
		} );
		keywordsButton.$element.appendTo( $( '#mw-indicator-0-keywords-popup .mw-parser-output' ) );
	
		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 )
		);
	} );
} );