MediaWiki:Gadget-didYouKnow.js

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
JS-код ниже относится к гаджету: Гаджет проекта «Знаете ли вы» (править описание). Его использует около 1400 учётных записей.

После сохранения или недавних изменений очистите кэш браузера.

(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

        return {
            originalOrder: index,
            order: Math.min.apply(null, orders),
            anchor: this,
            isSelected: getContent(this).find('.dyk-check').length > 0
        };
    }).get();

    function getContent(h3) {
        return $(h3).add($(h3).nextUntil('h3, noscript, h2'))
    }

    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) {
                        getContent(announce.anchor).insertAfter(getContent(ordered[j].anchor).last());
                    }
                    ordered.splice(j + 1, 0, announce);
                    break;
                }
            }

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

    var sorted = false;

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

    function updateBackground() {
        announces.forEach(function(a) {
            getContent(a.anchor).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();
            var f = !sorted
                ? function(a) { return a.isSelected ? Number.MAX_VALUE : a.order; }
                : function(a) { return a.originalOrder; };
            sort(f);

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