Utilisateur:Od1n/NamespacedSimpleSearch.js
Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.
Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;
Firefox (sur GNU/Linux) / Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5./*
Ajoute un sélecteur de namespace à la zone de recherche rapide
adapté à l'autocomplétion mediawiki.searchSuggest, implémentée dans [[gerrit:26428]]
/resources/src/mediawiki/mediawiki.searchSuggest.js
https://git.wikimedia.org/blob/mediawiki%2Fcore.git/HEAD/resources%2Fsrc%2Fmediawiki%2Fmediawiki.searchSuggest.js
/resources/src/jquery/jquery.suggestions.js
https://git.wikimedia.org/blob/mediawiki%2Fcore.git/HEAD/resources%2Fsrc%2Fjquery%2Fjquery.suggestions.js
TODO :
- reconnaître la saisie de namespaces canoniques (e.g. Template) ou d'aliases (e.g. Image)
- éventuellement, reconnaître la saisie d'un namespace différent de celui sélectionné
*/
mw.loader.using('mediawiki.searchSuggest', function () {
if (mw.config.get('skin') !== 'vector') { return; }
$(function ($) {
'use strict';
// see : http://fr.wikipedia.org/w/api.php?action=query&meta=siteinfo&siprop=namespaces|namespacealiases
var namespaces = {
0: '(principal)',
1: 'Discussion',
2: 'Utilisateur',
3: 'Discussion utilisateur',
4: 'Wikipédia',
5: 'Discussion Wikipédia',
6: 'Fichier',
7: 'Discussion fichier',
8: 'MediaWiki',
9: 'Discussion MediaWiki',
10: 'Modèle',
11: 'Discussion modèle',
12: 'Aide',
13: 'Discussion aide',
14: 'Catégorie',
15: 'Discussion catégorie',
100: 'Portail',
101: 'Discussion Portail',
102: 'Projet',
103: 'Discussion Projet',
104: 'Référence',
105: 'Discussion Référence',
828: 'Module',
829: 'Discussion module',
'-1': 'Spécial'
};
var selectedNamespace = 0;
var caches = {};
var context = $('#searchInput').data('suggestions-context');
function addPrefix(query) {
if (selectedNamespace !== 0) {
var prefix = namespaces[selectedNamespace] + ':';
var regexPrefix = new RegExp('^' + prefix, 'i');
if (!regexPrefix.test(query)) {
return prefix + query;
}
}
return query;
}
var originalFetch = context.config.fetch;
context.config.fetch = function () {
if (selectedNamespace !== 0) {
arguments[0] = addPrefix(arguments[0]);
}
return originalFetch.apply(this, arguments);
};
var originalHighlight = $.fn.highlightText;
$.fn.highlightText = function () {
if (selectedNamespace !== 0 && $(this).parent().hasClass('mw-searchSuggest-link')) {
arguments[0] = addPrefix(arguments[0]);
}
return originalHighlight.apply(this, arguments);
};
// pour le lien « contenant... » en bas du dropdown
var nsHidden = $('<input type="hidden" name="" value="1">').appendTo('#searchform');
var txtSelect = '<select style="border:1px solid #AAA; margin:0">'; // margin:0 pour Chrome
$.each(namespaces, function (key, value) {
var padder = ' ';
value = (key % 2 === 1 ? padder : '') + value + padder;
txtSelect += '<option value="'+key+'">' + value + '</option>';
});
txtSelect += '</select>';
$(txtSelect)
.change(function () {
caches[selectedNamespace] = context.data.cache;
selectedNamespace = parseInt(this.value, 10);
context.data.cache = caches[selectedNamespace] || {};
context.data.prevText = null;
if (selectedNamespace > 0) {
nsHidden.attr('name', 'ns'+selectedNamespace);
} else {
nsHidden.attr('name', '');
}
$('#searchInput').trigger('keypress');
})
.insertBefore('#searchform');
$('#searchform').submit(function () {
if (selectedNamespace !== 0) {
var $searchInput = $('#searchInput');
var query = addPrefix($searchInput.val());
$searchInput.attr('name', '');
$(this).append('<input type="hidden" name="search" value="'+query+'">');
}
});
/*
pour supprimer le FOUC,
ajouter dans le common.css (ajusté pour Firefox) :
#p-personal { top: 0.15em; }
div#simpleSearch { margin-top: 13px; }
*/
$('#p-personal').css('top', '0.15em');
$('#p-search').css('margin-top', '-9px');
$('#searchform').css('margin-top', '2px');
$('#simpleSearch').css('margin-top', 0);
});
});