MediaWiki:Gadget-advsearch.js

A Wikipédiából, a szabad enciklopédiából

Megjegyzés: közzététel után frissítened kell a böngésződ gyorsítótárát, hogy lásd a változásokat.

  • Firefox / Safari: tartsd lenyomva a Shift gombot és kattints a Frissítés gombra a címsorban, vagy használd a Ctrl–F5 vagy Ctrl–R (Macen ⌘–R) billentyűkombinációt
  • Google Chrome: használd a Ctrl–Shift–R (Macen ⌘–Shift–R) billentyűkombinációt
  • Internet Explorer / Edge: tartsd nyomva a Ctrl-t, és kattints a Frissítés gombra, vagy nyomj Ctrl–F5-öt
  • Opera: Nyomj Ctrl–F5-öt
/**
 * Recherche avancée
 * 
 * Remplace la boîte de recherche par une avec beaucoup plus de possibilités
 * (raccourcis, recherche dans toutes les langues et projets, et quelques autres sites)
 * 
 * Auteur : Seb35
 * Date de dernière révision : 10 novembre 2007
 * 
 * Documentation de la fonction Recherche avancée : voir [[:fr:Utilisateur:Seb35/Scripts]]
 * [[:fr:Catégorie:MediaWiki:Fonction Monobook en JavaScript]]
 * 
 * Source: [[:fr:MediaWiki:Gadget-AdvancedResearch.js]]
 */

////////////////////// ZONE PERSONNALISABLE //////////////////////
// Voir aussi [[:fr:Utilisateur:Seb35/Scripts]]

var adSearchProject;      // Projet par défaut - par défaut le projet courant - ex : 'wikipedia.org', 'meta.wikimedia.org'

var adSearchLang0;        // Langue de la première case - par défaut la langue du projet courant (meta : <nowiki>''</nowiki>) - ex : 'fr', 'zh-classical', false (pour désactiver)
var adSearchLang0project; // Projet pour la première case - par défaut le projet par défaut ci-dessus
var adSearchLang0name;    // Nom de la première case affiché - par défaut la langue

var adSearchLang1;        // Idem pour la deuxième case
var adSearchLang1project;
var adSearchLang1name;

var adSearchLang2;        // Idem pour la troisième case
var adSearchLang2project;
var adSearchLang2name;

var adSearchInstantTitle; // Afficher automotiquement le titre de la page quand on écrit '_' dans la recherche - par défaut activé
var adSearchSametab;      // Ouvrir dans le même onglet - par défaut désactivé
var adSearchShowtab;      // Ouvrir l'onglet supplémentaire en avant-plan - par défaut désactivé
var adSearchButtons;      // Boutons de recherche - par défaut ['l','w','g','reset','c'] - voir le tableau adresses dans le code
var adSearchDefault;      // Recherche par défaut lorsqu'on appuie sur Entrée - par défaut 'l'
var adSearchClear;        // Effacer après x secondes (x >= 0), -1 pour ne pas effacer - par défaut -1
var adSearchAdresses;     // Ajouter des adresses - voir le tableau adresses dans le code
var adSearchOpenOptions;  // Options passées lors de l'ouverture d'une fenêtre
var adSearchShortcuts;    // Remplacer les raccourcis

///////////////// FIN DE LA ZONE PERSONNALISABLE /////////////////

/*********************************/
/* Recherche avancée multilingue */
/* Auteur : Seb35                */
/*********************************/
function isset(va, dv) { if(va !== undefined) return va; else return dv; }

var server = mw.config.get( 'wgServer' );
adSearchProject = isset(adSearchProject, server.replace(/.*\/\/(?:((?:commons|incubator|meta|species|www)\.|wikimediafoundation)|\w*\.)(\w*\.org)/i, '$1$2'));

adSearchLang0 = isset(adSearchLang0, server.match(/.*\/\/(commons|incubator|meta|species|wikimediafoundation|www)/i) ? '' : server.match(/.*\/\/([a-z-]*)\./i)[1]);
adSearchLang0project = isset(adSearchLang0project, adSearchProject);
adSearchLang0name = isset(adSearchLang0name, (adSearchLang0 ? adSearchLang0 : adSearchLang0project.charAt(0)));

adSearchLang1 = isset(adSearchLang1, (adSearchLang0 != 'hu' ? 'hu' : 'en'));
adSearchLang1project = isset(adSearchLang1project, adSearchProject);
adSearchLang1name = isset(adSearchLang1name, (adSearchLang1 ? adSearchLang1 : adSearchLang1project.charAt(0)));

adSearchLang2 = isset(adSearchLang2, (adSearchLang0 != 'en' && adSearchLang0 != 'hu' ? 'en' : 'de'));
adSearchLang2project = isset(adSearchLang2project, adSearchProject);
adSearchLang2name = isset(adSearchLang2name, (adSearchLang2 ? adSearchLang2 : adSearchLang2project.charAt(0)));

adSearchInstantTitle = isset(adSearchInstantTitle, true);
adSearchSametab = isset(adSearchSametab, true);
adSearchShowtab = isset(adSearchShowtab, false);
adSearchButtons = isset(adSearchButtons, ['u', 'k', 'pi', 'g', 'gi']);
adSearchDefault = isset(adSearchDefault, 'l');
adSearchClear = isset(adSearchClear, -1);
adSearchAdresses = isset(adSearchAdresses, []);
adSearchOpenOptions = isset(adSearchOpenOptions, 'menubar=yes,location=yes,resizable=yes,scrollbars=yes,status=yes');

var adSearchCompteur, adSearchDelete, adSearchDash = 0, adSearchHistory = [], adSearchIndexH;

$(function advancedResearch_main() {
	var a = document.getElementById('p-search').getElementsByTagName('div')[0];
	var texte = '<form id="searchform" name="searchform">'
		+ '<input type="text" id="searchInput" name="searchInput" value="" ' + (adSearchInstantTitle ? 'onkeyup="replaceunder();" onmouseup="replaceunder();" ' : '') + 'onkeypress="check(false, event);" onfocus="clearTimeout(adSearchDelete);" accesskey="c" style="font-size:95%;" /><br />'
		+ '<label id="adlangall"><input type="radio" name="langselect" id="adlangalli" />mind</label>'
		+ '<label id="adlang0"><input type="radio" checked="checked" name="langselect" id="adlang0i" />' + adSearchLang0name + '</label>'
		+ '<label id="adlang1"' + (adSearchLang1 === false ? ' style="display:none;"' : '') + '><input type="radio" name="langselect" id="adlang1i" />' + adSearchLang1name + '</label>'
		+ '<label id="adlang2"' + (adSearchLang2 === false ? ' style="display:none;"' : '') + '><input type="radio" name="langselect" id="adlang2i" />' + adSearchLang2name + '</label>'
		+ (adSearchLang1 || adSearchLang2 || typeof adSearchLang1 != 'boolean' || typeof adSearchLang2 != 'boolean' ? '<br id="adbr" />' : '')
		+ '<span id="adlangother"><input type="radio" name="langselect" onfocus="if(!document.searchform.adotherlang.value) document.searchform.adotherlang.focus();" style="vertical-align:top;" />'
		+ '<input type="text" name="adotherlang" value="" size="2" maxlength="12" onkeypress="check(true, event);" onblur="if(document.searchform[5].checked && !document.searchform.adotherlang.value) document.searchform[2].checked = true;" style="font-size:95%;" /></span>'
		+ '<input type="checkbox" id="adsametab" name="mode" style="vertical-align:top;" onclick="if(document.searchform.mode.checked) document.searchform.thiswindow.style.visibility = \'hidden\'; else document.searchform.thiswindow.style.visibility = \'visible\';"' + (adSearchSametab ? ' checked="checked"' : '') + ' />'
		+ '<input type="checkbox" id="adshowtab" name="thiswindow" style="vertical-align:top;' + (adSearchSametab ? ' visibility:hidden;' : '') + '"' + (adSearchShowtab ? ' checked="checked"' : '') + ' /><br />';
	for (var i=0; i<(adSearchButtons.length); i++) {
		if (adSearchButtons[i] == 'reset')
			texte = texte + '<input type="button" id="adreset" value="r" onclick="if(document.searchform.searchInput.value) document.searchform.searchInput.value = \'\'; else { document.searchform.adotherlang.value = \'\'; document.searchform[2].checked = true; } document.searchform.searchInput.focus(); adSearchDash = 0;" style="font-size:95%;" />';
		else
			texte = texte + '<input type="'+(i==0?'submit':'button')+'" id="adbutton' + (i+1) + '" value="' + adSearchButtons[i].charAt(0) + '" onclick="go(\'' + adSearchButtons[i] + '\'); return false;" style="font-size:95%;" />';
	}
	texte += '</form>';
	a.innerHTML = texte;
});

/*************************/
/* Fonctions auxiliaires */
/* Auteur : Seb35        */
/*************************/
function check(frombarlang, e) {
	if (e.keyCode == 13) {
		if(document.searchform[5].checked && !document.searchform.adotherlang.value) document.searchform[2].checked = true;
	} else if (frombarlang && !document.searchform[5].checked && e.keyCode != 9) {
		document.searchform[5].checked = true;
	}
	if (!frombarlang && (e.keyCode == 35 || e.keyCode == 36) && adSearchHistory.length) {
		if(!document.searchform.searchInput.value && e.keyCode == 36) {
			adSearchIndexH = 0; document.searchform.searchInput.value = adSearchHistory[0];
		} else if (document.searchform.searchInput.value == adSearchHistory[adSearchIndexH] && e.keyCode == 36 && adSearchIndexH < adSearchHistory.length-1) {
			adSearchIndexH++;
			document.searchform.searchInput.value = adSearchHistory[adSearchIndexH];
		} else if (document.searchform.searchInput.value == adSearchHistory[adSearchIndexH] && e.keyCode == 35 && adSearchIndexH > 0) {
			adSearchIndexH--;
			document.searchform.searchInput.value = adSearchHistory[adSearchIndexH];
		}
	}
}

function replaceunder() {
	clearTimeout(adSearchCompteur);
	var entree = document.searchform.searchInput.value;
	document.searchform.searchInput.value = entree.replace(/__/, theTitle(false));
	if(entree.length - adSearchDash > 1) {
		document.searchform.searchInput.value = entree.replace(/_/g, ' ');
	} else if (/_/.test(entree)) {
		if(!mw.config.get('wgNamespaceNumber'))
			document.searchform.searchInput.value = entree.replace(/_/, theTitle(true));
		else
			adSearchCompteur = setTimeout("document.searchform.searchInput.value = document.searchform.searchInput.value.replace(/_/, theTitle(true)); adSearchDash = document.searchform.searchInput.value.length;", 350);
	}
	adSearchDash = entree.length;
}

function theTitle(withnamespace) {
	if (mw.config.get('wgNamespaceNumber') != -1 || mw.config.get('wgCanonicalSpecialPageName') != 'Movepage') {
		if (withnamespace)
			return mw.config.get('wgPageName').replace(/_/g, ' ');
		else
			return mw.config.get('wgTitle');
	} else {
		return document.getElementById('movepage').wpOldTitle.value;
	}
}

function storeHistory(mot) {
	for (var i=0;i<adSearchHistory.length;i++) {
		if (mot == adSearchHistory[i]) {
			for (;i>0;i--)
				adSearchHistory[i] = adSearchHistory[i-1];
			adSearchHistory[0] = mot;
			return;
		}
	}
	var max = (adSearchHistory.length < 4 ? adSearchHistory.length : 4);
	for(var i=max;i>0;i--)
		adSearchHistory[i] = adSearchHistory[i-1];
	adSearchHistory[0] = mot;
}

function go(motor) {
	var raccourcis = [
		/^sp:(.*)/i,       'Special:$1',                    'Speciális:$1',
		/^v:(.*)/i,        'Talk:$1',                       'Vita:$1',
		/^kv(?:at)?:(.*)/i,'Category talk:$1',              'Kategóriavita:$1',
		/^kepv:(.*)/i,       'Image talk:$1',                 'Képvita:$1',
		/^sv:(.*)/i,       'Template talk:$1',              'Sablonvita:$1',
		/^mv:(.*)/i,      'MediaWiki talk:$1',             'MediaWiki-vita:$1',
		/^pv:(.*)/i,       'Portal talk:$1',                'Portál vita:$1',
		/^uv:(.*)/i,       'User talk:$1',                  'Szerkesztővita:$1',
		/^wv:(.*)/i,       'Project talk:$1',               'Wikipédia-vita:$1',
		/^k(?:at)?:(.*)/i, 'Category:$1',                   'Kategória:$1',
		/^kep:(.*)/i,        'Image:$1',                      'Kép:$1',
		/^s:(.*)/i,        'Template:$1',                   'Sablon:$1',
		/^mw:(.*)/i,       'MediaWiki:$1',                  'MediaWiki:$1',
		/^p:(.*)/i,        'Portal:$1',                     'Portál:$1',
		/^u:(.*)/i,        'User:$1',                       'Szerkesztő:$1',
		/^w:(.*)/i,        'Project:$1',                    'Wikipédia:$1',
		/(.*)--$/i,        'Special:Recentchangeslinked/$1','Special:Recentchangeslinked/$1',
		/(.*)-$/i,         'Special:Whatlinkshere/$1',      'Special:Whatlinkshere/$1',
		/(.*)\/c$/i,       'Special:Contributions/$1',      'Special:Contributions/$1',
		/(.*)\/u$/i,       'Special:Undelete/$1',           'Special:Undelete/$1',
		/(.*)\/(css|js)$/i,'User:$1/monobook.$2',           'Szerkesztő:$1/monobook.$2'
	];

	//Serveurs Wikimedia
	var serveurs = [
		/^(?:c|commons)$/i,     '',   'commons.wikimedia.org',
		/^(?:f|fou?ndation)$/i, '',   'wikimediafoundation.org',
		/^(?:i|incubator)$/i,   '',   'incubator.wikimedia.org',
		/^(?:m|meta)$/i,        '',   'meta.wikimedia.org',
		/^(?:mw|mediawiki)$/i,  '',   'www.mediawiki.org',
		/^(?:s|species)$/i,     '',   'species.wikipedia.org',
		/^(?:wz|wiktionaryz|ow|omegawiki)$/i, '', 'www.omegawiki.org',
		/^(?:t|translatewiki)$/i,     '',   'www.translatewiki.org',
		/^(.*)\.b$/i,           '$1', 'wikibooks.org',
		/^(.*)\.n$/i,           '$1', 'wikinews.org',
		/^(.*)\.q$/i,           '$1', 'wikiquote.org',
		/^(.*)\.s$/i,           '$1', 'wikisource.org',
		/^(.*)\.v$/i,           '$1', 'wikiversity.org',
		/^(.*)\.w(?:ikt)?$/i,   '$1', 'wiktionary.org',
		/^(.*)\.wp$/i,          '$1', 'wikipedia.org'
	];

	var adresses = [
		'u',   'https://*prefix*/wiki/$1',
		'k',   'https://*prefix*/wiki/Special:Search?fulltext=search&search=$1',
		'sz',   'https://*prefix*/wiki/$1?action=edit',
		'lt',   'https://*prefix*/wiki/$1?action=history',
		'ln',  'https://*prefix*/wiki/Special:Log?page=$1',
		'szn',  'https://*prefix*/wiki/Special:Log?user=$1',
		'pi',  'https://*prefix*/wiki/Special:Prefixindex/$1',
		'g',   'https://www.google.com/search?num=100&q=$1+site:*prefix*',
		'gi',   'https://www.google.com/search?num=100&q=%22$1%22',
		'gg',  'https://www.google.com/search?num=100&q=$1',
		'imdb','https://www.imdb.com/find?s=all&q=$1'
	];

	//Langue
	var urllanguage = '';
	var urlserver = adSearchProject;
	var urlmotor = '';
	var motor, i, sortie;
	if (document.searchform[2].checked) {
		urllanguage = adSearchLang0;
		urlserver = adSearchLang0project;
	} else if (document.searchform[3].checked) {
		urllanguage = adSearchLang1;
		urlserver = adSearchLang1project;
	} else if (document.searchform[4].checked) {
		urllanguage = adSearchLang2;
		urlserver = adSearchLang2project;
	} else if (document.searchform[5].checked) {
		urllanguage = document.searchform.adotherlang.value;
		if (!urllanguage) { motor = -1; urlmotor = '//www.wikimedia.org/'; }
		if (urllanguage == '639') { motor = -1; urlmotor = '//fr.wikipedia.org/wiki/Liste_des_codes_ISO_639-1'; }
		// Il y a aussi http://www.loc.gov/standards/iso639-2/php/code_list.php
		if (urllanguage == 'liste') { motor = -1; urlmotor = '/wiki/Special:SiteMatrix'; }
		for (i = 0; i<(serveurs.length)/3; i++) {
			if (serveurs[3*i].test(urllanguage)) {
				urllanguage = urllanguage.replace(serveurs[3*i], serveurs[3*i+1]);
				if (urllanguage == '*') urllanguage = '';
				urlserver = serveurs[3*i+2];
				break;
			}
		}
	}

	//Serveur
	var urlnom = document.searchform.searchInput.value;
	var adr = adSearchAdresses.concat(adresses);
	for (i = 0; i<(adr.length)/2; i++) {
		if(adr[2*i] == motor) motor = i;
		var tmp = new RegExp('^'+adr[2*i]+';(.*)', 'i');
		if (tmp.test(urlnom)) {
			urlnom = urlnom.replace(tmp, '$1');
			motor = i;
			break;
		}
	}
	if (isNaN(motor)) {
		document.searchform.searchInput.value = 'hiba a beállításokban';
		return false;
	}
	var urlprefix = urlserver;
	if (urllanguage) urlprefix = urllanguage + '.' + urlserver;
	if (!urlnom && motor != -1) { motor = -1; urlmotor = 'http://' + urlprefix; }

	// Préparation du moteur
	if(motor != -1) {
		urlmotor = adr[2*motor+1];
		urlmotor = urlmotor.replace(/\*prefix\*/gi, urlprefix);
		urlmotor = urlmotor.replace(/\*language\*/gi, urllanguage);
		urlmotor = urlmotor.replace(/\*server\*/gi, urlserver);
	}

	//Requête
	var rac = isset(adSearchShortcuts, raccourcis);
	var mots = urlnom.split('|');
	for(u = 0; u < mots.length; u++) {
		mots[u] = mots[u].replace(/^ */, '').replace(/ *$/, '');
		storeHistory(mots[u]);
		if(/^#(\/.*)?/.test(mots[u])) mots[u] = mots[u].replace(/^#(\/.*)?/, 'Special:Random$1');
		if(/^Special:Random\/Redirect$/i.test(mots[u])) mots[u] = 'Special:Randomredirect';
		for (i = 0; i<(rac.length)/3; i++) {
			if (rac[3*i].test(mots[u])) {
				if (urllanguage == 'fr')
					mots[u] = mots[u].replace(rac[3*i], rac[3*i+2]);
				else
					mots[u] = mots[u].replace(rac[3*i], rac[3*i+1]);
			}
		}
		mots[u] = mots[u].replace(/__/, theTitle(false));
		if (/_/.test(mots[u])) {
			mots[u] = mots[u].replace(/_/, theTitle(true));
			if (!/:/.test(mots[u]) && urlserver == 'wiktionary.org')
				mots[u] = mots[u].substring(0, 1).toLowerCase() + mots[u].substring(1);
		}
		if(urllanguage != 'fr') {
			for (i = 0; i<(rac.length)/3; i++) {
				tmp = new RegExp(rac[3*i+2].replace('$1', '(.*)'), 'i');
				if(tmp.test(mots[u])) mots[u] = mots[u].replace(tmp, rac[3*i+1]);
			}
		}
		if(/\/wiki\//.test(urlmotor)) {
			mots[u] = mots[u].replace(/ /g, '_');
			if(urlmotor.indexOf('wiktionary')==-1) { mots[u] = mots[u].substring(0, 1).toUpperCase() + mots[u].substring(1); }
		}

		//Préparation de l'URL
		if(motor != -1)
			sortie = urlmotor.replace(/\$1/gi, mots[u]);
		else
			sortie = urlmotor;

		//Pour le OmegaWiki
		sortie = sortie.replace(/^http\:\/\/www\.omegawiki\.org\/w(?:iki)?\/(.*)/i, 'http://www.omegawiki.org/$1');

		//Sortie
		if(document.searchform.mode.checked) {
			window.location.assign(sortie);
			break;
		} else {
			dat = new Date();
			fenetre = window.open(sortie, 'f'+u+dat.getTime(), adSearchOpenOptions);
			if(!document.searchform.thiswindow.checked) fenetre.blur();
		}
	}

	if (adSearchClear != -1) {
		if (adSearchClear == 0)
			document.searchform.searchInput.value = '';
		else
			adSearchDelete = setTimeout("document.searchform.searchInput.value = ''; adSearchDash = 0;", adSearchClear);
	}
}