MediaWiki:Gadget-common-special-search.js

Материал из Циклопедии
Перейти к навигации Перейти к поиску

Замечание: Возможно, после публикации вам придётся очистить кэш своего браузера, чтобы увидеть изменения.

  • Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl+F5 или Ctrl+R (⌘+R на Mac)
  • Google Chrome: Нажмите Ctrl+Shift+R (⌘+Shift+R на Mac)
  • Internet Explorer / Edge: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl+F5
  • Opera: Нажмите Ctrl+F5.
$(function() {
    if (mw.config.get('wgCanonicalSpecialPageName') !== 'Search') return;

    var searchInput = document.querySelector('#searchText input, #searchInput');
    if (!searchInput) return;

    var engines = {
        'Bing': 'https://www.bing.com/search?q=%s+site:cyclowiki.org',
        'DuckDuckGo': 'https://duckduckgo.com/?q=%s+site:cyclowiki.org',
        'Google': 'https://google.com/search?q=%s+site:cyclowiki.org&hl=ru',
        'Yandex': 'https://yandex.ru/yandsearch?text=%s&site=cyclowiki.org'
    };

    var $enginesContainer = $('<p>').attr('id', 'searchEngines');
    var $textNode = $('<span>').text('Искать в (');
    $enginesContainer.append($textNode);
    
    var engineNames = Object.keys(engines);
    engineNames.forEach(function(name, index) {
        var url = engines[name].replace('%s', encodeURIComponent(searchInput.value));

        var $link = $('<a>')
            .attr('href', url)
            .attr('target', '_blank')
           .attr('rel', 'noopener noreferrer')
           .text(name);

        $enginesContainer.append($link);

        if (index < engineNames.length - 1) {
            $enginesContainer.append(' | ');
        }
    });

    $enginesContainer.append(')');
    
    $('.searchresults > .mw-search-visualclear').last().after($enginesContainer);
    
    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 + '»')
                .attr('href', $searchAllLink.attr('href') + '&prefix=' + encodeURIComponent(basePage));

            $searchAllLink.after(
                $('<span>').text(' | '),
                $searchPrefix
            );
        }
    }
    
    mw.loader.using(['mediawiki.util', 'oojs-ui-core', 'oojs-ui-widgets'], function() {
        var $keywordsWrapper = $('#keywords-popup-pseudolink-wrapper');
        if (!$keywordsWrapper.length) return;
        
        $('#mw-indicator-mw-helplink a').text(function(i, text) {
            return text.replace('Справка', 'Полная справка');
        });

        mw.util.addCSS('.mw-indicators { display: flex; align-items: center; }');

        var keywordsButton = new OO.ui.PopupButtonWidget({
            label: 'Ключевые слова',
            indicator: 'down',
            flags: ['progressive'],
            icon: 'keywords',
            framed: false,
            popup: {
                $content: $('<div>').append($('#keywords-popup').children().clone()),
                padded: true,
                align: 'down',
                width: 420
            }
        });

        keywordsButton.$element.appendTo('#mw-indicator-0-keywords-popup .mw-parser-output');

        var $searchBox = $('#searchText input');
        $('.keywords-popup-keyword').each(function() {
         var $keyword = $(this);
         var keywordText = $keyword.data('keyword').replace(/ /g, ' ');
  
        $keyword
         .attr('role', 'button')
         .attr('tabindex', '0')
         .attr('title', 'Вставить ключевое слово в поле поиска')
         .css('cursor', 'pointer')
         .on('click keydown', function(e) {
           if (e.type === 'click' || e.key === ' ' || e.key === 'Enter') {
            e.preventDefault();
        $searchBox.val($searchBox.val() + keywordText).trigger('focus');
            }
         });
       });
    });
});