پرش به محتوا

کاربر:WASP-Outis/temp.js

از ویکی‌پدیا، دانشنامهٔ آزاد

نسخه‌ای که می‌بینید نسخه‌ای قدیمی از صفحه است که توسط WASP-Outis (بحث | مشارکت‌ها) در تاریخ ‏۱۶ ژوئن ۲۰۲۴، ساعت ۰۷:۲۲ ویرایش شده است. این نسخه ممکن است تفاوت‌های عمده‌ای با نسخهٔ فعلی داشته باشد.

نکته: برای دیدن تغییرات، ممکن است نیاز باشد که حافظهٔ نهانی مرورگر خود را پس از انتشار پاک‌سازی کنید. گوگل کروم، فایرفاکس، مایکروسافت اج و سافاری: کلید Shift را نگه دارید و روی دکمهٔ Reload در نوار ابزار مرورگر کلیک کنید. برای آگاهی از جزئیات و نحوهٔ پاک‌سازی حافظهٔ نهانی سایر مرورگرها، صفحهٔ ویکی‌پدیا:میانگیر مرورگرتان را خالی کنید را ببینید.
// Script to Modernize [[Special:NewPages]];
// Developed by [[User:Jeeputer]] and [[User:WASP-Outis]]

$.when(mw.loader.using([
    'mediawiki.api',
    'mediawiki.util',
    'oojs-ui-core',
    'oojs-ui-widgets',
    'oojs-ui.styles.icons-editing-advanced',
    'oojs-ui.styles.icons-editing-list',
    'oojs-ui.styles.icons-accessibility',
    'oojs-ui.styles.icons-editing-citation',
    'oojs-ui.styles.icons-moderation']), $.ready)
    .then(function () {

        if (mw.config.get('wgCanonicalSpecialPageName') !== "Newpages") return;

        mw.loader.load('https://fa.wikipedia.org/w/index.php?title=User:Jeeputer/newPagesFeed.css&action=raw&ctype=text/css', 'text/css');
        var api = new mw.Api();

        // To search for "<ref>" tags in text of each article
        function checkRefs(text) {
            var out = /(class=\"reference-text|id=\"cite_note|مشارکت‌کنندگان ویکی‌پدیا)/g.test(text) ? '' : ' • فاقد منبع';
            return out;
        }
        function checkRecreate(tags)					// check if page is recreated
        {
            for (var i = 0; i < tags.length; i++) {
                var out = /ایجاد دوبارهٔ صفحهٔ حذف شده/g.test(tags[i][0].innerHTML);
                return out;
            }
        }

        var prom = 0;

        function liftWing(requirements) {
            // Check if the cookie for this revision ID exists
            const cookieName = `newpages.id-${requirements.id}`;
            const damagingScore = $.cookie(cookieName);

            if (damagingScore) {
                // If the cookie exists, use the stored DamagingScore
                processDamagingScore(parseFloat(damagingScore), requirements);
            } else {
                // If the cookie doesn't exist, fetch the data and store it in a cookie
                var inferenceUrl = "https://api.wikimedia.org/service/lw/inference/v1/models/fawiki-damaging:predict";
                let liftWingData = { "rev_id": Number(requirements.id) };

                $.ajax({
                    url: inferenceUrl,
                    type: "POST",
                    data: JSON.stringify(liftWingData),
                    contentType: "application/json",
                    success: function (inferenceData) {
                        var damagingScore = inferenceData.fawiki.scores[requirements.id].damaging.score.probability.true;
                        // Store the DamagingScore in a cookie for 3 hours
                        var date = new Date();
                        date.setTime(date.getTime() + (3 * 60 * 60 * 1000));
                        $.cookie(cookieName, damagingScore, { expires: date });
                        processDamagingScore(damagingScore, requirements);
                    }
                });
            }
        }

        function clearLiftWingCookies() {
            // Get all cookies
            const cookies = $.cookie();

            // Loop through all cookies
            for (const cookieName in cookies) {
                // Check if the cookie name starts with "newpages"
                if (cookieName.startsWith('newpages')) {
                    // Remove the cookie
                    $.removeCookie(cookieName);
                }
            }

            mw.notify('داده‌های کلوچک پیش‌بینی خرابکاری حذف شد.');
        }

        function processDamagingScore(damagingScore, requirements) {
            function isDisambiguation() {
                for (var c = 0; c < requirements.cats.length; c++) {
                    var catName = requirements.cats[c]['*'];
                    if (catName === 'صفحه‌های_ابهام‌زدایی') {
                        return true;
                    }
                }
            }

            if (!isDisambiguation()) {
                if (requirements.ref != '') {
                    damagingScore = damagingScore + 0.85;
                }
                if (requirements.patrol && !requirements.csd) {
                    damagingScore = damagingScore - 0.3;
                }
                if (requirements.tags && checkRecreate(requirements.tags) || requirements.referror) {
                    damagingScore = damagingScore + 0.3;
                }
            }

            if (damagingScore > 0.5) {
                $('#npf-ores-' + requirements.id)
                    .addClass('npf-ores-high')
                    .css('color', 'red')
                    .attr('title', 'احتمال خرابکاری زیاد (' + (damagingScore * 100).toPrecision(4) + '٪)')
                    .show();
                $('#npf-box-' + requirements.revid).attr('data-ores', "3");
            } else if (damagingScore <= 0.5 && damagingScore >= 0.11) {
                $('#npf-ores-' + requirements.id)
                    .addClass('npf-ores-average')
                    .css('color', 'orange')
                    .attr('title', 'احتمال خرابکاری متوسط (' + (damagingScore * 100).toPrecision(4) + '٪)')
                    .show();
                $('#npf-box-' + requirements.revid).attr('data-ores', "2");
            } else if (damagingScore < 0.11) {
                $('#npf-ores-' + requirements.id)
                    .addClass('npf-ores-low')
                    .css('color', 'green')
                    .attr('title', 'احتمال خرابکاری کم (' + (damagingScore * 100).toPrecision(4) + '٪)')
                    .show();
                $('#npf-box-' + requirements.revid).attr('data-ores', "1");
            }
            prom += 1;
        }

        function parsePage(ingredients) {
            return api.get({
                action: 'parse',
                oldid: ingredients.revid,
                format: 'json'
            }).done(function (data) {
                var refTest = checkRefs(data.parse.text["*"]);
                var refErrorTest = /خطای یادکرد:/g.test(data.parse.text["*"]);
                var cats = data.parse.categories;
                var liftWingRequirements = {
                    csd: false,
                    ref: refTest,
                    referror: refErrorTest,
                    patrol: !ingredients.notPatrolled,
                    id: ingredients.firstrevid,
                    tags: ingredients.tags,
                    title: ingredients.title,
                    cats: cats,
                    revid: ingredients.revid
                };
                for (var c = 0; c < cats.length; c++) {
                    var catName = cats[c]['*'];
                    if (catName === 'مقاله‌های_نامزد_حذف_سریع') {
                        var $csdElement = $('<span id="npf-csd-' + ingredients.revid + '">')
                            .attr('title', 'این صفحه نامزد حذف سریع شده است')
                            .css({
                                'display': 'none',
                                'width': '150px'
                            })
                            .addClass('npf-row-content-left npf-csd')
                            .text('نامزد حذف سریع');
                        $('div#npf-comment-' + ingredients.revid).append($csdElement);
                        liftWingRequirements.csd = true;
                        $csdElement.toggle(2000);
                    } else if (catName === 'صفحه‌های_حذف_زمان‌دار') {
                        var $prodElement = $('<span>')
                            .attr('title', 'این صفحه نامزد حذف زمان‌دار شده است')
                            .css('display', 'none')
                            .addClass('npf-row-content-left npf-csd')
                            .text('نامزد حذف زمان‌دار');
                        $('div#npf-comment-' + ingredients.revid).append($prodElement);
                        $prodElement.toggle(2000);
                    } else if (catName === 'مقاله‌های_نامزد_حذف') {
                        var afdUrl = $(data.parse.text['*']).find('a:contains("نظرخواهی مربوط به این صفحه")')[0].href;
                        var $afdElement = $('<a>')
                            .attr({
                                'title': 'این صفحه در نظرخواهی برای حذف نامزد است',
                                'href': afdUrl
                            })
                            .css('display', 'none')
                            .addClass('npf-row-content-left npf-afd')
                            .text('نظرخواهی برای حذف');
                        $('div#npf-comment-' + ingredients.revid).append($afdElement);
                        $afdElement.toggle(2000);
                    }
                }

                // Evaluate Lift Wing data
                liftWing(liftWingRequirements);

                var contentCats = cats.filter(function (cat) {
                    return typeof (cat.hidden) !== "string";
                });
                var langlinks = data.parse.langlinks || 0;
                var enLangLink = false;
                if (langlinks) {
                    for (var li = 0; li < langlinks.length; li++) {
                        if (langlinks[li].lang === 'en') {
                            // [ url, English title ]
                            enLangLink = [langlinks[li].url, langlinks[li]['*']];
                            break;
                        }
                    }
                }

                var categoriesCount = contentCats.length ? mw.language.convertNumber(contentCats.length) : 'فاقد';
                var langLinksCount = langlinks.length ? mw.language.convertNumber(langlinks.length) : 'فاقد';
                // Replace "در حال تجزیهٔ صفحه…" with categories and langlinks count
                $('#cat-iw-container-' + ingredients.revid).fadeOut(
                    1000,
                    function () {
                        $('#cat-iw-container-' + ingredients.revid).empty();
                        $('#cat-iw-container-' + ingredients.revid)
                            .attr('title', 'اطلاعات رده‌ها و میان‌ویکی‌ها')
                            .append(
                                '<span id="npf-cat-count-' + ingredients.revid + '">' + categoriesCount + ' رده</span> • ' +
                                '<span' + (langLinksCount === 'فاقد' ? ' class="npf-noIW">' : '>') + langLinksCount + ' میان‌ویکی</span>' +
                                // Append English language link if exists
                                (enLangLink
                                    ? ' (<a href="' + enLangLink[0] + '" title="' + enLangLink[1] + '">en</a>)'
                                    : ''
                                ) +
                                '<span id="npf-ref-existenz-' + ingredients.revid + '"' +
                                (refTest === '' ? '>' : ' class="npf-norefs">') + refTest + '</span>'
                            );
                        // Font color = red if we have no categories
                        if (contentCats.length < 1) $('#npf-cat-count-' + ingredients.revid).addClass('npf-nocat');

                        // add data attr for filtering
                        if (langLinksCount === 'فاقد') {
                            $('#npf-box-' + ingredients.revid).attr('data-langlinks', "0");
                        }
                        if (categoriesCount === 'فاقد') {
                            $('#npf-box-' + ingredients.revid).attr('data-categories', "0");
                        }
                        if (refTest === ' • فاقد منبع') {
                            $('#npf-box-' + ingredients.revid).attr('data-refs', "0");
                        }
                        if (ingredients.notPatrolled) {
                            $('#npf-box-' + ingredients.revid).attr('data-ispatrolled', "0"); // add data attr for filtering
                        }
                        else {
                            $('#npf-box-' + ingredients.revid).attr('data-ispatrolled', "1"); // add data attr for filtering
                        }


                        // Show updated content
                        $('#cat-iw-container-' + ingredients.revid).fadeIn(1000);
                    }
                );
                ///// EXTLINKS SPAN
                $("#npf-extlinks-" + ingredients.revid).mouseenter(function () {        			// Outlinks mouse event handler
                    handleHover("#npf-extlinks-" + ingredients.revid, data.parse.externallinks);
                });
            });
        }

        // Handle external links box
        function handleHover(spanid, extLinks) {
            var listContent,
                hasExtLinks = !!extLinks.length;
            if (hasExtLinks) {
                var links = extLinks.map(function (link) {
                    return '<a href="' + link + '" target="_blank">' + decodeURIComponent(link) + '</a>';

                });
                listContent = '<li>' + links.join('</li><li>') + '</li>';
            } else {
                listContent = '<span>این صفحه فاقد پیوند بیرونی است</span>';
            }

            var formattedText = '<ul>' + listContent + '</ul>';
            var spanpos = $(spanid).offset();

            var $box = $('<div>')
                .html(formattedText)
                .addClass('extlink-box')
                .css({
                    top: spanpos.top + $(spanid).outerHeight() - 30 + "px",
                    left: spanpos.left + "px"
                });

            $("body").append($box);
            $(spanid).add($box).mouseleave(function (event) {
                if (event.target === $box[0]) {
                    $box.remove();
                }
            });
        }

        // Utility function to create container div for each row
        function createRow(content) {
            var $row = $('<div>').addClass('npf-row').append(content);
            return $row;
        }

        function createBoxes(ingredients) {
            var htmlID = 'npf-box-' + ingredients.revid;						// Unique ID (e.g. npf-header-39298943) for each article box
            var $box = $('<div>')
                .attr('id', htmlID)
                .addClass('npf-article-box');

            if (ingredients.notPatrolled) {										// Gray background for non-patrolled pages
                $box.addClass('npf-notpatrolled')
                    .attr('title', 'مقالهٔ گشت نخورده');
                $('#npf-box-' + ingredients.revid).attr('data-ispatrolled', "0"); // add data attr for filtering
            }

            var $header = $('<div>')
                .attr('id', 'npf-header-' + ingredients.revid)
                .addClass('npf-flex-row')
                .append($('<span>')
                    .addClass('npf-row-content-right')
                    .css('display', 'inline-flex')
                    .append($('<span>')
                        .css('display', 'inline-flex')
                        .append(
                            $('<a>')
                                .attr({
                                    'href': mw.util.getUrl(ingredients.title),
                                    'title': ingredients.title
                                })
                                .addClass('npf-header-title')
                                .text(ingredients.title)
                        )
                        .append($('<span>')
                            .addClass('npf-ores-indicator')
                            .attr({
                                'id': 'npf-ores-' + ingredients.firstrevid
                            })
                            .css({
                                'display': 'none' // Adding the color yellow
                            })
                            .text('⚠')
                        )
                    )
                    .append(
                        $('<span>')
                            .addClass('npf-hist-link')
                            .append('(')
                            .append(
                                $('<a>')
                                    .attr({
                                        'href': mw.util.getUrl('Special:PageHistory/' + ingredients.title),
                                        'title': 'تاریخچهٔ صفحهٔ ' + ingredients.title
                                    })
                                    .text('تاریخچه')
                            )
                            .append(')')
                    )
                    .append($('<span>')
                        .attr('title', 'حجم صفحه')
                        .css('margin-left', '5px')
                        .text(' · ' + ingredients.bytes + ' بایت')
                    )
                    .append($('<span>')
                        .attr({
                            'title': 'پیوندهای بیرونی استفاده شده در این مقاله',
                            'id': 'npf-extlinks-' + ingredients.revid
                        })
                        .append(' · ')
                        .append($('<span>')
                            .css('border-bottom', '2px dotted Blue')
                            .text('پیوندهای بیرونی')
                        )
                    )
                )
                .append($('<span>')
                    .addClass('npf-row-content-left')
                    .append($('<a>')
                        .attr({
                            'href': mw.util.getUrl('Special:Permalink/' + ingredients.firstrevid),
                            'title': 'پیوند دائمی به نخستین نسخهٔ صفحه'
                        })
                        .text(ingredients.date)
                    )
                );

            var $details = $('<div>')
                .attr('id', 'npf-details-' + ingredients.revid)
                .addClass('npf-flex-row')
                .append($('<span>')
                    .attr('title', 'ایجاد کنندهٔ صفحه')
                    .addClass('npf-row-content-right')
                    .append($('<span>')
                        .append('ایجاد شده توسط ')
                        .append($('<a>')
                            .addClass('npf-creator' + (ingredients.newUser ? ' new' : ''))
                            .attr('href', mw.util.getUrl('کاربر:' + ingredients.creator))
                            .text(ingredients.creator)
                        )
                    )
                    .append($(ingredients.userTools))
                )
                .append($('<span>')
                    .attr({
                        'id': 'cat-iw-container-' + ingredients.revid,
                        'title': 'لطفاً صبر کنید…'
                    })
                    .addClass('npf-row-content-left')
                    .text('در حال تجزیهٔ صفحه…')
                );

            var $comment = $('<div>')
                .attr('id', 'npf-comment-' + ingredients.revid)
                .addClass('npf-flex-row')
                .append($('<span>')
                    .addClass('npf-row-content-right')
                    .attr('title', 'خلاصهٔ ویرایش در زمان ایجاد صفحه')
                    .append('خلاصهٔ ویرایش: ')
                    .append($('<span>')
                        .addClass('npf-italic')
                        .append($(ingredients.comment))
                    )
                );

            $box.append(createRow($header));
            $box.append(createRow($details));
            $box.append(createRow($comment));

            // Append tag container only if we have some tags
            if (ingredients.tags && ingredients.tags.length > 0) {
                var $tagElements = $('<span>');
                for (var t = 0; t < ingredients.tags.length; t++) {
                    $tagElements.append($(ingredients.tags[t]));
                }
                var $tags = $('<div>')
                    .attr('id', 'npf-tags-' + ingredients.revid)
                    .addClass('npf-tags-container')
                    .append($('<span>')
                        .attr('title', 'برچسب‌های نصب شده بر نخستین ویرایش')
                        .append('برچسب‌ها: ')
                        .append($tagElements)
                    );
                $box.append(createRow($tags));
            }

            $('#npf-parent-container').append($box);
            $('.mw-pager-navigation-bar').eq(1).insertAfter($box);				// Move navigation bar to its initial location
        }

        var activefilters = [];
        var allboxes = [];

        var buttons = {
            patrolled: new OO.ui.ToggleButtonWidget({
                icon: 'eye',
                label: 'گشت‌خورده',
                data: 'ispatrolled'
            }),
            unpatrolled: new OO.ui.ToggleButtonWidget({
                icon: 'eyeClosed',
                label: 'گشت‌نخورده',
                data: 'notpatrolled'
            }),
            dmgLow: new OO.ui.ToggleButtonWidget({
                icon: 'flag',
                label: 'کم',
                classes: ['npf-button-green'],
                data: 'ores-low'
            }),
            dmgAverage: new OO.ui.ToggleButtonWidget({
                icon: 'flag',
                label: 'متوسط',
                classes: ['npf-button-yellow'],
                data: 'ores-average'
            }),
            dmgHigh: new OO.ui.ToggleButtonWidget({
                icon: 'flag',
                label: 'زیاد',
                classes: ['npf-button-red'],
                data: 'ores-high'
            }),
            noCat: new OO.ui.ToggleButtonWidget({
                icon: 'listBullet',
                label: 'فاقد رده',
                data: 'nocat'
            }),
            noIW: new OO.ui.ToggleButtonWidget({
                icon: 'language',
                label: 'فاقد میان‌ویکی',
                data: 'noIW'
            }),
            noRefs: new OO.ui.ToggleButtonWidget({
                icon: 'references',
                label: 'فاقد منبع',
                data: 'norefs'
            }),
        };

        function createFiltersBox() {
            var FiltersPermanentLink = new OO.ui.ButtonWidget({
                framed: false,
                flags: [
                    'progressive'
                ],
                label: 'پیوند پایدار',
                rel: '',
                title: 'کپی پیوند پایدار با فیلترهای انتخاب شده.'
            });
            var clearLiftWingCookiesBtn = new OO.ui.ButtonWidget({
                framed: false,
                flags: [
                    'destructive'
                ],
                label: 'حذف کلوچک‌های مرورگر',
                rel: '',
                title: 'این کار کلوچک‌های مربوط به پیش‌بینی ویرایش‌های خرابکارانه را حذف میکند.'
            });

            FiltersPermanentLink.on('click', function () {
                var urlParams = new URLSearchParams(window.location.search);
                var text = "https://fa.wikipedia.org/wiki/ویژه:صفحه‌های_تازه?selectedfilters=" + activefilters + "&limit=" + urlParams.get('limit');
                navigator.clipboard.writeText(text).then(function () {
                    mw.notify('پیوند پایدار در کلیپ‌بورد کپی شد.');
                });
            });

            clearLiftWingCookiesBtn.on('click', function () {
                clearLiftWingCookies();
            });

            allboxes = [];
            $('[id^="npf-box-"]').each(function () {
                allboxes.push($(this).attr('id').match(/\d+$/)[0]);
            });

            // Get arguments from URL and apply them
            const url = new URL(window.location.href);
            const params = new URLSearchParams(url.search);
            const argvalue = params.get('selectedfilters') || "";

            Object.keys(buttons).forEach(function (key) {		// Get all revids for filtering 
                if (argvalue.includes(buttons[key].getData())) {
                    buttons[key].setValue(false);
                }
                else {
                    buttons[key].setValue(true);
                }
                buttons[key].on('change', function () {
                    applyFilter(buttons, allboxes);
                });
            });

            var firstButtonGroup = new OO.ui.ButtonGroupWidget({
                items: [
                    buttons.patrolled,
                    buttons.unpatrolled
                ]
            });
            var secondButtonGroup = new OO.ui.ButtonGroupWidget({
                items: [
                    buttons.dmgLow,
                    buttons.dmgAverage,
                    buttons.dmgHigh
                ]
            });
            var thirdButtonGroup = new OO.ui.ButtonGroupWidget({
                items: [
                    buttons.noCat,
                    buttons.noIW,
                    buttons.noRefs
                ]
            });

            var helpText = new OO.ui.MessageWidget({
                type: 'notice',
                label: 'هر کدام از گزینه‌های زیر را که غیرفعال کنید، مقاله‌های دارای معیار آن گزینه از فهرست پنهان خواهند شد.'
            });

            var $filtersBox = $('<div>')
                .attr('id', 'npf-filters-box')
                .addClass('npf-filters-box')
                .append($('<div>')
                    .addClass('npf-flex-row npf-filters-title')
                    .append($('<span>')
                        .text('گزینه‌های پالایش فهرست')
                        .append($('<img>')
                            .addClass('loading-img')
                            .attr('src', 'https://upload.wikimedia.org/wikipedia/commons/9/9d/Loading-3-box.gif')
                            .css('width', '20px')
                            .css('height', 'auto')
                            .css('margin-right', '7px')
                            .css('vertical-align', 'middle')
                        )
                    )
                    .append($('<div>')
                        .addClass('filters-permanent-link-btn')
                        .append(FiltersPermanentLink.$element)
                    )
                    .append($('<div>')
                        .addClass('clear-cookies-btn')
                        .append(clearLiftWingCookiesBtn.$element)
                    )
                )
                .append($('<div>')
                    .addClass('npf-row')
                    .css('margin-bottom', '12px')
                    .append(helpText.$element)
                )
                .append($('<div>')
                    .attr('align', 'center')
                    .css('margin-bottom', '12px')
                    .append(
                        firstButtonGroup.$element,
                        secondButtonGroup.$element,
                        thirdButtonGroup.$element
                    )
                )
                .append($('<div>')
                    .attr('align', 'left')
                    .append(
                        "<a href='https://fa.wikipedia.org/wiki/کاربر:Jeeputer/newPagesFeed' target='_blank'>مستندات</a> • ",
                        "<a href='https://fa.wikipedia.org/wiki/بحث_کاربر:Jeeputer/newPagesFeed.js' target='_blank'>پیشنهاد/بازخورد</a> • ",
                        "<a href='https://fa.wikipedia.org/wiki/ویکی‌پدیا:قهوه‌خانه/فنی' target='_blank'>گزارش اشکال</a>"
                    )
                );

            $('.mw-pager-navigation-bar:first').after($filtersBox);
        }

        function getactivefilters(buttons) {                 //Save active filters in an array
            activefilters = [];
            Object.keys(buttons).forEach(function (key) {
                if (!buttons[key].getValue()) {
                    switch (buttons[key].getData()) {
                        case 'ispatrolled':
                            activefilters.push('ispatrolled');
                            break;
                        case 'notpatrolled':
                            activefilters.push('notpatrolled');
                            break;
                        case 'ores-low':
                            activefilters.push('ores-low');
                            break;
                        case 'ores-average':
                            activefilters.push('ores-average');
                            break;
                        case 'ores-high':
                            activefilters.push('ores-high');
                            break;
                        case 'nocat':
                            activefilters.push('nocat');
                            break;
                        case 'noIW':
                            activefilters.push('noIW');
                            break;
                        case 'norefs':
                            activefilters.push('norefs');
                            break;
                        default:
                            break;
                    }
                }
            });
        }

        function applyFilter(buttons, allboxes) {
            //////// Get Active Filters : START
            getactivefilters(buttons);
            //////// Get Active Filters : END

            //////// Calculate filtered boxes : START
            var filteredBoxes = [];
            var notfilteredboxes = [];
            if (activefilters.includes('ispatrolled')) {
                $('[data-ispatrolled]').each(function () {
                    if ($(this).attr('data-ispatrolled') == 1) {
                        filteredBoxes.push($(this).attr('id').match(/\d+$/)[0]);
                    }
                });
            }
            if (activefilters.includes('notpatrolled')) {
                $('[data-ispatrolled]').each(function () {
                    if ($(this).attr('data-ispatrolled') == 0) {
                        filteredBoxes.push($(this).attr('id').match(/\d+$/)[0]);
                    }
                });
            }
            if (activefilters.includes('ores-low')) {
                $('[data-ores]').each(function () {
                    if ($(this).attr('data-ores') == 1) {
                        filteredBoxes.push($(this).attr('id').match(/\d+$/)[0]);
                    }
                });
            }
            if (activefilters.includes('ores-average')) {
                $('[data-ores]').each(function () {
                    if ($(this).attr('data-ores') == 2) {
                        filteredBoxes.push($(this).attr('id').match(/\d+$/)[0]);
                    }
                });
            }
            if (activefilters.includes('ores-high')) {
                $('[data-ores]').each(function () {
                    if ($(this).attr('data-ores') == 3) {
                        filteredBoxes.push($(this).attr('id').match(/\d+$/)[0]);
                    }
                });
            }
            if (activefilters.includes('nocat')) {
                $('[data-categories]').each(function () {
                    if ($(this).attr('data-categories') == 0) {
                        filteredBoxes.push($(this).attr('id').match(/\d+$/)[0]);
                    }
                });
            }
            if (activefilters.includes('noIW')) {
                $('[data-langlinks]').each(function () {
                    if ($(this).attr('data-langlinks') == 0) {
                        filteredBoxes.push($(this).attr('id').match(/\d+$/)[0]);
                    }
                });
            }
            if (activefilters.includes('norefs')) {
                $('[data-refs]').each(function () {
                    if ($(this).attr('data-refs') == 0) {
                        filteredBoxes.push($(this).attr('id').match(/\d+$/)[0]);
                    }
                });
            }
            var filteredBoxesUnique = [];
            $.each(filteredBoxes, function (i, el) {
                if ($.inArray(el, filteredBoxesUnique) === -1) filteredBoxesUnique.push(el);
            });

            notfilteredboxes = allboxes.filter(item => !filteredBoxesUnique.includes(item));
            //////// Calculate filtered boxes (filteredBoxesUnique) : END

            for (var i = 0; i < filteredBoxesUnique.length; i++) {
                $('#npf-box-' + filteredBoxesUnique[i]).slideUp('slow', 'swing');
            }
            for (var i = 0; i < notfilteredboxes.length; i++) {
                $('#npf-box-' + notfilteredboxes[i]).slideDown('slow', 'swing');
            }

        }

        var listItems = $('#mw-content-text > section.mw-pager-body > ul > li'),
            boxIngredients = [], // Will be populated by information from list items without any API calls
            i;
        for (i = 0; i < listItems.length; i++) {
            var hasTags = $(listItems[i])[0].children[9];						// ...children[8] is always for edit tags
            boxIngredients[i] = {
                notPatrolled: !!$(listItems[i]).hasClass('not-patrolled'),
                title: $(listItems[i])[0].children[1].title,
                url: $(listItems[i])[0].children[1].href,
                date: $(listItems[i])[0].children[1].innerText,
                revid: $($(listItems[i])[0]).attr('data-mw-revid'),				// Latest revision's ID is available as "data-mw-revid" attribute for each list item
                firstrevid: $(listItems[i])[0].children[1].href.match(/\oldid\=(\d*)/)[1], // First revision's ID
                bytes: ($(listItems[i])[0].children[5].innerText).replace(/\[(.*) بایت\]/, '$1'),
                creator: $(listItems[i])[0].children[6].innerText,
                userTools: $(listItems[i])[0].children[7],
                comment: ($(listItems[i])[0].children[8])
            };
            if (hasTags) { // We have some tags
                boxIngredients[i].tags = [];
                for (var ei = 0; ei < $(listItems[i])[0].children[9].children.length; ei++) {
                    var $element = $($(listItems[i])[0].children[9].children[ei]);
                    if ($element.hasClass('mw-tag-marker')) {					// Prevent pushing "برچسب‌ها" to array
                        // Store tags as jquery object so we can add
                        // them to the box with without modifications
                        boxIngredients[i].tags.push($element);
                    }
                }
            }
            if ($($(listItems[i])[0].children[6]).hasClass('new')) {
                boxIngredients[i].newUser = true;
            }
        }

        let CheckLiftwingFinishedisRunning = true;
        function CheckLiftwingFinished() {
            if (prom == boxIngredients.length) {
                applyFilter(buttons, allboxes);
                $('.loading-img').remove();
            }
            if (!CheckLiftwingFinishedisRunning) {
                clearInterval(intervalId);
            }
        }

        $('#mw-content-text section.mw-pager-body > ul').remove();
        $('#mw-content-text section.mw-pager-body').append('<div id="npf-parent-container"></div>');	            // Append main parent container
        for (i = 0; i < boxIngredients.length; i++) {
            createBoxes(boxIngredients[i]);					// Create boxes
            parsePage(boxIngredients[i]);					// Update categories and langlinks after we have the api response
        }
        createFiltersBox();
        const intervalId = setInterval(CheckLiftwingFinished, 100);
        setTimeout(() => {
            CheckLiftwingFinishedisRunning = false;
        }, 15000);

    });