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

리버티게임(개발), 모두가 만들어가는 자유로운 게임
둘러보기로 이동 검색으로 이동
백괴게임>BANIP
잔글 (executable 속성 추가)
백괴게임>BANIP
(pretty js)
1번째 줄: 1번째 줄:
/* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */
/* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */
/*<source lang="javascript"><nowiki>*/
/*<source lang="javascript"><nowiki>*/
/** [[틀:USERNAME]]에서 사용하는 바꿔치기 함수
/** [[틀:USERNAME]]에서 사용하는 바꿔치기 함수
  * 작성자: [[사용자:Peremen|Peremen]]
* 작성자: [[사용자:Peremen|Peremen]]
*/
*/
 
function UserNameReplace() {
function UserNameReplace() {
     if (typeof(disableUsernameReplace) != 'undefined' && disableUsernameReplace) return;
     if (typeof(disableUsernameReplace) != 'undefined' && disableUsernameReplace) return;
16번째 줄: 14번째 줄:


/** [[틀:제목]]에서 사용하는 제목 바꿔치기 함수
/** [[틀:제목]]에서 사용하는 제목 바꿔치기 함수
  * 작성자: [[사용자:Peremen|Peremen]]
* 작성자: [[사용자:Peremen|Peremen]]
  */
*/


function rewriteTitle() {
function rewriteTitle() {
     if (typeof(disableTitleRewrite) != 'undefined' && disableTitleRewrite) return;
     if (typeof(disableTitleRewrite) != 'undefined' && disableTitleRewrite) return;
     if (!document.getElementById('title-meta')) return;
     if (!document.getElementById('title-meta')) return;
     $('h1.firstHeading').each( function(i){
     $('h1.firstHeading').each(function(i) {
         $(this).html( $("#title-meta").html()).css('text-align', $("#title-align").text())
         $(this).html($("#title-meta").html()).css('text-align', $("#title-align").text())
     })
     })
}
}
29번째 줄: 27번째 줄:


/* from en: */
/* from en: */
var hasClass = (function () {
var hasClass = (function() {
     var reCache = {};
     var reCache = {};
     return function (element, className) {
     return function(element, className) {
         return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
         return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
     };
     };
}
})();
)();


/* ([[위키백과:관리자 요청/2007년 5월#스크립트 추가 요청]]) */
/* ([[위키백과:관리자 요청/2007년 5월#스크립트 추가 요청]]) */
/** Collapsible tables *********************************************************
/** Collapsible tables *********************************************************
*
*
*  Description: Allows tables to be collapsed, showing only the header. See
*  Description: Allows tables to be collapsed, showing only the header. See
*              Wikipedia:NavFrame.
*              Wikipedia:NavFrame.
*  Maintainers: User:R. Koot
*  Maintainers: User:R. Koot
*/
*/


//var autoCollapse = 2;
//var autoCollapse = 2;
49번째 줄: 46번째 줄:
//var expandCaption = "show";
//var expandCaption = "show";


function collapseTable( tableIndex ) {
function collapseTable(tableIndex) {
     var Button = document.getElementById( "collapseButton" + tableIndex );
     var Button = document.getElementById("collapseButton" + tableIndex);
     var Table = document.getElementById( "collapsibleTable" + tableIndex );
     var Table = document.getElementById("collapsibleTable" + tableIndex);


     if ( !Table || !Button ) {
     if (!Table || !Button) {
         return false;
         return false;
     }
     }


     var Rows = Table.getElementsByTagName( "tr" );
     var Rows = Table.getElementsByTagName("tr");


     if ( Button.firstChild.data == collapseCaption ) {
     if (Button.firstChild.data == collapseCaption) {
         for ( var i = 1; i < Rows.length; i++ ) {
         for (var i = 1; i < Rows.length; i++) {
             Rows[i].style.display = "none";
             Rows[i].style.display = "none";
         }
         }
         Button.firstChild.data = expandCaption;
         Button.firstChild.data = expandCaption;
     } else {
     } else {
         for ( var i = 1; i < Rows.length; i++ ) {
         for (var i = 1; i < Rows.length; i++) {
             Rows[i].style.display = Rows[0].style.display;
             Rows[i].style.display = Rows[0].style.display;
         }
         }
75번째 줄: 72번째 줄:
     var tableIndex = 0;
     var tableIndex = 0;
     var NavigationBoxes = new Object();
     var NavigationBoxes = new Object();
     var Tables = document.getElementsByTagName( "table" );
     var Tables = document.getElementsByTagName("table");


     for ( var i = 0; i < Tables.length; i++ ) {
     for (var i = 0; i < Tables.length; i++) {
         if ( hasClass( Tables[i], "collapsible" ) ) {
         if (hasClass(Tables[i], "collapsible")) {
             NavigationBoxes[ tableIndex ] = Tables[i];
             NavigationBoxes[tableIndex] = Tables[i];
             Tables[i].setAttribute( "id", "collapsibleTable" + tableIndex );
             Tables[i].setAttribute("id", "collapsibleTable" + tableIndex);


             var Button     = document.createElement( "span" );
             var Button = document.createElement("span");
             var ButtonLink = document.createElement( "a" );
             var ButtonLink = document.createElement("a");
             var ButtonText = document.createTextNode( collapseCaption );
             var ButtonText = document.createTextNode(collapseCaption);


             Button.style.styleFloat = "right";
             Button.style.styleFloat = "right";
92번째 줄: 89번째 줄:
             Button.style.width = "6em";
             Button.style.width = "6em";


             ButtonLink.setAttribute( "id", "collapseButton" + tableIndex );
             ButtonLink.setAttribute("id", "collapseButton" + tableIndex);
             ButtonLink.setAttribute( "href", "javascript:collapseTable(" + tableIndex + ");" );
             ButtonLink.setAttribute("href", "javascript:collapseTable(" + tableIndex + ");");
             ButtonLink.appendChild( ButtonText );
             ButtonLink.appendChild(ButtonText);


             Button.appendChild( document.createTextNode( "[" ) );
             Button.appendChild(document.createTextNode("["));
             Button.appendChild( ButtonLink );
             Button.appendChild(ButtonLink);
             Button.appendChild( document.createTextNode( "]" ) );
             Button.appendChild(document.createTextNode("]"));


             var Header = Tables[i].getElementsByTagName( "tr" )[0].getElementsByTagName( "th" )[0];
             var Header = Tables[i].getElementsByTagName("tr")[0].getElementsByTagName("th")[0];
             /* only add button and increment count if there is a header row to work with */
             /* only add button and increment count if there is a header row to work with */
             if (Header) {
             if (Header) {
                 Header.insertBefore( Button, Header.childNodes[0] );
                 Header.insertBefore(Button, Header.childNodes[0]);
                 tableIndex++;
                 tableIndex++;
             }
             }
109번째 줄: 106번째 줄:
     }
     }


     for ( var i = 0; i < tableIndex; i++ ) {
     for (var i = 0; i < tableIndex; i++) {
         if ( hasClass( NavigationBoxes[i], "collapsed" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], "autocollapse" ) ) ) {
         if (hasClass(NavigationBoxes[i], "collapsed") || (tableIndex >= autoCollapse && hasClass(NavigationBoxes[i], "autocollapse"))) {
             collapseTable( i );
             collapseTable(i);
         }
         }
     }
     }
}
}


$( createCollapseButtons );
$(createCollapseButtons);


/* ([[위키백과:관리자 요청/2007년 5월#스크립트 추가 요청]]) */
/* ([[위키백과:관리자 요청/2007년 5월#스크립트 추가 요청]]) */
/** Dynamic Navigation Bars (experimental) *************************************
/** Dynamic Navigation Bars (experimental) *************************************
  *
*
  *  Description: See [[:en:Wikipedia:NavFrame]].
*  Description: See [[:en:Wikipedia:NavFrame]].
  *  Maintainers: UNMAINTAINED
*  Maintainers: UNMAINTAINED
  */
*/


// set up the words in your language
// set up the words in your language
153번째 줄: 150번째 줄:
     if (NavToggle.firstChild.data == NavigationBarHide) {
     if (NavToggle.firstChild.data == NavigationBarHide) {
         for (
         for (
             var NavChild = NavFrame.firstChild;
             var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling
            NavChild != null;
            NavChild = NavChild.nextSibling
         ) {
         ) {
             if ( hasClass( NavChild, 'NavPic' ) ) {
             if (hasClass(NavChild, 'NavPic')) {
                 NavChild.style.display = 'none';
                 NavChild.style.display = 'none';
             }
             }
             if ( hasClass( NavChild, 'NavContent') ) {
             if (hasClass(NavChild, 'NavContent')) {
                 NavChild.style.display = 'none';
                 NavChild.style.display = 'none';
             }
             }
169번째 줄: 164번째 줄:
     } else if (NavToggle.firstChild.data == NavigationBarShow) {
     } else if (NavToggle.firstChild.data == NavigationBarShow) {
         for (
         for (
             var NavChild = NavFrame.firstChild;
             var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling
            NavChild != null;
            NavChild = NavChild.nextSibling
         ) {
         ) {
             if (hasClass(NavChild, 'NavPic')) {
             if (hasClass(NavChild, 'NavPic')) {
189번째 줄: 182번째 줄:
     // iterate over all < div >-elements
     // iterate over all < div >-elements
     var divs = document.getElementsByTagName("div");
     var divs = document.getElementsByTagName("div");
     for (var i=0;NavFrame = divs[i];i++) {
     for (var i = 0; NavFrame = divs[i]; i++) {
         // if found a navigation bar
         // if found a navigation bar
         if (hasClass(NavFrame, "NavFrame")) {
         if (hasClass(NavFrame, "NavFrame")) {
203번째 줄: 196번째 줄:
             // Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked)
             // Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked)
             for (
             for (
                 var j=0;
                 var j = 0; j < NavFrame.childNodes.length; j++
                j < NavFrame.childNodes.length;
                j++
             ) {
             ) {
                 if (hasClass(NavFrame.childNodes[j], "NavHead")) {
                 if (hasClass(NavFrame.childNodes[j], "NavHead")) {
217번째 줄: 208번째 줄:
     if (NavigationBarShowDefault < indexNavigationBar) {
     if (NavigationBarShowDefault < indexNavigationBar) {
         for (
         for (
             var i=1;
             var i = 1; i <= indexNavigationBar; i++
            i<=indexNavigationBar;
            i++
         ) {
         ) {
             toggleNavigationBar(i);
             toggleNavigationBar(i);
227번째 줄: 216번째 줄:
}
}


$( createNavigationBarToggleButton );
$(createNavigationBarToggleButton);


/** 대문의 탭을 "프로젝트"->"대문"으로 바꾸는 함수.
/** 대문의 탭을 "프로젝트"->"대문"으로 바꾸는 함수.
  * 작성자: [[사용자:Peremen|Peremen]]
* 작성자: [[사용자:Peremen|Peremen]]
*/
*/


function MainPageRenameNamespaceTab() {
function MainPageRenameNamespaceTab() {
  var title = mw.config.get( 'wgPageName' );
    var title = mw.config.get('wgPageName');
  var hasMainPageTab = (title == '백괴게임:대문' || title == '백괴게임토론:대문');
    var hasMainPageTab = (title == '백괴게임:대문' || title == '백괴게임토론:대문');
  if ( hasMainPageTab ){
    if (hasMainPageTab) {
    $( '#ca-nstab-project a' ).text( "대문" );
        $('#ca-nstab-project a').text("대문");
  }
    }
  var hasGameListTab = (title == '백괴게임:게임_목록' || title == '백괴게임토론:게임_목록');
    var hasGameListTab = (title == '백괴게임:게임_목록' || title == '백괴게임토론:게임_목록');
  if ( hasGameListTab ){
    if (hasGameListTab) {
    $( '#ca-nstab-project a' ).text( "게임 목록" );
        $('#ca-nstab-project a').text("게임 목록");
  }
    }
  $( '#ca-nstab-main a' ).text( "게임" );
    $('#ca-nstab-main a').text("게임");
}
}
$(MainPageRenameNamespaceTab);
$(MainPageRenameNamespaceTab);
251번째 줄: 240번째 줄:
  * 원작성자: [[:en:User:Olipro|Olipro]]
  * 원작성자: [[:en:User:Olipro|Olipro]]
  */
  */
function useFlash(){
function useFlash() {
var flashOk;
    var flashOk;
var contentTempHolder;
    var contentTempHolder;
$( embedFlashCheck );
    $(embedFlashCheck);
}
}


function embedFlashMovie( flashOk ) {
function embedFlashMovie(flashOk) {
mainbody = document.getElementById( 'bodyContent' );
    mainbody = document.getElementById('bodyContent');
mainbody.innerHTML = contentTempHolder;
    mainbody.innerHTML = contentTempHolder;
spancheck = document.getElementsByTagName( 'span' );
    spancheck = document.getElementsByTagName('span');
for( i = 0; i < spancheck.length; i++ ) {
    for (i = 0; i < spancheck.length; i++) {
if( spancheck[i].getAttribute( 'id' ) != 'embedFlashDoc' ) {
        if (spancheck[i].getAttribute('id') != 'embedFlashDoc') {
continue;
            continue;
}
        }
obj = spancheck[i].innerHTML.split( '@' );
        obj = spancheck[i].innerHTML.split('@');
flwidth = obj[0];
        flwidth = obj[0];
flheight = obj[1];
        flheight = obj[1];
flfile = obj[2].replace( 'fullurl://', 'https://' );
        flfile = obj[2].replace('fullurl://', 'https://');
showFlash = ' ';
        showFlash = ' ';
if( flashOk ) {
        if (flashOk) {
showFlash = '<object width="' + flwidth + '" height="' + flheight + '"';
            showFlash = '<object width="' + flwidth + '" height="' + flheight + '"';
showFlash += 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"';
            showFlash += 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"';
showFlash += 'codebase="http://fpdownload.macromedia.com/pub/';
            showFlash += 'codebase="http://fpdownload.macromedia.com/pub/';
showFlash += 'shockwave/cabs/flash/swflash.cab#version=8,0,0,0">';
            showFlash += 'shockwave/cabs/flash/swflash.cab#version=8,0,0,0">';
showFlash += '<param name="movie" value="' + flfile + '" />';
            showFlash += '<param name="movie" value="' + flfile + '" />';
showFlash += '<embed src="' + flfile + '" width="' + flwidth + '" height=';
            showFlash += '<embed src="' + flfile + '" width="' + flwidth + '" height=';
showFlash += '"' + flheight + '" type="application/x-shockwave-flash" ';
            showFlash += '"' + flheight + '" type="application/x-shockwave-flash" ';
showFlash += 'pluginspage="http://www.macromedia.com/go/getflashplayer" />';
            showFlash += 'pluginspage="http://www.macromedia.com/go/getflashplayer" />';
showFlash += '</object>';
            showFlash += '</object>';
} else {
        } else {
showFlash = '<a class="plainlinks" href="javascript:embedFlashMovie(true)" onClick="embedFlashMovie(true)">' + flfile + '</a> (신뢰하는 경우 보려면 클릭하십시오.)';
            showFlash = '<a class="plainlinks" href="javascript:embedFlashMovie(true)" onClick="embedFlashMovie(true)">' + flfile + '</a> (신뢰하는 경우 보려면 클릭하십시오.)';
}
        }
spancheck[i].innerHTML = showFlash;
        spancheck[i].innerHTML = showFlash;
spancheck[i].style.display = 'inline';
        spancheck[i].style.display = 'inline';
}
    }
};
};


function embedFlashCheck() {
function embedFlashCheck() {
if( !document.getElementById( 'embedFlashDoc' ) ) {
    if (!document.getElementById('embedFlashDoc')) {
return;
        return;
}
    }
mainbody = document.getElementById( 'bodyContent' );
    mainbody = document.getElementById('bodyContent');
contentTempHolder = mainbody.innerHTML;
    contentTempHolder = mainbody.innerHTML;
if( typeof displayFlashOverride != 'undefined' ) {
    if (typeof displayFlashOverride != 'undefined') {
embedFlashMovie( displayFlashOverride );
        embedFlashMovie(displayFlashOverride);
return;
        return;
}
    }
askmessage = '<div align="center" id="askflash">이 게임에는 ';
    askmessage = '<div align="center" id="askflash">이 게임에는 ';
askmessage += '<a href="/wiki/백괴:플래시" class="plainlinks">플래시</a>가 들어있습니다.<br />';
    askmessage += '<a href="/wiki/백괴:플래시" class="plainlinks">플래시</a>가 들어있습니다.<br />';
askmessage += '컴퓨터에 해를 끼칠 수 있으므로 신뢰하는 경우에만 여십시오.<br />';
    askmessage += '컴퓨터에 해를 끼칠 수 있으므로 신뢰하는 경우에만 여십시오.<br />';
askmessage += '플래시가 포함된 게임을 보시겠습니까?<br><b> ';
    askmessage += '플래시가 포함된 게임을 보시겠습니까?<br><b> ';
askmessage += '<a href="javascript:embedFlashMovie(true)" ';
    askmessage += '<a href="javascript:embedFlashMovie(true)" ';
askmessage += 'onClick="embedFlashMovie(true)">예</a> | <a ';
    askmessage += 'onClick="embedFlashMovie(true)">예</a> | <a ';
askmessage += 'href="https://game.uncyclopedia.kr/">아니오</a>';
    askmessage += 'href="https://game.uncyclopedia.kr/">아니오</a>';
mainbody.innerHTML = askmessage;
    mainbody.innerHTML = askmessage;
}
}
$( useFlash );
$(useFlash);


/* userAgent */
/* userAgent */
/** source: http://www.gregoryvarghese.com/how-to-get-browser-name-and-version-via-javascript/ **/
/** source: http://www.gregoryvarghese.com/how-to-get-browser-name-and-version-via-javascript/ **/


function get_browser_info(){
function get_browser_info() {
var ua=navigator.userAgent,tem,M=ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
    var ua = navigator.userAgent,
if(/trident/i.test(M[1])){
        tem, M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
tem=/\brv[ :]+(\d+)/g.exec(ua) || [];
    if (/trident/i.test(M[1])) {
return {name:'IE ',version:(tem[1]||'')};
        tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
}
        return {
            name: 'IE ',
            version: (tem[1] || '')
        };
    }


if(M[1]==='Chrome'){
    if (M[1] === 'Chrome') {
tem=ua.match(/\bOPR\/(\d+)/)
        tem = ua.match(/\bOPR\/(\d+)/)
if(tem!=null)   {return {name:'Opera', version:tem[1]};}
        if (tem != null) {
}
            return {
                name: 'Opera',
                version: tem[1]
            };
        }
    }


M=M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?'];
    M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];


if((tem=ua.match(/version\/(\d+)/i))!=null) {M.splice(1,1,tem[1]);}
    if ((tem = ua.match(/version\/(\d+)/i)) != null) {
        M.splice(1, 1, tem[1]);
    }


return {
    return {
name: M[0],
        name: M[0],
version: M[1]
        version: M[1]
};
    };


}
}


/** [[틀:CGI2|CGI2]]를 사용 가능하게 만드는 jquery 구문
/** [[틀:CGI2|CGI2]]를 사용 가능하게 만드는 jquery 구문
  * 작성자: [[사용자:BANIP|BANIP]]
* 작성자: [[사용자:BANIP|BANIP]]
  */
*/
function useCGI2(){
function useCGI2() {
     $(".cgilink").each(function(){
     $(".cgilink").each(function() {
         // CGI2의 page속성과 data속성을 가져옴
         // CGI2의 page속성과 data속성을 가져옴
         var pagename = $(this).data("page");
         var pagename = $(this).data("page");
         var variables = JSON.parse( $(this).data("var").replace(/\, *\]/,"]") );
         var variables = JSON.parse($(this).data("var").replace(/\, *\]/, "]"));
         // 가져온 page데이터 속성을 조합해 url인스턴스 생성
         // 가져온 page데이터 속성을 조합해 url인스턴스 생성
         var urlstr = window.location.origin + "/wiki/" + pagename + window.location.search;
         var urlstr = window.location.origin + "/wiki/" + pagename + window.location.search;
         var url = new URL(urlstr);
         var url = new URL(urlstr);
         // 가져온 var속성으로 url 인스턴스의 searchparams를 씹고 뜯고 맛보고 즐기고
         // 가져온 var속성으로 url 인스턴스의 searchparams를 씹고 뜯고 맛보고 즐기고
         variables.forEach(function(variable){
         variables.forEach(function(variable) {
             Object.entries(variable).forEach(function(actionWrap){
             Object.entries(variable).forEach(function(actionWrap) {
                 var action = actionWrap[0];
                 var action = actionWrap[0];
                 var payload = actionWrap[1];
                 var payload = actionWrap[1];
                 url.searchParams[action](payload[0],payload[1]);
                 url.searchParams[action](payload[0], payload[1]);
             })
             })
         })
         })
362번째 줄: 362번째 줄:


/**
/**
  * 모바일 모드 자동 해제
* 모바일 모드 자동 해제
  * 사용자가 모바일 환경이면 자동으로 벡터 스킨으로 전환합니다.
* 사용자가 모바일 환경이면 자동으로 벡터 스킨으로 전환합니다.
  * 이 해제하고 싶으면 var execute를 true로 바꾸면 됩니다. 실행하고 싶으면 다시 true로 되돌려 놓아 주세요.  
* 이 해제하고 싶으면 var execute를 true로 바꾸면 됩니다. 실행하고 싶으면 다시 true로 되돌려 놓아 주세요.  
  * 작성자: [[사용자:BANIP|BANIP]]
* 작성자: [[사용자:BANIP|BANIP]]
  */
*/
function offMobileEnviroment(){
function offMobileEnviroment() {
  var execute = true;
    var execute = true;


  if(!execute) return;
    if (!execute) return;
  $("#mw-mf-display-toggle").each(function(){
    $("#mw-mf-display-toggle").each(function() {
      location.search += "&mobileaction=toggle_view_desktop"
        location.search += "&mobileaction=toggle_view_desktop"
  })
    })
}
}
$( offMobileEnviroment )
$(offMobileEnviroment)


/** mediawiki api를 통해 간단하게 문서들을 수집, 변경하는 함수.
/** mediawiki api를 통해 간단하게 문서들을 수집, 변경하는 함수.
  * 플러그인 코어에서 사용하기 위해 만들었습니다.
* 플러그인 코어에서 사용하기 위해 만들었습니다.
  * 작성자: [[사용자:BANIP|BANIP]]
* 작성자: [[사용자:BANIP|BANIP]]
  * 사용방법  
* 사용방법  
  *: var api = MediaWikiAPI(); .changeDocument()
*: var api = MediaWikiAPI(); .changeDocument()
  *: api.changeDocument(변경할 문서의 타이틀, 편집 요약, 변경할 문서의 내용) => 문서의 내용을 변경합니다.
*: api.changeDocument(변경할 문서의 타이틀, 편집 요약, 변경할 문서의 내용) => 문서의 내용을 변경합니다.
  *: api.addDocument(변경할 문서의 타이틀, 편집 요약, 추가할 문서의 내용) => 문서에 새로운 내용을 추가합니다.
*: api.addDocument(변경할 문서의 타이틀, 편집 요약, 추가할 문서의 내용) => 문서에 새로운 내용을 추가합니다.
  *: api.getDocument(가져올 문서의 타이틀) => 문서의 모든 텍스트를 읽어옵니다.
*: api.getDocument(가져올 문서의 타이틀) => 문서의 모든 텍스트를 읽어옵니다.
  *: api.readDocument(가져올 문서의 타이틀) => 문서의 모든 텍스트를 jquery 객체로 읽어옵니다.
*: api.readDocument(가져올 문서의 타이틀) => 문서의 모든 텍스트를 jquery 객체로 읽어옵니다.
  * 영 좋지 않은 목적으로 사용 하면 안드로메다 경찰관이 잡아간다!
* 영 좋지 않은 목적으로 사용 하면 안드로메다 경찰관이 잡아간다!
*/
*/


function MediaWikiAPI(){
function MediaWikiAPI() {
var token;
    var token;
var getToken = function(){
    var getToken = function() {
if(token != undefined) return token;
        if (token != undefined) return token;
    $.ajax({
        $.ajax({
        url:"/w/api.php?action=query&meta=tokens",
            url: "/w/api.php?action=query&meta=tokens",
        success:function(v,i){
            success: function(v, i) {
            var datas = JSON.parse($(v).find("pre").text());
                var datas = JSON.parse($(v).find("pre").text());
            token = datas["query"]["tokens"]["csrftoken"];
                token = datas["query"]["tokens"]["csrftoken"];
        },
            },
    async: false
            async: false
    })
        })
    return token;
        return token;
}
    }


function changeDocument( title, summary, content ) {
    function changeDocument(title, summary, content) {
    $.ajax({
        $.ajax({
        url: mw.util.wikiScript("api"),
            url: mw.util.wikiScript("api"),
        data: {
            data: {
            format: 'json',
                format: 'json',
            action: 'edit',
                action: 'edit',
            title: title,
                title: title,
            summary: summary,
                summary: summary,
            text: content,
                text: content,
            token: getToken(),
                token: getToken(),
        },
            },
        dataType: 'json',
            dataType: 'json',
        type: 'POST',
            type: 'POST',
        success: function( data ) {
            success: function(data) {
            if ( data && data.edit && data.edit.result == 'Success' ) {
                if (data && data.edit && data.edit.result == 'Success') {
                window.location.reload(); // reload page if edit was successful
                    window.location.reload(); // reload page if edit was successful
            } else if ( data && data.error ) {
                } else if (data && data.error) {
                alert( 'Error: API returned error code "' + data.error.code + '": ' + data.error.info );
                    alert('Error: API returned error code "' + data.error.code + '": ' + data.error.info);
            } else {
                } else {
                alert( 'Error: Unknown result from API.' );
                    alert('Error: Unknown result from API.');
            }
                }
        },
            },
        error: function( xhr ) {
            error: function(xhr) {
            alert( 'Error: Request failed.' );
                alert('Error: Request failed.');
        }
            }
    });
        });
}
    }


function addDocument( title, summary, content ){
    function addDocument(title, summary, content) {
originContent = getDocument(title)
        originContent = getDocument(title)
changeDocument( title, summary, originContent + content);
        changeDocument(title, summary, originContent + content);
}
    }


function getDocument(title){
    function getDocument(title) {
function entityDecode(doc){
        function entityDecode(doc) {
return $('<p></p>').html(doc).text();
            return $('<p></p>').html(doc).text();
}
        }


var originContent;
        var originContent;
$.ajax({
        $.ajax({
    url:"/w/index.php?title=" + title + "&action=edit",
            url: "/w/index.php?title=" + title + "&action=edit",
    success:function ajaxSucess(data){
            success: function ajaxSucess(data) {
originContent = $(data).find("textarea").html();
                originContent = $(data).find("textarea").html();
},
            },
    async: false
            async: false
})
        })
return entityDecode(originContent);
        return entityDecode(originContent);
}
    }


function readDocument(title){
    function readDocument(title) {
var doc;
        var doc;
$.ajax({
        $.ajax({
    url:"/wiki/" + title,
            url: "/wiki/" + title,
    success:function ajaxSucess(data){
            success: function ajaxSucess(data) {
doc = $(data).find("#mw-content-text");
                doc = $(data).find("#mw-content-text");
},
            },
    async: false
            async: false
})
        })
return doc;
        return doc;
}
    }




     return {
     return {
    getToken:getToken,
        getToken: getToken,
    changeDocument:changeDocument,
        changeDocument: changeDocument,
    addDocument:addDocument,
        addDocument: addDocument,
    getDocument:getDocument,
        getDocument: getDocument,
    readDocument:readDocument,
        readDocument: readDocument,
     }
     }
}
}
477번째 줄: 477번째 줄:


/** [[틀:플러그인]]을 사용 가능하게 해 줍니다. 사용자의 허락을 맡고 사용자의 commonjs 편집을 허가 할 수 있는 문서입니다.
/** [[틀:플러그인]]을 사용 가능하게 해 줍니다. 사용자의 허락을 맡고 사용자의 commonjs 편집을 허가 할 수 있는 문서입니다.
  * 작성자: [[사용자:BANIP|BANIP]]
* 작성자: [[사용자:BANIP|BANIP]]
  * [[백괴게임:관리자 요청/2018년 1월]]에서 BANIP님 요청으로 퍼왔습니다.
* [[백괴게임:관리자 요청/2018년 1월]]에서 BANIP님 요청으로 퍼왔습니다.
  */
*/
function pluginCore(){
function pluginCore() {
// 사용자의 commonjs의 문서 이름을 획득
    // 사용자의 commonjs의 문서 이름을 획득
var commonjs = "사용자:" + mw.config.get("wgUserName") + "/common.js";
    var commonjs = "사용자:" + mw.config.get("wgUserName") + "/common.js";
var plugins = {}, docPlugins = {}, uninstalledPlugins = {}, unupdatedPlugins = {};
    var plugins = {},
var preloadedplugins = [], needPlugins = [];
        docPlugins = {},
var api = MediaWikiAPI();
        uninstalledPlugins = {},
var jsdoc = api.getDocument(commonjs);
        unupdatedPlugins = {};
    var preloadedplugins = [],
        needPlugins = [];
    var api = MediaWikiAPI();
    var jsdoc = api.getDocument(commonjs);


//commonjs에서 특정 플러그인 제거
    //commonjs에서 특정 플러그인 제거
function removePluginByDoc(pluginTitle,doc){
    function removePluginByDoc(pluginTitle, doc) {
var reg = new RegExp("\\/\\*\\* 플러그인 "+pluginTitle+"([\\s\\S]*)\\/\\* "+pluginTitle+" 끝 \\*\\/","g");
        var reg = new RegExp("\\/\\*\\* 플러그인 " + pluginTitle + "([\\s\\S]*)\\/\\* " + pluginTitle + " 끝 \\*\\/", "g");
doc = doc.replace(reg,"");
        doc = doc.replace(reg, "");
return doc
        return doc
}
    }
 
    // 플러그인이 비어있는지 확인
    function isPluginsEmpty(plugins) {
        return Object.keys(plugins).length === 0;
    }


// 플러그인이 비어있는지 확인
    //플러그인의 모든 키 순회
function isPluginsEmpty(plugins){
    function forEach(object, callback) {
return Object.keys(plugins).length === 0;
        for (var key in object) {
}
            var variable = object[key];
            callback(variable, key);
        }
    }


//플러그인의 모든 키 순회
    // 문서에서 사용하는 플러그인들을 체크합니다. use-script클래스를 가진 모든 돔 요소를 조사하고
function forEach(object, callback){
    // 그 돔에 내장된 플러그인 데이터를 docPlugins에 추가합니다.
for(var key in object){
    var checkDocPlugin = (function(docPlugins) {
var variable = object[key];
        function getPluginData($this) {
callback(variable,key);
            return {
}
                name: $this.attr("data-name"), // 플러그인 이름
}
                descript: $this.attr("data-descript"), // 플러그인 내용
                version: $this.attr("data-version"), // 플러그인 이름
                local: ($this.attr("data-local") == "true") ? true : false,
                creat: $this.attr("data-creat"),
                state: $this.attr("data-state"),
                link: $this.attr("data-link"),
            };
        }


// 문서에서 사용하는 플러그인들을 체크합니다. use-script클래스를 가진 모든 돔 요소를 조사하고
        function getAllPluginsName(plugins) {
// 그 돔에 내장된 플러그인 데이터를 docPlugins에 추가합니다.
            var pluginNames = [];
var checkDocPlugin = (function(docPlugins){
            forEach(plugins, function(plugin) {
function getPluginData($this){
                var pluginName = plugin.name;
return {
                pluginNames.push(pluginName);
name : $this.attr("data-name"), // 플러그인 이름
            })
descript : $this.attr("data-descript"), // 플러그인 내용
version : $this.attr("data-version"), // 플러그인 이름
local : ($this.attr("data-local") == "true") ? true : false,
creat : $this.attr("data-creat"),
state : $this.attr("data-state"),
link : $this.attr("data-link"),
executable: $this.attr("data-executable") ? true : false,
};
}


function getAllPluginsName(plugins){
            return pluginNames;
var pluginNames = [];
        }
forEach(plugins,function(plugin){
var pluginName = plugin.name;
pluginNames.push(pluginName);
})


return pluginNames;
        var loadAllPlugins = (function(docPlugins) {
}
            $(".use-script").each(function() {
                const plugin = getPluginData($(this));
                docPlugins[plugin.name] = plugin;
            })
        })(docPlugins)


var loadAllPlugins = (function(docPlugins){
        var loadAllPlugins = (function(docPlugins) {
$(".use-script").each(function(){
            if (!isPluginsEmpty(docPlugins)) {
const plugin = getPluginData( $(this) );
                var subTitle = " " + getAllPluginsName(docPlugins).join(", ") + " 플러그인 가동중";
docPlugins[plugin.name] = plugin;
                $("#siteSub").text(function(i, v) {
})
                    return v + subTitle
})(docPlugins)
                });
            }
        })(docPlugins)
    })(docPlugins);


var loadAllPlugins = (function(docPlugins){
    // 사용자가 가지고 있는 플러그인들을 체크합니다.
if(!isPluginsEmpty(docPlugins)){
    var checkHavePlugin = (function() {
var subTitle = " " + getAllPluginsName(docPlugins).join(", ") + " 플러그인 가동중";
        function getUserPlugins(jsdoc) {
$("#siteSub").text(function(i,v){return v + subTitle });
            var userplugins = [];
}
            // plugins.---가 있는지 체크하는 정규식
})(docPlugins)
            var pluginreg = /JSON \=\> ([\S]+) = (\{.*\})/g;
})(docPlugins);
            var nameMatch = pluginreg.exec(jsdoc);
            while (nameMatch) {
                userplugins.push(JSON.parse(nameMatch[2]));
                nameMatch = pluginreg.exec(jsdoc);
            }
            return userplugins;
        }


// 사용자가 가지고 있는 플러그인들을 체크합니다.
        function isSamePlugin(pluginFirst, pluginSecond) {
var checkHavePlugin = (function(){
            return pluginFirst.name == pluginSecond.name
function getUserPlugins(jsdoc){
        }
var userplugins = [];
// plugins.---가 있는지 체크하는 정규식
var pluginreg = /JSON \=\> ([\S]+) = (\{.*\})/g;
var nameMatch = pluginreg.exec(jsdoc);
while(nameMatch){
    userplugins.push(JSON.parse( nameMatch[2] ));
    nameMatch = pluginreg.exec(jsdoc);
}
return userplugins;
}


function isSamePlugin(pluginFirst,pluginSecond){
        function isSameVersionPlugin(pluginFirst, plugiSecond) {
return pluginFirst.name == pluginSecond.name
            return pluginFirst.version == plugiSecond.version
}
        }


function isSameVersionPlugin(pluginFirst,plugiSecond){
        function addNeedPlugins(targetPlugins) {
return pluginFirst.version == plugiSecond.version
            //global docPlugins, needPlugins
}
            for (var key in targetPlugins) {
                var pluginName = docPlugins[key].name;
                needPlugins.push(pluginName);
            }
        }


function addNeedPlugins(targetPlugins){
        if (!isPluginsEmpty(docPlugins)) {
//global docPlugins, needPlugins
            preloadedplugins = getUserPlugins(jsdoc);
for(var key in targetPlugins){
            forEach(docPlugins, function(docplugin) {
var pluginName = docPlugins[key].name;
                var isHavePlugin = false;
needPlugins.push( pluginName );
                forEach(preloadedplugins, function(myplugin) {
}
                    if (!isSamePlugin(docplugin, myplugin)) return;
}
                    if (!isSameVersionPlugin(docplugin, myplugin)) {
                        unupdatedPlugins[docplugin.name] = docplugin;
                    }
                    isHavePlugin = true;
                });


if(!isPluginsEmpty(docPlugins)){
                if (!isHavePlugin) {
preloadedplugins = getUserPlugins(jsdoc);
                    uninstalledPlugins[docplugin.name] = docplugin;
forEach(docPlugins,function(docplugin){
                }
var isHavePlugin = false;
            });
forEach(preloadedplugins,function(myplugin){
            addNeedPlugins(uninstalledPlugins);
if( !isSamePlugin(docplugin,myplugin) ) return;
            addNeedPlugins(unupdatedPlugins);
if( !isSameVersionPlugin(docplugin,myplugin) ){
        }
unupdatedPlugins[docplugin.name] = docplugin;
    })();
}
isHavePlugin = true;
});


if(!isHavePlugin){
    function onPluginInstall() {
uninstalledPlugins[docplugin.name] = docplugin;
        function getPluginCode(plugin) {
}
            // html로 구성된 코드를 텍스트로
});
            function entityDecode(doc) {
addNeedPlugins(uninstalledPlugins);
                return $('<p></p>').html(doc).text();
addNeedPlugins(unupdatedPlugins);
            }
}
})();


function onPluginInstall(){
            function getDocHead(plugin) {
function getPluginCode(plugin){
                var docHead = "";
// html로 구성된 코드를 텍스트로
                var toJSONPlugin = Object.assign({}, plugin);
function entityDecode(doc){
                toJSONPlugin.code = undefined;
return $('<p></p>').html(doc).text();
                toJSONPlugin.link = undefined;
}
                docHead += "\n"
function getDocHead(plugin){
                docHead += "\n/** 플러그인 " + plugin["name"] + "***************************\n";
var docHead = "";
                docHead += "* " + plugin["descript"] + "\n";
var toJSONPlugin = Object.assign({}, plugin);
                docHead += "* 버전 => " + plugin["version"] + "\n";
toJSONPlugin.code = undefined;
                docHead += "* 작성자 : [[사용자:" + plugin["creat"] + "|" + plugin["creat"] + "]] \n";
toJSONPlugin.link = undefined;
                docHead += "* JSON => " + plugin["name"] + " = " + JSON.stringify(toJSONPlugin) + "; \n";
docHead += "\n"
                docHead += "*/ \n";
docHead += "\n/** 플러그인 " + plugin["name"] + "***************************\n";
                docHead += "function plugin_" + plugin["name"] + "(){\n";
docHead += "* " + plugin["descript"] + "\n";
                if (plugin.local) docHead += "  if($(\"[data-name='" + plugin["name"] + "']\").length >= 1){\n";
docHead += "* 버전 => " + plugin["version"] + "\n";
                return docHead;
docHead += "* 작성자 : [[사용자:" + plugin["creat"] + "|" + plugin["creat"] + "]] \n";
            }
docHead += "* JSON => " + plugin["name"] + " = " + JSON.stringify(toJSONPlugin) + "; \n";
docHead += "*/ \n";
docHead += "function plugin_" + plugin["name"] + "(){\n";
if(plugin.local) docHead += "  if($(\"[data-name='" + plugin["name"] + "']\").length >= 1){\n";
return docHead;
}


function getDocFoot(plugin){
            function getDocFoot(plugin) {
var docFoot = "";
                var docFoot = "";
if(plugin.local) docFoot += "\n  }\n";
                if (plugin.local) docFoot += "\n  }\n";
docFoot += "\n}\n";
                docFoot += "\n}\n";
if(plugin.executable) docFoot += "$( plugin_" + plugin["name"] + " );\n";
                docFoot += "$( plugin_" + plugin["name"] + " );\n";
docFoot += "/* " + plugin["name"] + " 끝 */\n\n";
                docFoot += "/* " + plugin["name"] + " 끝 */\n\n";
return docFoot;
                return docFoot;
}
            }


var docHead = getDocHead(plugin), docFoot = getDocFoot(plugin);
            var docHead = getDocHead(plugin),
return entityDecode(docHead + plugin["code"] + docFoot);
                docFoot = getDocFoot(plugin);
}
            return entityDecode(docHead + plugin["code"] + docFoot);
        }


$(".install-button").text("설치중..");
        $(".install-button").text("설치중..");
$(".install-button").off("click");
        $(".install-button").off("click");


var doc = "";
        var doc = "";
forEach(needPlugins,function(pluginName){
        forEach(needPlugins, function(pluginName) {
var plugin = docPlugins[pluginName];
            var plugin = docPlugins[pluginName];
jsdoc = removePluginByDoc(pluginName,jsdoc);
            jsdoc = removePluginByDoc(pluginName, jsdoc);
doc += getPluginCode( plugin );
            doc += getPluginCode(plugin);
});
        });
api.changeDocument(commonjs,"플러그인 "+ needPlugins +"설치", jsdoc + doc);
        api.changeDocument(commonjs, "플러그인 " + needPlugins + "설치", jsdoc + doc);
}
    }


var checkinstalledPlugin = function(){
    var checkinstalledPlugin = function() {
function appendBox(plugin,status){
        function appendBox(plugin, status) {
var pluginName = plugin.name;
            var pluginName = plugin.name;
var box = $(".cloneable.p-box").clone().removeClass("cloneable");
            var box = $(".cloneable.p-box").clone().removeClass("cloneable");
var code = api.readDocument( plugin.state ).find("pre.script").html();
            var code = api.readDocument(plugin.state).find("pre.script").html();
docPlugins[pluginName].code = code;
            docPlugins[pluginName].code = code;
box.find(".p-status").html( status );
            box.find(".p-status").html(status);
box.find(".p-code").html( code.replace(/\s{1,}$/,"") );
            box.find(".p-code").html(code.replace(/\s{1,}$/, ""));
box.find(".p-name").text( pluginName );
            box.find(".p-name").text(pluginName);
box.find(".p-descript").text( plugin["descript"] );
            box.find(".p-descript").text(plugin["descript"]);
if(status == "버전업"){
            if (status == "버전업") {
var thisVersion;
                var thisVersion;
for(var key in preloadedplugins){
                for (var key in preloadedplugins) {
if (preloadedplugins[key].name == plugin["name"]){
                    if (preloadedplugins[key].name == plugin["name"]) {
thisVersion = preloadedplugins[key].version;
                        thisVersion = preloadedplugins[key].version;
}
                    }
}
                }
box.find(".p-version").text( thisVersion + " => " + plugin["version"] );
                box.find(".p-version").text(thisVersion + " => " + plugin["version"]);
} else {
            } else {
box.find(".p-version").text( plugin["version"] );
                box.find(".p-version").text(plugin["version"]);
}
            }
box.find(".p-local").text( plugin["local"] == true ? "일부 문서만" : "문서 전체" );
            box.find(".p-local").text(plugin["local"] == true ? "일부 문서만" : "문서 전체");
box.find(".p-creat").text( plugin["creat"] );
            box.find(".p-creat").text(plugin["creat"]);
$.ajax({
            $.ajax({
    url:"/w/api.php?action=query&prop=revisions&rvdir=older&titles=" + plugin.state,
                url: "/w/api.php?action=query&prop=revisions&rvdir=older&titles=" + plugin.state,
    success:function(v,i){
                success: function(v, i) {
        var datas = JSON.parse($(v).find("pre").text());
                    var datas = JSON.parse($(v).find("pre").text());
        var titleKey = Object.keys(datas["query"]["pages"])[0];
                    var titleKey = Object.keys(datas["query"]["pages"])[0];
        var lastModified = datas["query"]["pages"][titleKey]["revisions"][0]["user"] +"(" + datas["query"]["pages"][titleKey]["revisions"][0]["timestamp"] + ")";
                    var lastModified = datas["query"]["pages"][titleKey]["revisions"][0]["user"] + "(" + datas["query"]["pages"][titleKey]["revisions"][0]["timestamp"] + ")";
        box.find(".p-last").text(lastModified);
                    box.find(".p-last").text(lastModified);
    },
                },
    async: false
                async: false
})
            })
$(".box-article").append(box);
            $(".box-article").append(box);
}
        }


if( isPluginsEmpty(docPlugins) || (isPluginsEmpty(unupdatedPlugins) && isPluginsEmpty(uninstalledPlugins)) ) return;
        if (isPluginsEmpty(docPlugins) || (isPluginsEmpty(unupdatedPlugins) && isPluginsEmpty(uninstalledPlugins))) return;
var doc = $("#mw-content-text");
        var doc = $("#mw-content-text");
var setupMeta = api.readDocument("틀:플러그인/setup");
        var setupMeta = api.readDocument("틀:플러그인/setup");
doc.html(setupMeta);
        doc.html(setupMeta);
forEach(uninstalledPlugins, function(uninstalledPlugin){
        forEach(uninstalledPlugins, function(uninstalledPlugin) {
appendBox(uninstalledPlugin,"설치");
            appendBox(uninstalledPlugin, "설치");
});
        });
forEach(unupdatedPlugins, function(unupdatedPlugin){
        forEach(unupdatedPlugins, function(unupdatedPlugin) {
appendBox(unupdatedPlugin,"버전업");
            appendBox(unupdatedPlugin, "버전업");
});
        });
$(".install-button").on("click",onPluginInstall);
        $(".install-button").on("click", onPluginInstall);
}
    }


var showPluginTemplet = (function(){
    var showPluginTemplet = (function() {
if( isPluginsEmpty(needPlugins) ){
        if (isPluginsEmpty(needPlugins)) {
return;
            return;
}
        }


if($(".plugin-install").length >= 1){
        if ($(".plugin-install").length >= 1) {
$(".plugin-install").eq(0).closest("table").show();
            $(".plugin-install").eq(0).closest("table").show();
$(".plugin-name").eq(0).text(needPlugins);
            $(".plugin-name").eq(0).text(needPlugins);
$(".plugin-install").on("click",checkinstalledPlugin);
            $(".plugin-install").on("click", checkinstalledPlugin);
} else {
        } else {
                        checkinstalledPlugin();
            checkinstalledPlugin();
                }
        }
})();
    })();
}
}
$( pluginCore )
$(pluginCore)

2018년 2월 2일 (금) 01:07 판

/* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */
/*<source lang="javascript"><nowiki>*/
/** [[틀:USERNAME]]에서 사용하는 바꿔치기 함수
 * 작성자: [[사용자:Peremen|Peremen]]
 */
function UserNameReplace() {
    if (typeof(disableUsernameReplace) != 'undefined' && disableUsernameReplace) return;
    if (!document.getElementById('pt-userpage')) return;
    $("span.insertusername").each(function(i) {
        $(this).text(wgUserName)
    })
};
$(UserNameReplace);

/** [[틀:제목]]에서 사용하는 제목 바꿔치기 함수
 * 작성자: [[사용자:Peremen|Peremen]]
 */

function rewriteTitle() {
    if (typeof(disableTitleRewrite) != 'undefined' && disableTitleRewrite) return;
    if (!document.getElementById('title-meta')) return;
    $('h1.firstHeading').each(function(i) {
        $(this).html($("#title-meta").html()).css('text-align', $("#title-align").text())
    })
}
$(rewriteTitle);

/* from en: */
var hasClass = (function() {
    var reCache = {};
    return function(element, className) {
        return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
    };
})();

/* ([[위키백과:관리자 요청/2007년 5월#스크립트 추가 요청]]) */
/** Collapsible tables *********************************************************
 *
 *  Description: Allows tables to be collapsed, showing only the header. See
 *               Wikipedia:NavFrame.
 *  Maintainers: User:R. Koot
 */

//var autoCollapse = 2;
//var collapseCaption = "hide";
//var expandCaption = "show";

function collapseTable(tableIndex) {
    var Button = document.getElementById("collapseButton" + tableIndex);
    var Table = document.getElementById("collapsibleTable" + tableIndex);

    if (!Table || !Button) {
        return false;
    }

    var Rows = Table.getElementsByTagName("tr");

    if (Button.firstChild.data == collapseCaption) {
        for (var i = 1; i < Rows.length; i++) {
            Rows[i].style.display = "none";
        }
        Button.firstChild.data = expandCaption;
    } else {
        for (var 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 = new Object();
    var Tables = document.getElementsByTagName("table");

    for (var i = 0; i < Tables.length; i++) {
        if (hasClass(Tables[i], "collapsible")) {
            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);

            Button.style.styleFloat = "right";
            Button.style.cssFloat = "right";
            Button.style.fontWeight = "normal";
            Button.style.textAlign = "right";
            Button.style.width = "6em";

            ButtonLink.setAttribute("id", "collapseButton" + tableIndex);
            ButtonLink.setAttribute("href", "javascript:collapseTable(" + tableIndex + ");");
            ButtonLink.appendChild(ButtonText);

            Button.appendChild(document.createTextNode("["));
            Button.appendChild(ButtonLink);
            Button.appendChild(document.createTextNode("]"));

            var Header = Tables[i].getElementsByTagName("tr")[0].getElementsByTagName("th")[0];
            /* only add button and increment count if there is a header row to work with */
            if (Header) {
                Header.insertBefore(Button, Header.childNodes[0]);
                tableIndex++;
            }
        }
    }

    for (var i = 0; i < tableIndex; i++) {
        if (hasClass(NavigationBoxes[i], "collapsed") || (tableIndex >= autoCollapse && hasClass(NavigationBoxes[i], "autocollapse"))) {
            collapseTable(i);
        }
    }
}

$(createCollapseButtons);

/* ([[위키백과:관리자 요청/2007년 5월#스크립트 추가 요청]]) */
/** Dynamic Navigation Bars (experimental) *************************************
 *
 *  Description: See [[:en:Wikipedia:NavFrame]].
 *  Maintainers: UNMAINTAINED
 */

// set up the words in your language
var autoCollapse = 2;
var collapseCaption = "숨기기";
var expandCaption = "보이기";
var NavigationBarHide = '[' + collapseCaption + ']';
var NavigationBarShow = '[' + expandCaption + ']';

// set up max count of Navigation Bars on page,
// if there are more, all will be hidden
// NavigationBarShowDefault = 0; // all bars will be hidden
// NavigationBarShowDefault = 1; // on pages with more than 1 bar all bars will be hidden
var NavigationBarShowDefault = autoCollapse;


// shows and hides content and picture (if available) of navigation bars
// Parameters:
//     indexNavigationBar: the index of navigation bar to be toggled
function toggleNavigationBar(indexNavigationBar) {
    var NavToggle = document.getElementById("NavToggle" + indexNavigationBar);
    var NavFrame = document.getElementById("NavFrame" + indexNavigationBar);

    if (!NavFrame || !NavToggle) {
        return false;
    }

    // if shown now
    if (NavToggle.firstChild.data == NavigationBarHide) {
        for (
            var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling
        ) {
            if (hasClass(NavChild, 'NavPic')) {
                NavChild.style.display = 'none';
            }
            if (hasClass(NavChild, 'NavContent')) {
                NavChild.style.display = 'none';
            }
        }
        NavToggle.firstChild.data = NavigationBarShow;

        // if hidden now
    } else if (NavToggle.firstChild.data == NavigationBarShow) {
        for (
            var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling
        ) {
            if (hasClass(NavChild, 'NavPic')) {
                NavChild.style.display = 'block';
            }
            if (hasClass(NavChild, 'NavContent')) {
                NavChild.style.display = 'block';
            }
        }
        NavToggle.firstChild.data = NavigationBarHide;
    }
}

// adds show/hide-button to navigation bars
function createNavigationBarToggleButton() {
    var indexNavigationBar = 0;
    // iterate over all < div >-elements
    var divs = document.getElementsByTagName("div");
    for (var i = 0; NavFrame = divs[i]; i++) {
        // if found a navigation bar
        if (hasClass(NavFrame, "NavFrame")) {

            indexNavigationBar++;
            var NavToggle = document.createElement("a");
            NavToggle.className = 'NavToggle';
            NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
            NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');

            var NavToggleText = document.createTextNode(NavigationBarHide);
            NavToggle.appendChild(NavToggleText);
            // Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked)
            for (
                var j = 0; j < NavFrame.childNodes.length; j++
            ) {
                if (hasClass(NavFrame.childNodes[j], "NavHead")) {
                    NavFrame.childNodes[j].appendChild(NavToggle);
                }
            }
            NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
        }
    }
    // if more Navigation Bars found than Default: hide all
    if (NavigationBarShowDefault < indexNavigationBar) {
        for (
            var i = 1; i <= indexNavigationBar; i++
        ) {
            toggleNavigationBar(i);
        }
    }

}

$(createNavigationBarToggleButton);

/** 대문의 탭을 "프로젝트"->"대문"으로 바꾸는 함수.
 * 작성자: [[사용자:Peremen|Peremen]]
 */

function MainPageRenameNamespaceTab() {
    var title = mw.config.get('wgPageName');
    var hasMainPageTab = (title == '백괴게임:대문' || title == '백괴게임토론:대문');
    if (hasMainPageTab) {
        $('#ca-nstab-project a').text("대문");
    }
    var hasGameListTab = (title == '백괴게임:게임_목록' || title == '백괴게임토론:게임_목록');
    if (hasGameListTab) {
        $('#ca-nstab-project a').text("게임 목록");
    }
    $('#ca-nstab-main a').text("게임");
}
$(MainPageRenameNamespaceTab);

/** 임베드 플래시 무비 
 * 문서에 플래시 파일을 넣을 수 있게 합니다. [[틀:플래시]]를 참고하십시오.
 * 원작성자: [[:en:User:Olipro|Olipro]]
 */
function useFlash() {
    var flashOk;
    var contentTempHolder;
    $(embedFlashCheck);
}

function embedFlashMovie(flashOk) {
    mainbody = document.getElementById('bodyContent');
    mainbody.innerHTML = contentTempHolder;
    spancheck = document.getElementsByTagName('span');
    for (i = 0; i < spancheck.length; i++) {
        if (spancheck[i].getAttribute('id') != 'embedFlashDoc') {
            continue;
        }
        obj = spancheck[i].innerHTML.split('@');
        flwidth = obj[0];
        flheight = obj[1];
        flfile = obj[2].replace('fullurl://', 'https://');
        showFlash = ' ';
        if (flashOk) {
            showFlash = '<object width="' + flwidth + '" height="' + flheight + '"';
            showFlash += 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"';
            showFlash += 'codebase="http://fpdownload.macromedia.com/pub/';
            showFlash += 'shockwave/cabs/flash/swflash.cab#version=8,0,0,0">';
            showFlash += '<param name="movie" value="' + flfile + '" />';
            showFlash += '<embed src="' + flfile + '" width="' + flwidth + '" height=';
            showFlash += '"' + flheight + '" type="application/x-shockwave-flash" ';
            showFlash += 'pluginspage="http://www.macromedia.com/go/getflashplayer" />';
            showFlash += '</object>';
        } else {
            showFlash = '<a class="plainlinks" href="javascript:embedFlashMovie(true)" onClick="embedFlashMovie(true)">' + flfile + '</a> (신뢰하는 경우 보려면 클릭하십시오.)';
        }
        spancheck[i].innerHTML = showFlash;
        spancheck[i].style.display = 'inline';
    }
};

function embedFlashCheck() {
    if (!document.getElementById('embedFlashDoc')) {
        return;
    }
    mainbody = document.getElementById('bodyContent');
    contentTempHolder = mainbody.innerHTML;
    if (typeof displayFlashOverride != 'undefined') {
        embedFlashMovie(displayFlashOverride);
        return;
    }
    askmessage = '<div align="center" id="askflash">이 게임에는 ';
    askmessage += '<a href="/wiki/백괴:플래시" class="plainlinks">플래시</a>가 들어있습니다.<br />';
    askmessage += '컴퓨터에 해를 끼칠 수 있으므로 신뢰하는 경우에만 여십시오.<br />';
    askmessage += '플래시가 포함된 게임을 보시겠습니까?<br><b> ';
    askmessage += '<a href="javascript:embedFlashMovie(true)" ';
    askmessage += 'onClick="embedFlashMovie(true)">예</a> | <a ';
    askmessage += 'href="https://game.uncyclopedia.kr/">아니오</a>';
    mainbody.innerHTML = askmessage;
}
$(useFlash);

/* userAgent */
/** source: http://www.gregoryvarghese.com/how-to-get-browser-name-and-version-via-javascript/ **/

function get_browser_info() {
    var ua = navigator.userAgent,
        tem, M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
    if (/trident/i.test(M[1])) {
        tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
        return {
            name: 'IE ',
            version: (tem[1] || '')
        };
    }

    if (M[1] === 'Chrome') {
        tem = ua.match(/\bOPR\/(\d+)/)
        if (tem != null) {
            return {
                name: 'Opera',
                version: tem[1]
            };
        }
    }

    M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];

    if ((tem = ua.match(/version\/(\d+)/i)) != null) {
        M.splice(1, 1, tem[1]);
    }

    return {
        name: M[0],
        version: M[1]
    };

}

/** [[틀:CGI2|CGI2]]를 사용 가능하게 만드는 jquery 구문
 * 작성자: [[사용자:BANIP|BANIP]]
 */
function useCGI2() {
    $(".cgilink").each(function() {
        // CGI2의 page속성과 data속성을 가져옴
        var pagename = $(this).data("page");
        var variables = JSON.parse($(this).data("var").replace(/\, *\]/, "]"));
        // 가져온 page데이터 속성을 조합해 url인스턴스 생성
        var urlstr = window.location.origin + "/wiki/" + pagename + window.location.search;
        var url = new URL(urlstr);
        // 가져온 var속성으로 url 인스턴스의 searchparams를 씹고 뜯고 맛보고 즐기고
        variables.forEach(function(variable) {
            Object.entries(variable).forEach(function(actionWrap) {
                var action = actionWrap[0];
                var payload = actionWrap[1];
                url.searchParams[action](payload[0], payload[1]);
            })
        })
        // cgilink에 a태그 추가
        var children = $(this).html();
        $(this).html("<a href=" + url.href + ">" + children + "</a>")
    });
}
$(useCGI2);

/**
 * 모바일 모드 자동 해제
 * 사용자가 모바일 환경이면 자동으로 벡터 스킨으로 전환합니다.
 * 이 해제하고 싶으면 var execute를 true로 바꾸면 됩니다. 실행하고 싶으면 다시 true로 되돌려 놓아 주세요. 
 * 작성자: [[사용자:BANIP|BANIP]]
 */
function offMobileEnviroment() {
    var execute = true;

    if (!execute) return;
    $("#mw-mf-display-toggle").each(function() {
        location.search += "&mobileaction=toggle_view_desktop"
    })
}
$(offMobileEnviroment)

/** mediawiki api를 통해 간단하게 문서들을 수집, 변경하는 함수.
 * 플러그인 코어에서 사용하기 위해 만들었습니다.
 * 작성자: [[사용자:BANIP|BANIP]]
 * 사용방법 
 *: var api = MediaWikiAPI(); .changeDocument()
 *: api.changeDocument(변경할 문서의 타이틀, 편집 요약, 변경할 문서의 내용) => 문서의 내용을 변경합니다.
 *: api.addDocument(변경할 문서의 타이틀, 편집 요약, 추가할 문서의 내용) => 문서에 새로운 내용을 추가합니다.
 *: api.getDocument(가져올 문서의 타이틀) => 문서의 모든 텍스트를 읽어옵니다.
 *: api.readDocument(가져올 문서의 타이틀) => 문서의 모든 텍스트를 jquery 객체로 읽어옵니다.
 * 영 좋지 않은 목적으로 사용 하면 안드로메다 경찰관이 잡아간다!
 */

function MediaWikiAPI() {
    var token;
    var getToken = function() {
        if (token != undefined) return token;
        $.ajax({
            url: "/w/api.php?action=query&meta=tokens",
            success: function(v, i) {
                var datas = JSON.parse($(v).find("pre").text());
                token = datas["query"]["tokens"]["csrftoken"];
            },
            async: false
        })
        return token;
    }

    function changeDocument(title, summary, content) {
        $.ajax({
            url: mw.util.wikiScript("api"),
            data: {
                format: 'json',
                action: 'edit',
                title: title,
                summary: summary,
                text: content,
                token: getToken(),
            },
            dataType: 'json',
            type: 'POST',
            success: function(data) {
                if (data && data.edit && data.edit.result == 'Success') {
                    window.location.reload(); // reload page if edit was successful
                } else if (data && data.error) {
                    alert('Error: API returned error code "' + data.error.code + '": ' + data.error.info);
                } else {
                    alert('Error: Unknown result from API.');
                }
            },
            error: function(xhr) {
                alert('Error: Request failed.');
            }
        });
    }

    function addDocument(title, summary, content) {
        originContent = getDocument(title)
        changeDocument(title, summary, originContent + content);
    }

    function getDocument(title) {
        function entityDecode(doc) {
            return $('<p></p>').html(doc).text();
        }

        var originContent;
        $.ajax({
            url: "/w/index.php?title=" + title + "&action=edit",
            success: function ajaxSucess(data) {
                originContent = $(data).find("textarea").html();
            },
            async: false
        })
        return entityDecode(originContent);
    }

    function readDocument(title) {
        var doc;
        $.ajax({
            url: "/wiki/" + title,
            success: function ajaxSucess(data) {
                doc = $(data).find("#mw-content-text");
            },
            async: false
        })
        return doc;
    }


    return {
        getToken: getToken,
        changeDocument: changeDocument,
        addDocument: addDocument,
        getDocument: getDocument,
        readDocument: readDocument,
    }
}


/** [[틀:플러그인]]을 사용 가능하게 해 줍니다. 사용자의 허락을 맡고 사용자의 commonjs 편집을 허가 할 수 있는 문서입니다.
 * 작성자: [[사용자:BANIP|BANIP]]
 * [[백괴게임:관리자 요청/2018년 1월]]에서 BANIP님 요청으로 퍼왔습니다.
 */
function pluginCore() {
    // 사용자의 commonjs의 문서 이름을 획득
    var commonjs = "사용자:" + mw.config.get("wgUserName") + "/common.js";
    var plugins = {},
        docPlugins = {},
        uninstalledPlugins = {},
        unupdatedPlugins = {};
    var preloadedplugins = [],
        needPlugins = [];
    var api = MediaWikiAPI();
    var jsdoc = api.getDocument(commonjs);

    //commonjs에서 특정 플러그인 제거
    function removePluginByDoc(pluginTitle, doc) {
        var reg = new RegExp("\\/\\*\\* 플러그인 " + pluginTitle + "([\\s\\S]*)\\/\\* " + pluginTitle + " 끝 \\*\\/", "g");
        doc = doc.replace(reg, "");
        return doc
    }

    // 플러그인이 비어있는지 확인
    function isPluginsEmpty(plugins) {
        return Object.keys(plugins).length === 0;
    }

    //플러그인의 모든 키 순회
    function forEach(object, callback) {
        for (var key in object) {
            var variable = object[key];
            callback(variable, key);
        }
    }

    // 문서에서 사용하는 플러그인들을 체크합니다. use-script클래스를 가진 모든 돔 요소를 조사하고
    // 그 돔에 내장된 플러그인 데이터를 docPlugins에 추가합니다.
    var checkDocPlugin = (function(docPlugins) {
        function getPluginData($this) {
            return {
                name: $this.attr("data-name"), // 플러그인 이름
                descript: $this.attr("data-descript"), // 플러그인 내용
                version: $this.attr("data-version"), // 플러그인 이름
                local: ($this.attr("data-local") == "true") ? true : false,
                creat: $this.attr("data-creat"),
                state: $this.attr("data-state"),
                link: $this.attr("data-link"),
            };
        }

        function getAllPluginsName(plugins) {
            var pluginNames = [];
            forEach(plugins, function(plugin) {
                var pluginName = plugin.name;
                pluginNames.push(pluginName);
            })

            return pluginNames;
        }

        var loadAllPlugins = (function(docPlugins) {
            $(".use-script").each(function() {
                const plugin = getPluginData($(this));
                docPlugins[plugin.name] = plugin;
            })
        })(docPlugins)

        var loadAllPlugins = (function(docPlugins) {
            if (!isPluginsEmpty(docPlugins)) {
                var subTitle = " " + getAllPluginsName(docPlugins).join(", ") + " 플러그인 가동중";
                $("#siteSub").text(function(i, v) {
                    return v + subTitle
                });
            }
        })(docPlugins)
    })(docPlugins);

    // 사용자가 가지고 있는 플러그인들을 체크합니다.
    var checkHavePlugin = (function() {
        function getUserPlugins(jsdoc) {
            var userplugins = [];
            // plugins.---가 있는지 체크하는 정규식
            var pluginreg = /JSON \=\> ([\S]+) = (\{.*\})/g;
            var nameMatch = pluginreg.exec(jsdoc);
            while (nameMatch) {
                userplugins.push(JSON.parse(nameMatch[2]));
                nameMatch = pluginreg.exec(jsdoc);
            }
            return userplugins;
        }

        function isSamePlugin(pluginFirst, pluginSecond) {
            return pluginFirst.name == pluginSecond.name
        }

        function isSameVersionPlugin(pluginFirst, plugiSecond) {
            return pluginFirst.version == plugiSecond.version
        }

        function addNeedPlugins(targetPlugins) {
            //global docPlugins, needPlugins
            for (var key in targetPlugins) {
                var pluginName = docPlugins[key].name;
                needPlugins.push(pluginName);
            }
        }

        if (!isPluginsEmpty(docPlugins)) {
            preloadedplugins = getUserPlugins(jsdoc);
            forEach(docPlugins, function(docplugin) {
                var isHavePlugin = false;
                forEach(preloadedplugins, function(myplugin) {
                    if (!isSamePlugin(docplugin, myplugin)) return;
                    if (!isSameVersionPlugin(docplugin, myplugin)) {
                        unupdatedPlugins[docplugin.name] = docplugin;
                    }
                    isHavePlugin = true;
                });

                if (!isHavePlugin) {
                    uninstalledPlugins[docplugin.name] = docplugin;
                }
            });
            addNeedPlugins(uninstalledPlugins);
            addNeedPlugins(unupdatedPlugins);
        }
    })();

    function onPluginInstall() {
        function getPluginCode(plugin) {
            // html로 구성된 코드를 텍스트로
            function entityDecode(doc) {
                return $('<p></p>').html(doc).text();
            }

            function getDocHead(plugin) {
                var docHead = "";
                var toJSONPlugin = Object.assign({}, plugin);
                toJSONPlugin.code = undefined;
                toJSONPlugin.link = undefined;
                docHead += "\n"
                docHead += "\n/** 플러그인 " + plugin["name"] + "***************************\n";
                docHead += "* " + plugin["descript"] + "\n";
                docHead += "* 버전 => " + plugin["version"] + "\n";
                docHead += "* 작성자 : [[사용자:" + plugin["creat"] + "|" + plugin["creat"] + "]] \n";
                docHead += "* JSON => " + plugin["name"] + " = " + JSON.stringify(toJSONPlugin) + "; \n";
                docHead += "*/ \n";
                docHead += "function plugin_" + plugin["name"] + "(){\n";
                if (plugin.local) docHead += "  if($(\"[data-name='" + plugin["name"] + "']\").length >= 1){\n";
                return docHead;
            }

            function getDocFoot(plugin) {
                var docFoot = "";
                if (plugin.local) docFoot += "\n  }\n";
                docFoot += "\n}\n";
                docFoot += "$( plugin_" + plugin["name"] + " );\n";
                docFoot += "/* " + plugin["name"] + " 끝 */\n\n";
                return docFoot;
            }

            var docHead = getDocHead(plugin),
                docFoot = getDocFoot(plugin);
            return entityDecode(docHead + plugin["code"] + docFoot);
        }

        $(".install-button").text("설치중..");
        $(".install-button").off("click");

        var doc = "";
        forEach(needPlugins, function(pluginName) {
            var plugin = docPlugins[pluginName];
            jsdoc = removePluginByDoc(pluginName, jsdoc);
            doc += getPluginCode(plugin);
        });
        api.changeDocument(commonjs, "플러그인 " + needPlugins + "설치", jsdoc + doc);
    }

    var checkinstalledPlugin = function() {
        function appendBox(plugin, status) {
            var pluginName = plugin.name;
            var box = $(".cloneable.p-box").clone().removeClass("cloneable");
            var code = api.readDocument(plugin.state).find("pre.script").html();
            docPlugins[pluginName].code = code;
            box.find(".p-status").html(status);
            box.find(".p-code").html(code.replace(/\s{1,}$/, ""));
            box.find(".p-name").text(pluginName);
            box.find(".p-descript").text(plugin["descript"]);
            if (status == "버전업") {
                var thisVersion;
                for (var key in preloadedplugins) {
                    if (preloadedplugins[key].name == plugin["name"]) {
                        thisVersion = preloadedplugins[key].version;
                    }
                }
                box.find(".p-version").text(thisVersion + " => " + plugin["version"]);
            } else {
                box.find(".p-version").text(plugin["version"]);
            }
            box.find(".p-local").text(plugin["local"] == true ? "일부 문서만" : "문서 전체");
            box.find(".p-creat").text(plugin["creat"]);
            $.ajax({
                url: "/w/api.php?action=query&prop=revisions&rvdir=older&titles=" + plugin.state,
                success: function(v, i) {
                    var datas = JSON.parse($(v).find("pre").text());
                    var titleKey = Object.keys(datas["query"]["pages"])[0];
                    var lastModified = datas["query"]["pages"][titleKey]["revisions"][0]["user"] + "(" + datas["query"]["pages"][titleKey]["revisions"][0]["timestamp"] + ")";
                    box.find(".p-last").text(lastModified);
                },
                async: false
            })
            $(".box-article").append(box);
        }

        if (isPluginsEmpty(docPlugins) || (isPluginsEmpty(unupdatedPlugins) && isPluginsEmpty(uninstalledPlugins))) return;
        var doc = $("#mw-content-text");
        var setupMeta = api.readDocument("틀:플러그인/setup");
        doc.html(setupMeta);
        forEach(uninstalledPlugins, function(uninstalledPlugin) {
            appendBox(uninstalledPlugin, "설치");
        });
        forEach(unupdatedPlugins, function(unupdatedPlugin) {
            appendBox(unupdatedPlugin, "버전업");
        });
        $(".install-button").on("click", onPluginInstall);
    }

    var showPluginTemplet = (function() {
        if (isPluginsEmpty(needPlugins)) {
            return;
        }

        if ($(".plugin-install").length >= 1) {
            $(".plugin-install").eq(0).closest("table").show();
            $(".plugin-name").eq(0).text(needPlugins);
            $(".plugin-install").on("click", checkinstalledPlugin);
        } else {
            checkinstalledPlugin();
        }
    })();
}
$(pluginCore)