پرش به محتوا

مدیاویکی:Common.js

از ویکی داد
نسخهٔ تاریخ ۲۴ سپتامبر ۲۰۲۶، ساعت ۰۳:۳۶ توسط Rasool (بحث | مشارکت‌ها)

نکته: پس از انتشار ممکن است برای دیدن تغییرات نیاز باشد که حافظهٔ نهانی مرورگر خود را پاک کنید.

  • فایرفاکس / سافاری: کلید Shift را نگه دارید و روی دکمهٔ Reload کلیک کنید، یا کلید‌های Ctrl-F5 یا Ctrl-R را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های ⌘-R)
  • گوگل کروم: کلیدهای Ctrl+Shift+R را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های ⌘-Shift-R)
  • Edge: کلید Ctrl را نگه‌دارید و روی دکمهٔ Refresh کلیک کنید، یا کلید‌های Ctrl-F5 را با هم فشار دهید
(function () {

    /* =========================================================
       سیستم تست‌های تعاملی ویکی‌داد
       نسخه مرکزی — هماهنگ با Master ماده ۱۵
       ========================================================= */

    'use strict';


    /* =========================================================
       ابزارهای کمکی
       ========================================================= */

    function getTestOptions(test) {

        return test.find('.wd-test-option').filter(function () {

            return $(this).closest('.wd-test')[0] === test[0];

        });

    }


    function getTestResult(test) {

        return test.find('.wd-test-result').filter(function () {

            return $(this).closest('.wd-test')[0] === test[0];

        }).first();

    }


    function getTestAnswer(test) {

        return test.find('.wd-test-answer').filter(function () {

            return $(this).closest('.wd-test')[0] === test[0];

        }).first();

    }


    function normalizeAnswer(value) {

        value = $.trim(value || '');

        /*
         * پاسخ می‌تواند مستقیماً «الف» باشد
         * یا در بعضی شرایط با فاصله/نشانه همراه باشد.
         */
        var match = value.match(
            /^(الف|ب|ج|د|ه|هـ|و)/
        );

        if (match) {
            return match[1];
        }

        return value.charAt(0);

    }


    /* =========================================================
       آماده‌سازی تست‌ها
       ========================================================= */

    function initWikidadTests() {

        $('.wd-test').each(function () {

            var test = $(this);

            if (test.hasClass('wd-test-ready')) {
                return;
            }

            test.addClass('wd-test-ready');


            var options = getTestOptions(test);


            /*
             * اگر تست قبلاً پاسخ داده شده باشد،
             * وضعیت را حفظ می‌کنیم.
             */
            if (test.hasClass('wd-test-finished')) {

                options.prop('disabled', true);

                return;

            }


            /*
             * طراحی پایه گزینه‌ها
             *
             * رنگ‌ها مطابق طراحی ماده ۱۵
             */
            options.css({

                'display': 'block',
                'width': '100%',
                'box-sizing': 'border-box',
                'padding': '10px 13px',
                'margin': '7px 0',
                'border': '1px solid #d9dfdc',
                'border-radius': '6px',
                'background': '#ffffff',
                'color': '#455a64',
                'cursor': 'pointer',
                'font-family': 'inherit',
                'font-size': '13.5px',
                'line-height': '1.9',
                'text-align': 'right',
                'direction': 'rtl',
                'transition':
                    'background .15s ease, border-color .15s ease, color .15s ease, box-shadow .15s ease'

            });


            /*
             * نتیجه در شروع مخفی باشد.
             */
            var result = getTestResult(test);

            result.css({

                'display': 'none',
                'visibility': 'hidden',
                'opacity': '0'

            });


            /*
             * پاسخ و تحلیل در شروع مخفی باشد.
             */
            var answer = getTestAnswer(test);

            answer.css({

                'display': 'none',
                'visibility': 'hidden',
                'opacity': '0'

            });

        });

    }


    /* =========================================================
       اجرای آماده‌سازی
       ========================================================= */

    $(document).ready(function () {

        initWikidadTests();

    });


    /* =========================================================
       افکت ساده هنگام قرار گرفتن موس روی گزینه
       ========================================================= */

    $(document).on(
        'mouseenter',
        '.wd-test:not(.wd-test-finished) .wd-test-option',
        function () {

            var option = $(this);

            if (option.prop('disabled')) {
                return;
            }

            option.css({

                'background': '#faf8fc',
                'border-color': '#cfc4d9',
                'box-shadow': '0 1px 3px rgba(80,60,90,.06)'

            });

        }
    );


    $(document).on(
        'mouseleave',
        '.wd-test:not(.wd-test-finished) .wd-test-option',
        function () {

            var option = $(this);

            if (option.prop('disabled')) {
                return;
            }

            option.css({

                'background': '#ffffff',
                'border-color': '#d9dfdc',
                'box-shadow': 'none'

            });

        }
    );


    /* =========================================================
       کلیک روی گزینه
       ========================================================= */

    $(document).on(
        'click',
        '.wd-test-option',
        function (event) {

            event.preventDefault();
            event.stopPropagation();


            var option = $(this);

            var test = option.closest('.wd-test');


            /*
             * تست معتبر نیست.
             */
            if (!test.length) {
                return;
            }


            /*
             * اگر قبلاً پاسخ داده شده،
             * دیگر امکان تغییر پاسخ وجود ندارد.
             */
            if (test.hasClass('wd-test-finished')) {
                return;
            }


            /*
             * جلوگیری از چندبار کلیک سریع
             */
            if (option.prop('disabled')) {
                return;
            }


            /*
             * گزینه‌های همین تست
             */
            var options = getTestOptions(test);


            /*
             * پاسخ صحیح از data-answer الگوی تست
             */
            var correctAnswer = normalizeAnswer(
                test.attr('data-answer') || ''
            );


            /*
             * اگر data-answer خالی بود،
             * از data-correct خود گزینه‌ها استفاده می‌کنیم.
             *
             * این fallback باعث می‌شود ساختار جدید
             * Python نیز مستقیماً قابل استفاده باشد.
             */
            if (!correctAnswer) {

                var optionContainer =
                    option.closest('.wd-test-options');

                correctAnswer = normalizeAnswer(
                    optionContainer.attr('data-correct') || ''
                );

            }


            /*
             * پاسخ انتخاب‌شده
             */
            var selectedAnswer = normalizeAnswer(
                option.attr('data-option') || ''
            );


            /*
             * اگر data-option وجود نداشت،
             * از متن گزینه استخراج شود.
             */
            if (!selectedAnswer) {

                selectedAnswer = normalizeAnswer(
                    option.text()
                );

            }


            /*
             * تعیین درست / غلط
             */
            var isCorrect =
                selectedAnswer === correctAnswer;


            /*
             * نتیجه و پاسخ همین تست
             */
            var result = getTestResult(test);

            var resultMessage =
                result.find('.wd-test-result-message').first();

            var answer = getTestAnswer(test);


            /* =================================================
               پاک کردن وضعیت قبلی گزینه‌ها
               ================================================= */

            options.css({

                'background': '#ffffff',
                'border-color': '#d9dfdc',
                'color': '#455a64',
                'font-weight': 'normal',
                'box-shadow': 'none'

            });


            /* =================================================
               مشخص کردن گزینه انتخاب‌شده
               ================================================= */

            if (isCorrect) {

                option.css({

                    'background': '#edf8f5',
                    'border-color': '#527d77',
                    'color': '#405b56',
                    'font-weight': 'bold',
                    'box-shadow': '0 1px 3px rgba(82,125,119,.10)'

                });

            }

            else {

                option.css({

                    'background': '#fff2f2',
                    'border-color': '#b44a4a',
                    'color': '#9b3838',
                    'font-weight': 'bold',
                    'box-shadow': '0 1px 3px rgba(180,74,74,.10)'

                });


                /*
                 * پاسخ صحیح را نیز پیدا و سبز می‌کنیم.
                 */
                options.each(function () {

                    var item = $(this);

                    var itemAnswer =
                        normalizeAnswer(
                            item.attr('data-option') || ''
                        );


                    if (!itemAnswer) {

                        itemAnswer =
                            normalizeAnswer(
                                item.text()
                            );

                    }


                    if (itemAnswer === correctAnswer) {

                        item.css({

                            'background': '#edf8f5',
                            'border-color': '#527d77',
                            'color': '#405b56',
                            'font-weight': 'bold',
                            'box-shadow':
                                '0 1px 3px rgba(82,125,119,.10)'

                        });

                    }

                });

            }


            /* =================================================
               نمایش پیام نتیجه
               ================================================= */

            result.css({

                'display': 'block',
                'visibility': 'visible',
                'opacity': '1',
                'padding': '10px 13px',
                'border-radius': '6px'

            });


            if (isCorrect) {

                result.css({

                    'background': '#edf8f5',
                    'border-right': '3px solid #527d77'

                });


                resultMessage
                    .text('✓ پاسخ شما صحیح است.')
                    .css({

                        'display': 'block',
                        'visibility': 'visible',
                        'opacity': '1',
                        'color': '#527d77',
                        'font-weight': 'bold'

                    });

            }

            else {

                result.css({

                    'background': '#fff5f5',
                    'border-right': '3px solid #b44a4a'

                });


                resultMessage
                    .text('✕ پاسخ شما نادرست است.')
                    .css({

                        'display': 'block',
                        'visibility': 'visible',
                        'opacity': '1',
                        'color': '#b44a4a',
                        'font-weight': 'bold'

                    });

            }


            /* =================================================
               نمایش پاسخ صحیح و تحلیل
               ================================================= */

            if (answer.length) {

                answer.css({

                    'display': 'block',
                    'visibility': 'visible',
                    'opacity': '1'

                });

            }


            /* =================================================
               قفل کردن همه گزینه‌های همین تست
               ================================================= */

            options.prop('disabled', true);

            options.css({

                'cursor': 'default'

            });


            /*
             * علامت پایان تست
             */
            test
                .addClass('wd-test-finished')
                .attr('data-answered', 'true');


            /*
             * ثبت وضعیت روی خود option container
             */
            test.find('.wd-test-options').first()
                .attr('data-answered', 'true');


        }
    );


    /* =========================================================
       مشاهده / بستن متن نسخه قانون
       ========================================================= */

    $(document).on(
        'click',
        '.wd-version-toggle',
        function () {

            var button = $(this);

            var card = button.closest(
                '.wd-version-history-card'
            );

            var text = card.find(
                '.wd-version-text'
            );

            var icon = button.find(
                '.wd-version-toggle-icon'
            );

            var label = button.find(
                '.wd-version-toggle-label'
            );


            if (text.is(':visible')) {

                text.stop(true, true)
                    .slideUp(180);

                icon.text('+');

                label.text('مشاهده متن');

            }

            else {

                text.stop(true, true)
                    .slideDown(220);

                icon.text('−');

                label.text('بستن متن');

            }

        }
    );


})();

ذ/* =========================================================
   WIKIDAD — Vector 2022 Responsive
   ========================================================= */

if ( mw.config.get( 'skin' ) === 'vector-2022' ) {

    if ( !document.querySelector( 'meta[name="viewport"]' ) ) {

        var viewport = document.createElement( 'meta' );

        viewport.name = 'viewport';

        viewport.content =
            'width=device-width, initial-scale=1';

        document.head.appendChild( viewport );
    }
}