미디어위키:Common.js: 두 판 사이의 차이

편집 요약 없음
편집 요약 없음
23번째 줄: 23번째 줄:


             /*
             /*
             * 동일 id가 2개 존재하므로 #id를 쓰지 않고
             * 같은 id가 중복되어 있으므로 #id selector 사용하지 않음
            * attribute selector로 모두 찾음.
             */
             */
             var $sameIds = $content.find('[id="' + targetId + '"]');
             var $sameIds = $content.find('[id="' + targetId + '"]');


             /*
             /*
             * wikitable이 들어 있는 쪽이 실제 펼쳐질 내용.
             * wikitable을 가지고 있는 요소가 실제 펼쳐지는 패널
             */
             */
             var $panel = $sameIds.filter(function () {
             var $panel = $sameIds.filter(function () {
40번째 줄: 39번째 줄:


             /*
             /*
             * 나머지 하나는 상단 버튼 wrapper.
             * 위쪽 버튼 wrapper
             */
             */
             var $topWrapper = $sameIds.not($panel).filter(function () {
             var $topWrapper = $sameIds.not($panel).filter(function () {
52번째 줄: 51번째 줄:
                 return;
                 return;
             }
             }


             /*
             /*
             * 중요:
             * 초기 상태
            * 패널을 다른 곳으로 append하지 않는다.
            *
            * DOM 원래 순서
            *
            * 남성 버튼
            * 남성 패널
            * 여성 버튼
            * 여성 패널
            *
            * 를 그대로 유지해야 다음 버튼이 아래로 밀린다.
             */
             */
            $panel
                .addClass('mw-collapsed')
                .css({
                    display: 'none',
                    overflow: ''
                });


            $panel.hide();


             /*
             /*
             * MediaWiki 기본 토글 이벤트 제거
             * =========================
            * 위쪽 버튼 → 펼치기
            * =========================
             */
             */
             $topToggle.off('click');
             $topToggle
            $panelToggle.off('click');
                .off('click.smoothSlide')
                .on('click.smoothSlide', function (e) {
 
                    e.preventDefault();
                    e.stopImmediatePropagation();
 
                    if ($panel.is(':animated') || $panel.is(':visible')) {
                        return false;
                    }
 
                    /*
                    * 위쪽 버튼은 바로 제거.
                    * 그러면 다음 버튼(여성 등)이 아래쪽으로 밀림.
                    */
                    $topWrapper.hide();




            /*
                    /*
            * ==========================
                    * 중요:
            * 위쪽 버튼 → 펼치기
                    * MediaWiki의 collapsed 상태를 먼저 제거
            * ==========================
                    */
            */
                    $panel.removeClass('mw-collapsed');
            $topToggle.on('click.smoothSlide', function (e) {
                e.preventDefault();
                e.stopImmediatePropagation();


                if ($panel.is(':visible')) {
                    return false;
                }


                /*
                    /*
                * 이번에는 visibility:hidden이 아니라
                    * display:none 상태에서 slideDown 실행
                * display:none을 사용한다.
                    */
                *
                    $panel
                * 그래야 남성 버튼이 차지하던 공간까지 없어지고
                        .stop(true, false)
                * 그 뒤의 여성 버튼이 남성 내용 아래로 이동한다.
                        .hide()
                */
                        .slideDown(250, function () {
                $topWrapper.hide();


                /*
                            /*
                * 패널은 원래 DOM 위치에서 그대로 펼침.
                            * jQuery 애니메이션 잔여 스타일 제거
                */
                            */
                $panel
                            $(this).css({
                    .stop(true, true)
                                display: '',
                    .slideDown(200, function () {
                                height: '',
                        $(this).css({
                                overflow: '',
                            height: '',
                                paddingTop: '',
                            overflow: '',
                                paddingBottom: '',
                            paddingTop: '',
                                marginTop: '',
                            paddingBottom: '',
                                marginBottom: ''
                            marginTop: '',
                            });
                            marginBottom: ''
                         });
                         });
                    });


                $topToggle.attr('aria-expanded', 'true');
                    $topToggle.attr('aria-expanded', 'true');
                $panelToggle.attr('aria-expanded', 'true');
                    $panelToggle.attr('aria-expanded', 'true');


                return false;
                    return false;
            });
                });




             /*
             /*
             * ==========================
             * =========================
             * 펼쳐진 쪽 버튼 → 접기
             * 펼쳐진 버튼 → 접기
             * ==========================
             * =========================
             */
             */
             $panelToggle.on('click.smoothSlide', function (e) {
             $panelToggle
                e.preventDefault();
                .off('click.smoothSlide')
                e.stopImmediatePropagation();
                .on('click.smoothSlide', function (e) {
 
                    e.preventDefault();
                    e.stopImmediatePropagation();


                $panel
                    if ($panel.is(':animated')) {
                    .stop(true, true)
                        return false;
                     .slideUp(200, function () {
                     }


                        /*
                        * 패널이 다 접힌 뒤
                        * 원래 상단 버튼을 다시 표시.
                        */
                        $topWrapper.show();


                         $(this).css({
                    /*
                            height: '',
                    * 접힐 때는 mw-collapsed를 아직 붙이면 안 됨.
                            overflow: '',
                    *
                            paddingTop: '',
                    * 먼저 slideUp을 끝낸 뒤 붙여야
                            paddingBottom: '',
                    * 애니메이션이 정상적으로 보임.
                            marginTop: '',
                    */
                            marginBottom: ''
                    $panel
                        .stop(true, false)
                         .slideUp(250, function () {
 
                            /*
                            * 애니메이션 완료 후 collapsed 상태 복원
                            */
                            $(this)
                                .addClass('mw-collapsed')
                                .css({
                                    display: 'none',
                                    height: '',
                                    overflow: '',
                                    paddingTop: '',
                                    paddingBottom: '',
                                    marginTop: '',
                                    marginBottom: ''
                                });
 
 
                            /*
                            * 원래 위쪽 버튼 다시 표시
                            */
                            $topWrapper.show();
                         });
                         });
                    });


                $topToggle.attr('aria-expanded', 'false');
                    $topToggle.attr('aria-expanded', 'false');
                $panelToggle.attr('aria-expanded', 'false');
                    $panelToggle.attr('aria-expanded', 'false');


                return false;
                    return false;
            });
                });


         });
         });

2026년 8월 20일 (목) 14:59 판

/* MediaWiki:Common.js */
mw.hook('wikipage.content').add(function ($content) {

    var initialized = {};

    $content.find('[class*="mw-customtoggle-"]').each(function () {
        var classList = (this.className || '').split(/\s+/);

        classList.forEach(function (cls) {
            if (cls.indexOf('mw-customtoggle-') !== 0) {
                return;
            }

            var suffix = cls.substring('mw-customtoggle-'.length);

            if (initialized[suffix]) {
                return;
            }

            initialized[suffix] = true;

            var targetId = 'mw-customcollapsible-' + suffix;

            /*
             * 같은 id가 중복되어 있으므로 #id selector 사용하지 않음
             */
            var $sameIds = $content.find('[id="' + targetId + '"]');

            /*
             * wikitable을 가지고 있는 요소가 실제 펼쳐지는 패널
             */
            var $panel = $sameIds.filter(function () {
                return $(this).find('table.wikitable').length > 0;
            }).first();

            if (!$panel.length) {
                return;
            }

            /*
             * 위쪽 버튼 wrapper
             */
            var $topWrapper = $sameIds.not($panel).filter(function () {
                return $(this).find('.' + cls).length > 0;
            }).first();

            var $topToggle = $topWrapper.find('.' + cls).first();
            var $panelToggle = $panel.find('.' + cls).first();

            if (!$topToggle.length || !$panelToggle.length) {
                return;
            }


            /*
             * 초기 상태
             */
            $panel
                .addClass('mw-collapsed')
                .css({
                    display: 'none',
                    overflow: ''
                });


            /*
             * =========================
             * 위쪽 버튼 → 펼치기
             * =========================
             */
            $topToggle
                .off('click.smoothSlide')
                .on('click.smoothSlide', function (e) {

                    e.preventDefault();
                    e.stopImmediatePropagation();

                    if ($panel.is(':animated') || $panel.is(':visible')) {
                        return false;
                    }

                    /*
                     * 위쪽 버튼은 바로 제거.
                     * 그러면 다음 버튼(여성 등)이 아래쪽으로 밀림.
                     */
                    $topWrapper.hide();


                    /*
                     * 중요:
                     * MediaWiki의 collapsed 상태를 먼저 제거
                     */
                    $panel.removeClass('mw-collapsed');


                    /*
                     * display:none 상태에서 slideDown 실행
                     */
                    $panel
                        .stop(true, false)
                        .hide()
                        .slideDown(250, function () {

                            /*
                             * jQuery 애니메이션 잔여 스타일 제거
                             */
                            $(this).css({
                                display: '',
                                height: '',
                                overflow: '',
                                paddingTop: '',
                                paddingBottom: '',
                                marginTop: '',
                                marginBottom: ''
                            });
                        });

                    $topToggle.attr('aria-expanded', 'true');
                    $panelToggle.attr('aria-expanded', 'true');

                    return false;
                });


            /*
             * =========================
             * 펼쳐진 버튼 → 접기
             * =========================
             */
            $panelToggle
                .off('click.smoothSlide')
                .on('click.smoothSlide', function (e) {

                    e.preventDefault();
                    e.stopImmediatePropagation();

                    if ($panel.is(':animated')) {
                        return false;
                    }


                    /*
                     * 접힐 때는 mw-collapsed를 아직 붙이면 안 됨.
                     *
                     * 먼저 slideUp을 끝낸 뒤 붙여야
                     * 애니메이션이 정상적으로 보임.
                     */
                    $panel
                        .stop(true, false)
                        .slideUp(250, function () {

                            /*
                             * 애니메이션 완료 후 collapsed 상태 복원
                             */
                            $(this)
                                .addClass('mw-collapsed')
                                .css({
                                    display: 'none',
                                    height: '',
                                    overflow: '',
                                    paddingTop: '',
                                    paddingBottom: '',
                                    marginTop: '',
                                    marginBottom: ''
                                });


                            /*
                             * 원래 위쪽 버튼 다시 표시
                             */
                            $topWrapper.show();
                        });

                    $topToggle.attr('aria-expanded', 'false');
                    $panelToggle.attr('aria-expanded', 'false');

                    return false;
                });

        });
    });

});