MediaWiki:Gadget-Search.js

// ( function {	var wb = wikibase;	var i18nData = {		'en': {			title: 'Improved search',			description: 'Search for items by site and title',			placeholder: 'Item by sitelink'		},		'ar': {			title: 'بحث محسن',			description: 'البحث عن عناصر حسب الموقع والعنوان',			placeholder: 'عناصر حسب الموقع'		},		'be': {			description: 'Шукаць элементы паводле праекта і назвы',			placeholder: 'Элементы паводле назвы'		},		'be-tarask': {			description: 'Пошук аб’ектаў паводле сайту і назвы',			placeholder: 'Аб’ект паводле спасылкі'		},		'bg': {			description: 'Търсене на обекти по сайт и заглавие'		},		'bn': {			title: 'উন্নত অনুসন্ধান',			description: 'সাইট এবং শিরোনাম অনুযায়ী আইটেমের জন্য অনুসন্ধান',			placeholder: 'সাইটলিঙ্ক অনুযায়ী আইটেম'		},		'ca': {			title: 'Cerca avançada',			description: 'Cerca elements per lloc i títol',			placeholder: 'Element per títol'		},		'ckb': {			title: 'گەڕانی پێشکەوتوو', description: 'گەڕانی بەندەکان بە پێی پێگە و سەردێڕ', placeholder: 'بەندەکان بە پێی سەردێڕ' },		'cs': { description: 'Vyhledat položky podle projektu a názvu', placeholder: 'Položky podle názvu' },		'da': { description: 'Søg efter emner fra webstedet og titel', placeholder: 'Element fra titel' },		'de': { title: 'Verbesserte Suche', description: 'Suche nach Datenelementen nach Website und Titel', placeholder: 'Datenelemente nach Websitelink' },		'dsb': { description: 'Elementy pó sedle a titelu pytaś', placeholder: 'Zapisk pó sedłowem wótkazu' },		'el': { title: 'Βελτιωμένη αναζήτηση', description: 'Αναζήτηση αντικειμένου με βάση τον ιστότοπο και τον τίτλο', placeholder: 'Στοιχεία ανά ιστότοπο' },		'eo': { description: 'Priserĉu erojn laŭ retejo kaj titolo', placeholder: 'Ero laŭ titolo' },		'es': { title: 'Búsqueda mejorada', description: 'Búsqueda de artículos por sitio y título', placeholder: 'Elemento por enlace de sitio' },		'eu': { title: 'Bilaketa hobetua', description: 'Bilatu elementuak tokiaren eta izenburuaren arabera', placeholder: 'Elementua tokiaren loturaren arabera' },		'fa': { title: 'جستجوی پیشرفته', description: 'جستجوی آیتم‌ها بر پایهٔ وب‌گاه و عنوان', placeholder: 'آیتم‌ها بر پایهٔ عنوان' },		'fi': { title: 'Parannettu haku', description: 'Etsi kohteita sivuston ja otsikon mukaan', placeholder: 'Hae kohdetta sivustolinkillä' },		'fr': { title: 'Recherche améliorée', description: 'Rechercher des éléments par site et par titre', placeholder: 'Élément par lien de site' },		'frp': { description: 'Rechèrche d’èlèments per seto et titro', placeholder: 'Èlèment per titro' },		'gl': { title: 'Busca mellorada', description: 'Procurar elementos por sitio e título', placeholder: 'Elemento por ligazón' },		'he': { title: 'חיפוש משופר', description: 'חיפוש פריטים לפי אתר וכותרת', placeholder: 'פריט לפי קישור אתר' },		'hr': { title: 'Poboljšano pretraživanje', description: 'Pretraga stavki prema mrežnom mjestu i naslovu', placeholder: 'Stavke prema poveznicama na mrežna mjesta' },		'hsb': { description: 'Za elementami po sydle a titulu pytać', placeholder: 'Zapisk po sydłowym wotkazu' },		'hu': { description: 'Fogalom keresése wiki és cím alapján', placeholder: 'Fogalom cím szerint' },		'ia': { placeholder: 'Objecto per titulo' },		'id': { title: 'Pencarian tingkat lanjut', description: 'Cari item berdasarkan wiki dan judul', placeholder: 'Item berdasarkan wiki' },		'ilo': { description: 'Agbiruk para kadagiti banag babaen ti sitio ken titulo', placeholder: 'Banag babaen ti titulo' },		'is': { description: 'Leita eftir hlutum eftir vefsíðu og titli', placeholder: 'Hlutur eftir vefsíðutengli' },		'it': { title: 'Ricerca migliorata', description: 'Ricerca elementi per sito e titolo', placeholder: 'Elementi per sitelink' },		'ja': { description: 'サイト名やページ名で項目を探す', placeholder: 'サイトリンクから項目を探す' },		'ka': { description: 'ელემენტების ძიება საიტისა და სახელწოდების მიხედვით', placeholder: 'ელემენტი სათაურის მიხედვით' },		'ko': { description: '사이트와 제목별로 항목 찾기', placeholder: '제목별 항목' },		'min': { title: 'Pancarian tingkek lanjuik', description: 'Cari item badasarkan wiki jo judul', placeholder: 'Item badasarkan wiki' },		'mk': { description: 'Пребарување на предмети по вики или наслов', placeholder: 'Предмет по викиврска' },		'ms': { description: 'Cari perkara mengikut tapak dan tajuk', placeholder: 'Perkara mengikut pautan tapak' },		'nb': { title: 'Forbedret søk', description: 'Søk etter elementer fra nettsted og tittel', placeholder: 'Element fra nettstedlenke' },		'nl': { description: 'Items zoeken op site en paginanaam', placeholder: 'Item gesorteerd op naam' },		'nn': { description: 'Søk etter datasett etter nettstad og tittel', placeholder: 'Datasett frå tittel' },		'pl': { title: 'Ulepszone wyszukiwanie', description: 'Szukaj elementów względem witryny i tytułu', placeholder: 'Elementy według linku' },		'pms': { description: 'Sërché dj\'element për sit e për tìtol', placeholder: 'Element për liura ëd sit' },		'pt': { title: 'Pesquisa aprimorada', description: 'Pesquisar itens por sítio e título', placeholder: 'Pesquisar por título' },		'pt-br': { title: 'Pesquisa aprimorada', description: 'Pesquisar itens por site e título', placeholder: 'Pesquisa por título' },		'ro': { placeholder: 'Element după titlu' },		'ru': { title: 'Улучшенный поиск', description: 'Искать элементы по сайту и заголовку', placeholder: 'Элементы по заголовку' },		'sh': { description: 'Pretražite stavke po sajtu i naslovu', placeholder: 'Stavka po naslovu' },		'si': { description: 'අඩවිය සහ ශීර්ෂය අනුව අයිතමයන් සඳහා සොයන්න', placeholder: 'ශීර්ෂය අනුව අයිතමය' },		'sr-ec': { description: 'Претрага ставки према сајту и називу', placeholder: 'Ставке према везама до сајтова' },		'sv': { title: 'Förbättrad sökning', description: 'Sök efter objekt efter webbplats och titel', placeholder: 'Objekt efter webbplatslänk' },		'ta': { placeholder: 'தலைப்பு வாரியாக உருப்படி' },		'tl': { description: 'Maghanap ng mga bagay na naaayon sa pook at pamagat', placeholder: 'Bagay ayon sa pamagat' },		'uk': { description: 'Шукати елементи за сайтом і назвою', placeholder: 'Елементи за назвою' },		'vi': { description: 'Tìm khoản mục theo site và tiêu đề', placeholder: 'Khoản mục theo liên kết site' },		'zh-hans': { description: '按站点和标题搜索', placeholder: '按标题查找项目' },		'zh-hant': { description: '按維基項目及標題搜尋', placeholder: '按標題查找項目' }	};

if ( $( 'body' ).hasClass( 'rtl' ) ) { i18nData.en.dir = 'rtl'; i18nData.en.left = 'right'; i18nData.en.right = 'left'; } else { i18nData.en.dir = 'ltr'; i18nData.en.left = 'left'; i18nData.en.right = 'right'; }

var i18nLang = mw.config.get( 'wgUserLanguage' ); while ( i18nLang ) { if ( i18nLang in i18nData ) { break; }		i18nLang = i18nLang.substr( 0, i18nLang.lastIndexOf( '-' ) ); }	if ( !i18nLang ) { i18nLang = 'en'; }

/**	 * Returns the localized version of a message. */	function i18n( key ) { if ( i18nData[ i18nLang ].hasOwnProperty( key ) ) { return i18nData[ i18nLang ][ key ]; }		return i18nData.en[ key ]; }

/**	 * Get the miraheze site from a database id. *	 * @param {String} database id	 * @return wikibase.Site|null *	 * required modules: wikibase */	function getSiteByLang( lang ) { var langs = { // workaround for T59706 // source: https://noc.wikimedia.org/conf/InitialiseSettings.php.txt 'en': wb.sites.getSite( 'gratispaideiawiki' ), 'es': wb.sites.getSite( 'benpediawiki' ) };		var sites = wb.sites.getSitesOfGroup( 'miraheze' ); $.each( sites, function ( index, site ) {			// ignore 'simplewiki' to get the mapping from 'en' to 'enwiki'			if ( site.getId === 'simplewiki' ) {				// continue				return;			}			langs[site.getLanguageCode] = site;		} );

while ( lang ) { if ( langs.hasOwnProperty( lang ) ) { return langs[lang]; }			// substr ignores a possible negative -1 from indexOf, // and will return empty string in that case. lang = lang.substr( 0, lang.lastIndexOf( '-' ) ); }		return null; }

var site = getSiteByLang( mw.config.get( 'wgUserLanguage' ) ); if ( !site ) { // no site found. unknown language. return; }

function toggle { $( '#improvedsearch' ).toggle( 'fast' ); $( '.improvedsearch-page' ).focus; }

function getSuggestions( search ) { $( '.suggestions' ).eq( 1 ).remove; if ( $( '.improvedsearch-page' ).val === '' ) { $( '.suggestions' ).eq( 0 ).hide; return; }		// Optimization: Avoid $.ajax or 'jsonp' which involve uncacheable // API requests with callbacks and cross-site JavaScript execution. // Prefer mw.ForeignApi, which makes a pure JSON CORS request, and sets // the correct 'origin=' parameter automatically. var api = new mw.ForeignApi( site.getApi ); api.get( {				formatversion: 2,				action: 'opensearch',				search: search		} ) .then( function ( data ) {			$( '.suggestions:eq(0) .suggestions-results' ).html( '' );			$( '.suggestions:eq(0) a.mw-searchSuggest-link' )				.attr( 'href', mw.config.get( 'wgScript' ) + '?title=Special%3AItemByTitle&site=' + site.getId + '&page=' + mw.util.wikiUrlencode( data[0] ) )				.find( '.special-query > span' )				.text( data[0] );			$( '.suggestions:eq(0) a.mw-searchSuggest-link' )				.find( '.special-label > span' )				.text( i18n( 'placeholder' ) + '...' );			$( '.suggestions:eq(0) a.mw-searchSuggest-link' )				.find( '.suggestions-special' )				.hover( function { $( this ).addClass( 'suggestions-result-current' ); }, function { $( this ).removeClass( 'suggestions-result-current' ); } );

for ( var i in data[1] ) { $( '.suggestions:eq(0) .suggestions-results' ).append(					getSuggestionLink( data[1][i], data[0].length, i )				); }

var style = { 'font-size': '13px', width: '226px', top: '109px', bottom: 'auto', height: 'auto' };			style[i18n( 'right' )] = '29px'; style[i18n( 'left' )] = 'auto';

$( '.suggestions' ) .eq( 0 ) .css( style ) .show; } );	}

function getSuggestionLink( page, length, index ) { return $( '' ) .attr( {			href: mw.config.get( 'wgScript' ) + '?title=Special%3AItemByTitle&site=' + site.getId + '&page=' + mw.util.wikiUrlencode( page ),			'class': 'mw-searchSuggest-link'		} ) .append(			$( ' ' )			.attr( { 'class': 'suggestions-result', rel: index, title: page } )			.hover( function { $( this ).addClass( 'suggestions-result-current' ); $( '.improvedsearch-page' ).val( page ); }, function { $( this ).removeClass( 'suggestions-result-current' ); } )			.append( $( ' ' )				.css( 'white-space', 'nowrap' ) .append(					$( ' ' )					.attr( 'class', 'highlight' )					.text( page.substr( 0, length ) )				) .append( page.substr( length ) ) )		);	}

function init { var $improvedSearch = $( ' ' ) .attr( {			id: 'improvedsearch',			action: mw.config.get( 'wgScript' )		} ) .append(			$( ' ' )			.attr( 'id', 'simpleSearch' ) // This is a hack.			.append( $( ' ' )				.attr( {					type: 'hidden',					name: 'title',					value: 'Special:ItemByTitle'				} ) )			.append( $( ' ' )				.attr( {					type: 'hidden',					name: 'site',					value: site.getId				} ) )			.append( $( ' ' )				.attr( {					id: 'searchInput', // This is a hack.					'class': 'improvedsearch-page',					type: 'text',					accesskey: 'g',					title: i18n( 'title' ),					name: 'page',					autocomplete: 'off',					placeholder: i18n( 'placeholder' )				} ) .updateTooltipAccessKeys )			.append( $( ' ' )				.attr( {					id: 'searchButton', // This is a hack.					'class': 'searchButton',					type: 'submit',					title: i18n( 'description' ),					value: i18n( 'title' )				} ) )		);			var isVectorSkin = mw.config.get( "skin" ) === "vector" || mw.config.get( "skin" ) === "vector-2022" ; if ( isVectorSkin  ) { $( '#p-search' ).append( $improvedSearch ); $( '#improvedsearch' ).hide( 0 ); var oldVal; $( '.improvedsearch-page' ) .off( 'keyup' ) .off( 'keydown' ) .off( 'keypress' ) .on( 'keyup', function {				if ( oldVal != $( '.improvedsearch-page' ).val ) {					getSuggestions( $( '.improvedsearch-page' ).val );					oldVal = $( '.improvedsearch-page' ).val;				}			} ) .on( 'focusout', function {				if ( $( '.suggestions-result-current' ).length === 0 ) {					$( '.suggestions' ).eq( 0 ).hide;				}			} ); var toggleCss = { cursor: 'pointer', width: '20px', height: '20px', 'margin-top': '-24px', 'background-image': 'url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjIyIiBoZWlnaHQ9IjE2Ij48cGF0aCBkPSJNMTUuNTAyIDYuMDAxbC01IDUuMDAxLTUtNS4wMDF6IiBmaWxsPSIjNzk3OTc5Ii8+PC9zdmc+")', 'background-position': 'center', 'background-repeat': 'no-repeat', };			toggleCss['margin-' + i18n( 'left' )] = 'calc(20vw + 8px)';

$( '#searchform' ).after(				$( ' ' )				.attr( { id: 'improvedsearch-toggle', 'class': 'vectorMenu', title: i18n( 'title' ) } )				.css( toggleCss )				.on( 'click', toggle )			); } else if ( $( '#searchBody' ).length ) { $( '#searchBody' ).append( ' ', $improvedSearch ); }	}

$( init ); } ); //