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

편집 요약 없음
편집 요약 없음
1번째 줄: 1번째 줄:
/**
/**
  * 이 스크립트는 위키백과 전체에 적용됩니다. 고칠 때는 주의해주세요.
  * =========================================================
* [[위키백과:위키프로젝트 시스템]] 참고
  * Animated Collapse / Expand
*
  * MediaWiki:Common.js
* 스크립트를 넣을 때는 충분한 설명, 출처를 넣어주세요! 이후 관리가 어려워집니다.
  * =========================================================
  **/
 
mw.loader.using( ['mediawiki.util', 'mediawiki.notify', 'jquery.client'], function () {
/* Begin of mw.loader.using callback */
 
/**
* Map addPortletLink to mw.util
*
  * @deprecated: Use mw.util.addPortletLink instead.
*/
mw.log.deprecate(
window,
'addPortletLink',
mw.util.addPortletLink,
'Use mw.util.addPortletLink instead'
);
 
/**
  * Extract a URL parameter from the current URL
  *
  *
  * @deprecated: Use mw.util.getParamValue with proper escaping
  * 사용 예:
*/
mw.log.deprecate(
window,
'getURLParamValue',
mw.util.getParamValue,
'Use mw.util.getParamValue instead'
);
 
/**
* Test if an element has a certain class
*
* @deprecated: Use $(element).hasClass() instead.
*/
mw.log.deprecate(
window,
'hasClass',
function ( element, className ) {
return $( element ).hasClass( className );
},
'Use jQuery.hasClass() instead'
);
 
/**
* @source www.mediawiki.org/wiki/Snippets/Load_JS_and_CSS_by_URL
* @rev 5
*/
 
// CSS
var extraCSS = mw.util.getParamValue( 'withCSS' );
 
if ( extraCSS ) {
if ( extraCSS.match( /^MediaWiki:[^&<>=%#]*\.css$/ ) ) {
importStylesheet( extraCSS );
} else {
mw.notify(
'Only pages from the MediaWiki namespace are allowed.',
{
title: 'Invalid withCSS value'
}
);
}
}
 
// JS
var extraJS = mw.util.getParamValue( 'withJS' );
 
if ( extraJS ) {
if ( extraJS.match( /^MediaWiki:[^&<>=%#]*\.js$/ ) ) {
importScript( extraJS );
} else {
mw.notify(
'Only pages from the MediaWiki namespace are allowed.',
{
title: 'Invalid withJS value'
}
);
}
}
 
/**
* Import more specific scripts if necessary
*/
 
if ( mw.config.get( 'wgNamespaceNumber' ) === 6 ) {
/* file description page scripts */
importScript( 'MediaWiki:Common.js/file.js' );
}
 
/* ([[위키백과:관리자 요청/2007년 5월#스크립트 추가 요청]]) */
/** Collapsible tables *******************************************************
  *
  *
  * Description: Allows tables to be collapsed, showing only the header. See
  * <div
  *             [[:en:Wikipedia:NavFrame]].
  *     class="animated-toggle"
  * Maintainers: [[:en:User:R. Koot]]
  *     data-collapse-target="example-1"
*/
*    role="button"
 
*     tabindex="0"
var autoCollapse = 2;
* >
var collapseCaption = '숨기기';
*     <b>[ 펼치기 · 접기 ]</b>
var expandCaption = '보이기';
* </div>
 
window.collapseTable = function ( tableIndex ) {
var Button = document.getElementById(
'collapseButton' + tableIndex
);
 
var Table = document.getElementById(
'collapsibleTable' + tableIndex
);
 
if ( !Table || !Button ) {
return false;
}
 
var Rows = Table.rows;
var i;
 
if ( Button.firstChild.data === collapseCaption ) {
 
for ( i = 1; i < Rows.length; i++ ) {
Rows[ i ].style.display = 'none';
}
 
Button.firstChild.data = expandCaption;
 
} else {
 
for ( i = 1; i < Rows.length; i++ ) {
Rows[ i ].style.display =
Rows[ 0 ].style.display;
}
 
Button.firstChild.data = collapseCaption;
}
};
 
function createCollapseButtons() {
var tableIndex = 0;
var NavigationBoxes = {};
var Tables = document.getElementsByTagName( 'table' );
var i;
 
function handleButtonLink( index, e ) {
window.collapseTable( index );
e.preventDefault();
}
 
for ( i = 0; i < Tables.length; i++ ) {
 
if ( $( Tables[ i ] ).hasClass( 'collapsible' ) ) {
 
/*
* only add button and increment count
* if there is a header row to work with
*/
var HeaderRow =
Tables[ i ].getElementsByTagName( 'tr' )[ 0 ];
 
if ( !HeaderRow ) {
continue;
}
 
var Header =
HeaderRow.getElementsByTagName( 'th' )[ 0 ];
 
if ( !Header ) {
continue;
}
 
NavigationBoxes[ tableIndex ] = Tables[ i ];
 
Tables[ i ].setAttribute(
'id',
'collapsibleTable' + tableIndex
);
 
var Button =
document.createElement( 'span' );
 
var ButtonLink =
document.createElement( 'a' );
 
var ButtonText =
document.createTextNode(
collapseCaption
);
 
/*
* Styles are declared in Common.css
*/
Button.className = 'collapseButton';
 
ButtonLink.style.color =
Header.style.color;
 
ButtonLink.setAttribute(
'id',
'collapseButton' + tableIndex
);
 
ButtonLink.setAttribute(
'href',
'#'
);
 
$( ButtonLink ).on(
'click',
$.proxy(
handleButtonLink,
ButtonLink,
tableIndex
)
);
 
ButtonLink.appendChild(
ButtonText
);
 
Button.appendChild(
document.createTextNode( '[' )
);
 
Button.appendChild(
ButtonLink
);
 
Button.appendChild(
document.createTextNode( ']' )
);
 
Header.insertBefore(
Button,
Header.firstChild
);
 
tableIndex++;
}
}
 
for ( i = 0; i < tableIndex; i++ ) {
 
if (
$( NavigationBoxes[ i ] ).hasClass( 'collapsed' ) ||
(
tableIndex >= autoCollapse &&
$( NavigationBoxes[ i ] ).hasClass( 'autocollapse' )
)
) {
 
window.collapseTable( i );
 
} else if (
$( NavigationBoxes[ i ] ).hasClass( 'innercollapse' )
) {
 
var element =
NavigationBoxes[ i ];
 
while (
( element = element.parentNode )
) {
 
if (
$( element ).hasClass( 'outercollapse' )
) {
 
window.collapseTable( i );
break;
}
}
}
}
}
 
mw.hook( 'wikipage.content' ).add(
createCollapseButtons
);
 
/* ([[위키백과:관리자 요청/2007년 5월#스크립트 추가 요청]]) */
/** Dynamic Navigation Bars (experimental) **********************************
  *
  *
  * Description: See [[:en:Wikipedia:NavFrame]].
  * <div
  * Maintainers: UNMAINTAINED
  *     id="example-1"
  */
  *     class="animated-content"
 
* >
/* set up the words in your language */
*     <div class="animated-content-inner">
var NavigationBarHide =
*         내용
'[' + collapseCaption + ']';
  *     </div>
 
  * </div>
var NavigationBarShow =
'[' + expandCaption + ']';
 
/**
  * Shows and hides content and picture
  * (if available) of navigation bars
  *
  *
* Parameters:
* indexNavigationBar:
* the index of navigation bar to be toggled
  */
  */
window.toggleNavigationBar =
function ( indexNavigationBar, event ) {
var NavToggle =
document.getElementById(
'NavToggle' + indexNavigationBar
);
var NavFrame =
document.getElementById(
'NavFrame' + indexNavigationBar
);


var NavChild;


if ( !NavFrame || !NavToggle ) {
(function ($, mw) {
return false;
    'use strict';
}


/*
* if shown now
*/
if (
NavToggle.firstChild.data ===
NavigationBarHide
) {


for (
    /**
NavChild = NavFrame.firstChild;
    * -----------------------------------------------------
NavChild !== null;
    * 펼치기 초기화
NavChild = NavChild.nextSibling
    * -----------------------------------------------------
) {
    */


if (
    function initAnimatedCollapse($content) {
$( NavChild ).hasClass( 'NavContent' ) ||
$( NavChild ).hasClass( 'NavPic' )
) {


NavChild.style.display =
        $content.find('.animated-toggle').each(function () {
'none';
}
}


NavToggle.firstChild.data =
            var $toggle = $(this);
NavigationBarShow;


/*
* if hidden now
*/
} else if (
NavToggle.firstChild.data ===
NavigationBarShow
) {


for (
            /*
NavChild = NavFrame.firstChild;
            * 이미 초기화되었다면 중복 실행하지 않음
NavChild !== null;
            */
NavChild = NavChild.nextSibling
            if ($toggle.data('animatedCollapseInitialized')) {
) {
                return;
            }


if (
$( NavChild ).hasClass( 'NavContent' ) ||
$( NavChild ).hasClass( 'NavPic' )
) {


NavChild.style.display =
            /*
'block';
            * 대상 ID
}
            */
}
            var targetId = $toggle.attr('data-collapse-target');


NavToggle.firstChild.data =
NavigationBarHide;
}


event.preventDefault();
            /*
};
            * target이 없는 경우 무시
            */
            if (!targetId) {
                return;
            }


/*
* adds show/hide-button
* to navigation bars
*/
function createNavigationBarToggleButton() {
var indexNavigationBar = 0;
var NavFrame;
var NavChild;


/*
            /*
* iterate over all div-elements
            * 특수문자가 ID에 들어갈 가능성을 고려해서
*/
            * document.getElementById 사용
var divs =
            */
document.getElementsByTagName( 'div' );
            var targetElement = document.getElementById(targetId);


for (
var i = 0;
( NavFrame = divs[ i ] );
i++
) {


/*
            if (!targetElement) {
* if found a navigation bar
                return;
*/
            }
if (
$( NavFrame ).hasClass( 'NavFrame' )
) {


indexNavigationBar++;


var NavToggle =
            var $target = $(targetElement);
document.createElement( 'a' );


NavToggle.className =
'NavToggle';


NavToggle.setAttribute(
            /*
'id',
            * 초기화 완료 표시
'NavToggle' + indexNavigationBar
            */
);
            $toggle.data(
                'animatedCollapseInitialized',
                true
            );


NavToggle.setAttribute(
'href',
'#'
);


$( NavToggle ).on(
            /**
'click',
            * ---------------------------------------------
$.proxy(
            * 접근성 속성 초기화
window.toggleNavigationBar,
            * ---------------------------------------------
window,
            */
indexNavigationBar
)
);


var isCollapsed =
            if (!$toggle.attr('role')) {
$( NavFrame ).hasClass(
                $toggle.attr('role', 'button');
'collapsed'
            }
);


/**
* Check if any children are already hidden.
* This loop is here for backwards compatibility.
*/
for (
NavChild = NavFrame.firstChild;
NavChild != null &&
!isCollapsed;
NavChild = NavChild.nextSibling
) {


if (
            if (!$toggle.attr('tabindex')) {
$( NavChild ).hasClass( 'NavPic' ) ||
                $toggle.attr('tabindex', '0');
$( NavChild ).hasClass( 'NavContent' )
            }
) {


if (
NavChild.style.display ===
'none'
) {


isCollapsed = true;
            /*
}
            * aria-controls 연결
}
            */
}
            $toggle.attr(
                'aria-controls',
                targetId
            );


if ( isCollapsed ) {


for (
            /*
NavChild = NavFrame.firstChild;
            * 초기 열린 상태 확인
NavChild != null;
            *
NavChild =
            * is-open 클래스가 있으면 펼쳐진 상태로 시작
NavChild.nextSibling
            */
) {
            var isInitiallyOpen =
                $target.hasClass('is-open');


if (
$( NavChild ).hasClass( 'NavPic' ) ||
$( NavChild ).hasClass( 'NavContent' )
) {


NavChild.style.display =
            $toggle.attr(
'none';
                'aria-expanded',
}
                isInitiallyOpen ? 'true' : 'false'
}
            );
}


var NavToggleText =
document.createTextNode(
isCollapsed ?
NavigationBarShow :
NavigationBarHide
);


NavToggle.appendChild(
            $target.attr(
NavToggleText
                'aria-hidden',
);
                isInitiallyOpen ? 'false' : 'true'
            );


/*
* Find the NavHead and
* attach the toggle link
*/
for (
var j = 0;
j < NavFrame.childNodes.length;
j++
) {


if (
            /**
$( NavFrame.childNodes[ j ] )
            * ---------------------------------------------
.hasClass( 'NavHead' )
            * 열기
) {
            * ---------------------------------------------
            */


NavToggle.style.color =
            function openCollapse() {
NavFrame
.childNodes[ j ]
.style.color;


NavFrame
                $target.addClass('is-open');
.childNodes[ j ]
.appendChild(
NavToggle
);
}
}


NavFrame.setAttribute(
                $toggle.attr(
'id',
                    'aria-expanded',
'NavFrame' +
                    'true'
indexNavigationBar
                );
);
}
}
}


mw.hook( 'wikipage.content' ).add(
                $target.attr(
createNavigationBarToggleButton
                    'aria-hidden',
);
                    'false'
                );


/***** 그림 정보 틀을 자동으로 불러옴 ********
* Adds a link to subpages of current page
* from commons.wikimedia.org
* Maintainers: [[User:Yonidebest]], [[User:Dschwen]]
* [[사용자:Kwj2772]]가 수정
* JSconfig items: bool 'loadAutoInformationTemplate'
*                    (true=enabled (default), false=disabled)
* JSConfig를 사용하지 않도록 수정함.
* --[[사용자:Klutzy|Klutzy]]
********************************************/


if (
                /*
mw.config.get(
                * 필요하면 사용자 정의 이벤트도 발생
'wgCanonicalSpecialPageName'
                */
) == 'Upload'
                $target.trigger(
) {
                    'animatedcollapse:open'
                );
            }


importScript(
'MediaWiki:Upload.js'
);
}


/*
            /**
* 인터랙티브 지도.
            * ---------------------------------------------
* 영어 위키백과에서 가져옴.
            * 닫기
*/
            * ---------------------------------------------
            */


/**
            function closeCollapse() {
* WikiMiniAtlas
*
* Description:
* WikiMiniAtlas is a popup click and drag
* world map.
*
* Maintainers: [[User:Dschwen]]
*/
( function () {


var require_wikiminiatlas = false;
                $target.removeClass('is-open');
var coord_filter = /geohack/;


$( function () {
                $toggle.attr(
                    'aria-expanded',
                    'false'
                );


$( 'a.external.text' ).each(
                $target.attr(
function ( key, link ) {
                    'aria-hidden',
                    'true'
                );


if (
link.href &&
coord_filter.exec(
link.href
)
) {


require_wikiminiatlas =
                $target.trigger(
true;
                    'animatedcollapse:close'
                );
            }


return false;
}
}
);


if (
            /**
$( 'div.kmldata' ).length
            * ---------------------------------------------
) {
            * 토글
            * ---------------------------------------------
            */


require_wikiminiatlas =
            function toggleCollapse() {
true;
}


if ( require_wikiminiatlas ) {
                if ($target.hasClass('is-open')) {


mw.loader.load(
                    closeCollapse();
'//meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js&action=raw&ctype=text/javascript'
);
}
} );


}() );
                } else {


/**
                    openCollapse();
* Fix for Windows XP Unicode font rendering
*/
if (
navigator.appVersion.search(
/windows nt 5/i
) !== -1
) {


mw.util.addCSS(
                }
'.IPA {' +
            }
'font-family:' +
'"Lucida Sans Unicode",' +
'"Arial Unicode MS";' +
'} ' +


'.Unicode {' +
'font-family:' +
'"Arial Unicode MS",' +
'"Lucida Sans Unicode";' +
'} '
);
}


/**
            /**
* 편집 안내
            * ---------------------------------------------
*
            * 클릭
* 생존 인물에 대한 편집 안내.
            * ---------------------------------------------
* 영어 위키백과에서 가져옴
            */
*/
function addEditIntro( name ) {


$( '.mw-editsection, #ca-edit' )
            $toggle.on(
.find( 'a' )
                'click.animatedCollapse',
.each(
                function (event) {
function () {


this.href =
                    event.preventDefault();
$( this ).attr(
'href'
) +
'&editintro=' +
name;
}
);
}


if (
                    toggleCollapse();
mw.config.get(
                }
'wgNamespaceNumber'
            );
) === 0
) {


$( function () {


var cats =
            /**
mw.config.get(
            * ---------------------------------------------
'wgCategories'
            * 키보드
);
            *
            * Enter
            * Space
            * ---------------------------------------------
            */


if ( !cats ) {
            $toggle.on(
return;
                'keydown.animatedCollapse',
}
                function (event) {


if (
                    if (
$.inArray(
                        event.key === 'Enter' ||
'살아있는 사람',
                        event.key === ' '
cats
                    ) {
) !== -1 ||


$.inArray(
                        event.preventDefault();
'생사 불명',
cats
) !== -1
) {


addEditIntro(
                        toggleCollapse();
'틀:BLP_편집_안내'
                    }
);
                }
}
            );
} );
}


        });


/* =========================================================
    }
* 사용자 정의 펼치기 · 접기
*
* 예:
*
* id="toggleCompany"
*          ↓
* id="collapsibleCompany"
*
* 선택적으로:
* id="toggleTextCompany"
*
* 투명도 효과 없이 높이만 300ms 동안 애니메이션
* =========================================================
*/


function initializeCustomToggle( $root ) {


$root.find( '.toggleBtn' )
    /**
.addBack( '.toggleBtn' )
    * -----------------------------------------------------
.each( function () {
    * MediaWiki 페이지 최초 로드
    * -----------------------------------------------------
    */


var $toggle =
    $(function () {
$( this );


/*
        initAnimatedCollapse(
* 동일 요소 중복 초기화 방지
            $(document)
*/
        );
if (
$toggle.data(
'custom-toggle-initialized'
)
) {
return;
}


var toggleId =
    });
$toggle.attr( 'id' );


if ( !toggleId ) {
return;
}


/*
    /**
* toggleXXX
    * -----------------------------------------------------
* → collapsibleXXX
    * MediaWiki 동적 콘텐츠 대응
*/
    *
var contentId =
    * VisualEditor,
toggleId.replace(
    * AJAX,
'toggle',
    * 확장기능,
'collapsible'
    * Lua 등에서 콘텐츠가 나중에 생성돼도
);
    * 자동으로 초기화
    * -----------------------------------------------------
    */


/*
    if (
* toggleXXX
        typeof mw !== 'undefined' &&
* → toggleTextXXX
        mw.hook
*/
    ) {
var textId =
toggleId.replace(
'toggle',
'toggleText'
);


var $content =
        mw.hook('wikipage.content').add(
$( '#' + contentId );
            function ($content) {


var $text =
                initAnimatedCollapse(
$( '#' + textId );
                    $content
 
                );
if ( !$content.length ) {
return;
}
 
$toggle.data(
'custom-toggle-initialized',
true
);
 
/*
* 최초 상태는 접힘
*/
$content.hide();
 
$toggle.attr( {
'aria-expanded':
'false',
'tabindex':
$toggle.attr(
'tabindex'
) || '0'
} );
 
/*
* 펼치기/접기 실행
*/
function toggleContent() {
 
/*
* 진행 중인 애니메이션의
* 끝 상태로 강제 이동하지 않고
* 현재 상태에서 정리
*/
$content.stop(
true,
false
);
 
if (
$content.is(
':visible'
)
) {
 
/*
* 접기
*/
$toggle.attr(
'aria-expanded',
'false'
);
 
$content.slideUp(
300,
function () {
 
/*
* jQuery가 애니메이션 과정에서
* 넣은 높이 관련 스타일 정리.
*
* display:none은 slideUp이 유지.
*/
$content.css( {
height: '',
paddingTop: '',
paddingBottom: '',
marginTop: '',
marginBottom: '',
overflow: ''
} );
}
);
 
} else {
 
/*
* 펼치기
*/
$toggle.attr(
'aria-expanded',
'true'
);
 
$content.slideDown(
300,
function () {
 
/*
* 펼친 뒤에는 원래 CSS가
* 크기와 여백을 다시 결정.
*/
$content.css( {
height: '',
paddingTop: '',
paddingBottom: '',
marginTop: '',
marginBottom: '',
overflow: '',
display: ''
} );
}
);
}
 
/*
* 토글 문구가 따로 있는 경우
*/
if ( $text.length ) {
 
$text.text(
'[ 펼치기 · 접기 ]'
);
}
}
 
/*
* 마우스 클릭
*/
$toggle.on(
'click.customToggle',
function ( event ) {
 
event.preventDefault();
 
toggleContent();
}
);
 
/*
* 키보드
* Enter / Space
*/
$toggle.on(
'keydown.customToggle',
function ( event ) {
 
if (
event.key === 'Enter' ||
event.key === ' '
) {
 
event.preventDefault();
 
toggleContent();
}
}
);
} );
}
 
 
/*
* 일반 문서 최초 로딩
*/
$( function () {
 
initializeCustomToggle(
$( document )
);
} );
 
 
/*
* AJAX / VisualEditor / 동적 콘텐츠 등으로
* 문서 내용이 다시 삽입되는 경우에도 초기화
*/
mw.hook( 'wikipage.content' ).add(
function ( $content ) {


initializeCustomToggle(
            }
$content
        );
);
}
);


    }


/* End of mw.loader.using callback */
} );


/* DO NOT ADD CODE BELOW THIS LINE */
})(jQuery, mediaWiki);

2026년 8월 20일 (목) 13:51 판

/**
 * =========================================================
 * Animated Collapse / Expand
 * MediaWiki:Common.js
 * =========================================================
 *
 * 사용 예:
 *
 * <div
 *     class="animated-toggle"
 *     data-collapse-target="example-1"
 *     role="button"
 *     tabindex="0"
 * >
 *     <b>[ 펼치기 · 접기 ]</b>
 * </div>
 *
 * <div
 *     id="example-1"
 *     class="animated-content"
 * >
 *     <div class="animated-content-inner">
 *         내용
 *     </div>
 * </div>
 *
 */


(function ($, mw) {
    'use strict';


    /**
     * -----------------------------------------------------
     * 펼치기 초기화
     * -----------------------------------------------------
     */

    function initAnimatedCollapse($content) {

        $content.find('.animated-toggle').each(function () {

            var $toggle = $(this);


            /*
             * 이미 초기화되었다면 중복 실행하지 않음
             */
            if ($toggle.data('animatedCollapseInitialized')) {
                return;
            }


            /*
             * 대상 ID
             */
            var targetId = $toggle.attr('data-collapse-target');


            /*
             * target이 없는 경우 무시
             */
            if (!targetId) {
                return;
            }


            /*
             * 특수문자가 ID에 들어갈 가능성을 고려해서
             * document.getElementById 사용
             */
            var targetElement = document.getElementById(targetId);


            if (!targetElement) {
                return;
            }


            var $target = $(targetElement);


            /*
             * 초기화 완료 표시
             */
            $toggle.data(
                'animatedCollapseInitialized',
                true
            );


            /**
             * ---------------------------------------------
             * 접근성 속성 초기화
             * ---------------------------------------------
             */

            if (!$toggle.attr('role')) {
                $toggle.attr('role', 'button');
            }


            if (!$toggle.attr('tabindex')) {
                $toggle.attr('tabindex', '0');
            }


            /*
             * aria-controls 연결
             */
            $toggle.attr(
                'aria-controls',
                targetId
            );


            /*
             * 초기 열린 상태 확인
             *
             * is-open 클래스가 있으면 펼쳐진 상태로 시작
             */
            var isInitiallyOpen =
                $target.hasClass('is-open');


            $toggle.attr(
                'aria-expanded',
                isInitiallyOpen ? 'true' : 'false'
            );


            $target.attr(
                'aria-hidden',
                isInitiallyOpen ? 'false' : 'true'
            );


            /**
             * ---------------------------------------------
             * 열기
             * ---------------------------------------------
             */

            function openCollapse() {

                $target.addClass('is-open');

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

                $target.attr(
                    'aria-hidden',
                    'false'
                );


                /*
                 * 필요하면 사용자 정의 이벤트도 발생
                 */
                $target.trigger(
                    'animatedcollapse:open'
                );
            }


            /**
             * ---------------------------------------------
             * 닫기
             * ---------------------------------------------
             */

            function closeCollapse() {

                $target.removeClass('is-open');

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

                $target.attr(
                    'aria-hidden',
                    'true'
                );


                $target.trigger(
                    'animatedcollapse:close'
                );
            }


            /**
             * ---------------------------------------------
             * 토글
             * ---------------------------------------------
             */

            function toggleCollapse() {

                if ($target.hasClass('is-open')) {

                    closeCollapse();

                } else {

                    openCollapse();

                }
            }


            /**
             * ---------------------------------------------
             * 클릭
             * ---------------------------------------------
             */

            $toggle.on(
                'click.animatedCollapse',
                function (event) {

                    event.preventDefault();

                    toggleCollapse();
                }
            );


            /**
             * ---------------------------------------------
             * 키보드
             *
             * Enter
             * Space
             * ---------------------------------------------
             */

            $toggle.on(
                'keydown.animatedCollapse',
                function (event) {

                    if (
                        event.key === 'Enter' ||
                        event.key === ' '
                    ) {

                        event.preventDefault();

                        toggleCollapse();
                    }
                }
            );

        });

    }


    /**
     * -----------------------------------------------------
     * MediaWiki 페이지 최초 로드
     * -----------------------------------------------------
     */

    $(function () {

        initAnimatedCollapse(
            $(document)
        );

    });


    /**
     * -----------------------------------------------------
     * MediaWiki 동적 콘텐츠 대응
     *
     * VisualEditor,
     * AJAX,
     * 확장기능,
     * Lua 등에서 콘텐츠가 나중에 생성돼도
     * 자동으로 초기화
     * -----------------------------------------------------
     */

    if (
        typeof mw !== 'undefined' &&
        mw.hook
    ) {

        mw.hook('wikipage.content').add(
            function ($content) {

                initAnimatedCollapse(
                    $content
                );

            }
        );

    }


})(jQuery, mediaWiki);