Utilisateur:Od1n/NamespacedSimpleSearch.js

Une page de Wikipédia, l'encyclopédie libre.
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) ;

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 = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
            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);

    });
});