MediaWiki:Gadget-didYouKnow.js

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

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

  • Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl-F5 или Ctrl-R (⌘-R на Mac)
  • Google Chrome: Нажмите Ctrl-Shift-R (⌘-Shift-R на Mac)
  • Internet Explorer: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl-F5
  • Opera: Перейдите в Menu → Настройки (Opera → Настройки на Mac), а затем Безопасность → Очистить историю посещений → Кэшированные изображения и файлы
(function() {
    if (mw.config.get("wgTitle") != 'Знаете ли вы/Подготовка следующего выпуска')
        return;

    var anchor = $('#dyk-start');
    if (anchor.parent().is('p'))
        anchor = anchor.parent();

    var announces = anchor.nextAll('h3').map(function(index) {
        var orders = $(this).find('.dyk-status').map(function() {
            return $(this).attr('data-sort') || -Number.MAX_VALUE;
        }).get().map(parseFloat);
        orders.push(Number.MAX_VALUE); // for those who don't have status yet

        var content = $(this).nextUntil('h3, noscript, h2');
        return {
            originalOrder: index,
            order: Math.min.apply(null, orders),
            content: $(this).add(content),
            isSelected: content.find('.dyk-check').length > 0
        };
    }).get();

    function sort(getOrder) {
        var ordered = [];
        for(var i = 0; i < announces.length; i++) {
            var announce = announces[i];
            var order = getOrder(announce);

            var found = false;
            for(var j = ordered.length - 1; j >= 0; j--) {
                var o = ordered[j];
                if (getOrder(o) <= order) {
                    found = true;
                    if (j != ordered.length) {
                        announce.content.insertAfter(ordered[j].content.last());
                    }
                    ordered.splice(j + 1, 0, announce);
                    break;
                }
            }

            if (!found) {
                if (ordered.length) {
                    announce.content.insertBefore(ordered[0].content.first());
                }
                ordered.splice(0, 0, announce);
            }
        }
    }

    var sorted = false;

    function updateButtonTitle(b) {
        b.text(!sorted ? 'Отсортировать' : 'Отсортировано');
    };

    function updateBackground() {
        announces.forEach(function(a) { 
            $(a.content).css('background-color', sorted && a.isSelected ? '#eee' : '');
        });
    }

    var button = $('<a>')
        .addClass('plainlinks mw-ui-button mw-ui-primary')
        .attr('href', '#')
        .click(function(e) {
            e.preventDefault();
            if (!sorted)
                var f = function(a) { return a.isSelected ? Number.MAX_VALUE : a.order; };
            else
                var f = function(a) { return a.originalOrder; };
            sort(f);

            sorted = !sorted;
            $(this).css('background-color', sorted ? '#136' : '');
            updateButtonTitle($(this));
            updateBackground();
        })
        .insertBefore($('#dyk-start'));
    updateButtonTitle(button);
})();