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

리버티게임(개발), 모두가 만들어가는 자유로운 게임
둘러보기로 이동 검색으로 이동
백괴게임>BANIP
잔글 (executable 속성 추가)
잔글편집 요약 없음
 
(사용자 14명의 중간 판 268개는 보이지 않습니다)
1번째 줄: 1번째 줄:
/* -- 전역 상수 선언 -- */
// 미디어위키 폴더명 url 다뤄야되는 함수들에서 사용됨, 메인터넌스 거친 후 w 혹은 wiki로 변경 예정,
var wgScriptPath = "index.php";
/* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */
/* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */
/*<source lang="javascript"><nowiki>*/
/** 플러그인이 작동하지 않을 때 나타나는 내용
* js: noPlugin('(이름)');
* html: class="noplugin-(이름)"
* 작성자: [[사용자:Gustmd7410|Gustmd7410]] */
function noPlugin(name) {
    $('.noplugin-' + name).each(function() {
        $(this).remove();
    });
}


/** [[:USERNAME]]에서 사용하는 바꿔치기 함수
// [[미디어위키:common.js]] 미작동시: class="noplugin"
  * 작성자: [[사용자:Peremen|Peremen]]
$('.noplugin').each(function() {
    $(this).remove();
});
 
/* window.location.search를 객체 형태로 반환
@param {object} location 획득할 로케이션 객체, 비어있으면 window.location을 참조
원작성자: [[사용자:BANIP|BANIP]]
현 편집자: [[사용자:hsl0|hsl0]]
*/
*/


function UserNameReplace() {
function geturlSearch(location) {
    if (typeof(disableUsernameReplace) != 'undefined' && disableUsernameReplace) return;
if(!location) location = window.location;
    if (!document.getElementById('pt-userpage')) return;
else if(typeof location === 'string') location = new URL(location);
     $("span.insertusername").each(function(i) {
     var result = {};
         $(this).text(wgUserName)
    if (location.search)
    })
         location.search.substring(1).replace(/\+/g, ' ').split("&").map(function(v) {
};
            return v.split("=");
$(UserNameReplace);
        }).forEach(function(v) {
 
            result[decodeURIComponent(v[0])] = decodeURIComponent(v[1]);
/** [[틀:제목]]에서 사용하는 제목 바꿔치기 함수
        });
  * 작성자: [[사용자:Peremen|Peremen]]
    return result;
  */
 
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월#스크립트 추가 요청]]) */
/* 객체형태로 된 SearchParam을 받아 string형태로 반환
/** Collapsible tables *********************************************************
원작성자: [[사용자:BANIP|BANIP]]
*
*  Description: Allows tables to be collapsed, showing only the header. See
*              Wikipedia:NavFrame.
*  Maintainers: User:R. Koot
*/
*/
function searchParamToString(searchParamsObj){
return "?" + Object.entries(searchParamsObj).map(function(v){
return v.map(function(v) {
return encodeURIComponent(v);
}).join("=");
}).join("&");
}


//var autoCollapse = 2;
/** [[백괴게임:연습장]] 문서 내용 비우기
//var collapseCaption = "hide";
* 작성자: [[사용자:*devunt]]
//var expandCaption = "show";
*/
$(function() {
    if (mw.config.get("wgPageName") != "리버티게임:연습장")
        return;


function collapseTable( tableIndex ) {
    if (document.URL.lastIndexOf("action=edit") != -1) {
    var Button = document.getElementById( "collapseButton" + tableIndex );
        if (document.URL.lastIndexOf("fakeaction=clean") == -1)
    var Table = document.getElementById( "collapsibleTable" + tableIndex );
            return;


    if ( !Table || !Button ) {
        var dbindex = document.editform.wpTextbox1;
         return false;
        dbindex.value = "<!-- 이 줄은 지우지 마세요 -->{{리버티게임:연습장/안내문}}[["+"분류:리버티게임 도움말]]";
        document.editform.wpSummary.value = "연습장 비움";
        document.editform.wpSave.click();
         return;
     }
     }
});


    var Rows = Table.getElementsByTagName( "tr" );
/* userAgent */
 
/** source: http://www.gregoryvarghese.com/how-to-get-browser-name-and-version-via-javascript/ **/
    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";
function get_browser_info() {
            Button.style.cssFloat = "right";
    var ua = navigator.userAgent,
            Button.style.fontWeight = "normal";
        tem, M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
            Button.style.textAlign = "right";
    if (/trident/i.test(M[1])) {
            Button.style.width = "6em";
        tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
 
        return {
            ButtonLink.setAttribute( "id", "collapseButton" + tableIndex );
             name: 'IE ',
            ButtonLink.setAttribute( "href", "javascript:collapseTable(" + tableIndex + ");" );
             version: (tem[1] || '')
            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 (M[1] === 'Chrome') {
         if ( hasClass( NavigationBoxes[i], "collapsed" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], "autocollapse" ) ) ) {
         tem = ua.match(/\bOPR\/(\d+)/);
             collapseTable( i );
        if (tem != null) {
            return {
                name: 'Opera',
                version: tem[1]
             };
         }
         }
     }
     }
}
$( 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;


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


// shows and hides content and picture (if available) of navigation bars
    if ((tem = ua.match(/version\/(\d+)/i)) != null) {
// Parameters:
         M.splice(1, 1, tem[1]);
//    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
     return {
    if (NavToggle.firstChild.data == NavigationBarHide) {
         name: M[0],
         for (
         version: M[1]
            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++;
/** 편집 저장시 다른 문서나 CGI로 넘겨주기
            var NavToggle = document.createElement("a");
* ?action=edit&redirectquery=(params)
            NavToggle.className = 'NavToggle';
* 작성자: [[사용자:Gustmd7410|Gustmd7410]]
            NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
**/
            NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');
$(function() {
 
// 현재 URL 파라미터
            var NavToggleText = document.createTextNode(NavigationBarHide);
var params;
            NavToggle.appendChild(NavToggleText);
            // Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked)
// URLSearchParams 호환시
            for (
if(URLSearchParams) params = new URLSearchParams(location.search);
                var j=0;
// 비호환시 geturlSearch() 사용
                j < NavFrame.childNodes.length;
else {
                j++
// Map 호환시
            ) {
if(Map) params = new Map(Object.entries(geturlSearch()));
                if (hasClass(NavFrame.childNodes[j], "NavHead")) {
// 비호환시 mw.Map 사용
                    NavFrame.childNodes[j].appendChild(NavToggle);
else {
                }
params = new mw.Map();
            }
params.values = geturlSearch();
            NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
params.has = params.exists;
        }
}
    }
}
    // if more Navigation Bars found than Default: hide all
    if (NavigationBarShowDefault < indexNavigationBar) {
// 편집창에서 redirectquery 파라미터가 있을때
        for (
if(params.has('redirectquery')) {
            var i=1;
// 편집 폼에 wpExtraQueryRedirect 파라미터 input 요소 추가
            i<=indexNavigationBar;
$('#editform').append($('<input />', {
            i++
type: 'hidden',
        ) {
name: 'wpExtraQueryRedirect',
            toggleNavigationBar(i);
value: params.get('redirectquery')
        }
}));
    }
}
 
});
}
 
$( createNavigationBarToggleButton );


/** 대문의 탭을 "프로젝트"->"대문"으로 바꾸는 함수.
/* 편집 저장시 다른 문서나 CGI로 넘겨주기 끝 */
  * 작성자: [[사용자: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);


/** 임베드 플래시 무비
/** 기여 확인용 플러그인
  * 문서에 플래시 파일을 넣을 수 있게 합니다. [[틀:플래시]]를 참고하십시오.
  * 작성자: [[:Bd3076|Bd3076]]
* 원작성자: [[:en:User:Olipro|Olipro]]
  */
  */
function useFlash(){
function enoughEdit(){
var flashOk;
function compareEditCount(number, id1, id2){
var contentTempHolder;
var editCount = mw.config.get('wgUserEditCount');
$( embedFlashCheck );
if(editCount < number){
}
document.getElementById(id1).style.display = "block";
 
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( '@' );
else{
flwidth = obj[0];
document.getElementById(id2).style.display = "block";
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';
}
}
};
 
$('.editCompare').each(function(){
function embedFlashCheck() {
var num = $(this).attr("data-num");
if( !document.getElementById( 'embedFlashDoc' ) ) {
var enough = $(this).attr("data-id1");
return;
var nenough = $(this).attr("data-id2");
}
compareEditCount(num, enough, nenough);
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 );
$(enoughEdit);


/* 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) || [];
* id="setsub"
if(/trident/i.test(M[1])){
* 작성자: [[사용자:Gustmd7410|Gustmd7410]]
tem=/\brv[ :]+(\d+)/g.exec(ua) || [];
**/
return {name:'IE ',version:(tem[1]||'')};
function changeContentSub() {
var newsub = document.getElementById('setsub');
if(newsub) {
document.querySelector('#contentSub').innerHTML = newsub.innerHTML;
newsub.remove();
}
}
}
$(changeContentSub);
/* 상위 문서 링크 바꿔치기 끝 */


if(M[1]==='Chrome'){
/** [[틀:자동저장]]용 문서 미리 비워놓기
tem=ua.match(/\bOPR\/(\d+)/)
* 원출처: [[틀:자동저장/플러그인]]
if(tem!=null)   {return {name:'Opera', version:tem[1]};}
* 비 자동 인증된 사용자가 자동저장 겸용 문서에서 복붙을 할 때
* 문서를 덮어씌우지 않고 밑에 복붙을 하는 상황을 막기 위한 플러그인입니다.
*/
function nonautosaveready() {
/* autosave 편집모드가 아닐 경우 플러그인 종료 */
var searchParams = geturlSearch(location);
var isEditMode = searchParams.action === "edit";
var isAutosaveMode = searchParams.autosave === "1";
if (!(isEditMode && isAutosaveMode)) return "";
/* 자동 저장하기에 안전한 네임스페이스가 아닌 경우 플러그인 종료 */
var safeNameSpace = [""];
var thisNamespaceNumber = mw.config.get("wgNamespaceNumber");
var nameSpaceIds = mw.config.get("wgNamespaceIds");
var isSafeNameSpace = safeNameSpace
    .map(function (namespace) { return nameSpaceIds[namespace]; })
    .some(function (nsNumber) { return nsNumber == thisNamespaceNumber; });
    if (!(isSafeNameSpace)) return "";
   
    /* 자동 인증된 사용자가 일 경우 플러그인 종료 */
    var userGroups = mw.config.get('wgUserGroups');
    var autocheck = 0;
    if (userGroups) {
    for (var i = 0; i < userGroups.length; i++) {
    if (userGroups[i] === 'autoconfirmed') {
    autocheck++;
    }
    }
    }
    if (autocheck != 0) return "";
   
    /* 미리 비워놓기 */
    var savetemp = document.editform.wpTextbox1;
    savetemp.value = "";
    return;
}
}
$(nonautosaveready);
/* [[틀:자동저장]]용 문서 미리 비워놓기 끝 */


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를 통해 간단하게 문서들을 수집, 변경하는 함수.
/** mediawiki api를 통해 간단하게 문서들을 수집, 변경하는 함수.
  * 플러그인 코어에서 사용하기 위해 만들었습니다.
* @deprecated
  * 작성자: [[사용자:BANIP|BANIP]]
* 이 기능은 사용을 권장하지 않습니다. 대신 mw.Api를 사용해 주세요. (참조: https://doc.wikimedia.org/mediawiki-core/master/js/#!/api/mw.Api)
  * 사용방법  
* 동기 XHR은 정보를 가져오는 동안 페이지를 멈춰 현저한 성능 저하를 야기하여 WHATWG 표준에서 제외되었고, 이에 따라 최신 브라우저에서 작동하지 않게 되었습니다.
  *: var api = MediaWikiAPI(); .changeDocument()
* MediaWikiAPI는 동기 XHR 기능에 의존하도록 설계되었고, 이 기능을 사용하는 모든 기능들은 작동을 보장할 수 없게 되었습니다.
  *: api.changeDocument(변경할 문서의 타이틀, 편집 요약, 변경할 문서의 내용) => 문서의 내용을 변경합니다.
*
  *: api.addDocument(변경할 문서의 타이틀, 편집 요약, 추가할 문서의 내용) => 문서에 새로운 내용을 추가합니다.
* 플러그인 코어에서 사용하기 위해 만들었습니다.
  *: api.getDocument(가져올 문서의 타이틀) => 문서의 모든 텍스트를 읽어옵니다.
* 원작성자: [[사용자:BANIP|BANIP]], 수정자: [[사용자:Bd3076|Bd3076]]
  *: api.readDocument(가져올 문서의 타이틀) => 문서의 모든 텍스트를 jquery 객체로 읽어옵니다.
* 사용방법  
  * 영 좋지 않은 목적으로 사용 하면 안드로메다 경찰관이 잡아간다!
*: var api = MediaWikiAPI(); .changeDocument()
*/
*: api.changeDocument(변경할 문서의 타이틀, 편집 요약, 변경할 문서의 내용) => 문서의 내용을 변경합니다.
*: api.addDocument(변경할 문서의 타이틀, 편집 요약, 추가할 문서의 내용) => 문서에 새로운 내용을 추가합니다.
*: api.getDocument(가져올 문서의 타이틀) => 문서의 모든 텍스트를 읽어옵니다.
*: api.readDocument(가져올 문서의 타이틀) => 문서의 모든 텍스트를 jquery 객체로 읽어옵니다.
* 영 좋지 않은 목적으로 사용 하면 안드로메다 경찰관이 잡아간다!
*/


function MediaWikiAPI(){
function MediaWikiAPI() {
var token;
console.warn('권장하지 않는 MediaWikiAPI를 사용하고 있습니다. 대신 mw.Api를 사용해 주세요.');
var getToken = function(){
if(token != undefined) return token;
    var token;
    $.ajax({
    var getToken = function() {
        url:"/w/api.php?action=query&meta=tokens",
        if (token !== undefined) return token;
        success:function(v,i){
        $.ajax({
            var datas = JSON.parse($(v).find("pre").text());
            url: "/api.php?action=query&meta=tokens", // Note: URL은 서버 디렉토리 설정에 따라 바꾸어야 합니다.
            token = datas["query"]["tokens"]["csrftoken"];
            success: function(v, i) {
        },
                var datas = JSON.parse($(v).find("pre").text());
    async: false
                token = datas.query.tokens.csrftoken;
    })
            },
    return token;
            async: false
}
        });
        return token;
    };


function changeDocument( title, summary, content ) {
    function changeDocument(title, summary, content, isUnReload, minor) {
    $.ajax({
    mw.loader.using( ['mediawiki.util','mediawiki.Title'] ).then( function () {
        url: mw.util.wikiScript("api"),
    $.ajax({
        data: {
            url: mw.util.wikiScript("api"),
            format: 'json',
            data: {
            action: 'edit',
                format: 'json',
            title: title,
                action: 'edit',
            summary: summary,
                title: title,
            text: content,
                summary: summary,
            token: getToken(),
                text: content,
        },
                minor: minor,
        dataType: 'json',
                token: getToken(),
        type: 'POST',
            },
        success: function( data ) {
            dataType: 'json',
            if ( data && data.edit && data.edit.result == 'Success' ) {
            type: 'POST',
                window.location.reload(); // reload page if edit was successful
            success: function(data) {
            } else if ( data && data.error ) {
                if (data && data.edit && data.edit.result == 'Success') {
                alert( 'Error: API returned error code "' + data.error.code + '": ' + data.error.info );
                    if (!isUnReload) window.location.reload(); // reload page if edit was successful
            } else {
                } else if (data && data.error) {
                alert( 'Error: Unknown result from API.' );
                    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.');
            }
            }
        },
        });
        error: function( xhr ) {
} );
            alert( 'Error: Request failed.' );
    }
        }
    });
}


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


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: "/" + wgScriptPath + "?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: "/" + wgScriptPath + "/" + 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,
     }
     };
}
}


/** @function fetchScript
* 체크섬을 활용해 보다 안전하게 외부 스크립트를 가져올 수 있음
* @author hsl0
**/
var fetchScript = fetch? function fetchScript(url, integrity) {
    return fetch(url, {
        header: {
            Accept: [
                'application/javascript',
                'application/ecmascript',
                'text/javascript',
                'application/x-javascript',
                '*/*'
            ]
        },
        integrity: integrity
    }).then(function(res) {
        return res.text().then(function(text) {
        new Function(text)();
        return new $.Deferred().resolve(text, res.statusText, res).promise();
        });
    });
} : $.getScript;
/**
* API 에러가 반환될 경우 알려주는 함수
* 저작자: [[사용자:hsl0|hsl0]]
**/
function notifyApiError(msg, option, code, object) {
option = option || {};
mw.notification.notify(
        code === 'http'?
            $('<span />')
                .append($('<p />', {class: 'api-errmsg'}).text(object.xhr.responseText).html(option.additionalMessage || ''))
                .append($('<code />', {class: 'api-errcode'}).text('HTTP ' + object.xhr.status)) :
            $('<span />')
                .append($('<p />', {class: 'api-errmsg'}).text(object.error.info).html(option.additionalMessage || ''))
                .append($('<code />', {class: 'api-errcode'}).text(code)),
        {
            title: msg,
            type: 'error',
            tag: option.tag,
            autoHideSeconds: 'long'
        }
    );
}
/** 링크경고
* 자바스크립트로 링크에 경고를 넣을 수 있습니다.
* 제작자: [[사용자:hsl0|hsl0]]
**/
function linkWarn(element, msg, msgClass) {
return $(element)
.addClass('linkwarn tooltip')
.append($('<span class="tooltip-msg" />').append(msg).addClass(msgClass || 'messagebox'));
}


/** [[:플러그인]]을 사용 가능하게 해 줍니다. 사용자의 허락을 맡고 사용자의 commonjs 편집을 허가 할 수 있는 문서입니다.
/**
  * 작성자: [[사용자:BANIP|BANIP]]
* [[리버티게임:오락실/2023년_8월#사이드바 '임의의 게임으로' 기능 관련]]
  * [[백괴게임:관리자 요청/2018년 1월]]에서 BANIP님 요청으로 퍼왔습니다.
* --[[사용자:BANIP|BANIP]] ([[사용자토론:BANIP|토론]]) 2023년 8월 14일 (월) 10:36 (KST)
  */
*/
function pluginCore(){
$(function(){
// 사용자의 commonjs의 문서 이름을 획득
    var triggered = false;
var commonjs = "사용자:" + mw.config.get("wgUserName") + "/common.js";
    var $linkwrapper = $("#n-randompage, .move-randompage").find("a");
var plugins = {}, docPlugins = {}, uninstalledPlugins = {}, unupdatedPlugins = {};
//[[틀:임의_게임]] 구현, 사이드바 임의게임으로 링크 바인딩
var preloadedplugins = [], needPlugins = [];
$linkwrapper.on("click",function(e){
var api = MediaWikiAPI();
var category = $(this).closest(".move-randompage").data("category") || undefined
var jsdoc = api.getDocument(commonjs);
e.preventDefault();
        if(triggered) return;
        triggered = true;


//commonjs에서 특정 플러그인 제거
(new mw.Api()).get({
function removePluginByDoc(pluginTitle,doc){
    action: 'parse',
var reg = new RegExp("\\/\\*\\* 플러그인 "+pluginTitle+"([\\s\\S]*)\\/\\* "+pluginTitle+" 끝 \\*\\/","g");
    page: '리버티게임:임의 게임',
doc = doc.replace(reg,"");
    formatversion: 2,
return doc
    category:category
}
}).then(function(res){
    var page = $(res.parse.text).find(".redirect-random-page").text().trim();
    location.href = mw.util.getUrl(page);
}).catch(function(){
    location.href = mw.util.getUrl("리버티게임:임의 게임",{category:category});
});
}).attr("rel","nofollow");


// 플러그인이 비어있는지 확인
//[[리버티게임:임의_게임]] 구현
function isPluginsEmpty(plugins){
if($("#content .redirect-random-page").length){
return Object.keys(plugins).length === 0;
    history.replaceState(null, null, mw.util.getUrl($("#content .redirect-random-page").text().trim()));
    location.reload();
}
}
});


//플러그인의 모든 키 순회
/**
function forEach(object, callback){
* 리버티게임 인기 게임 순위 정렬
for(var key in object){
* --[[사용자:Senouis|Senouis]] ([[사용자토론:Senouis|토론]]) 2024년 8월 12일 () 22:05 (KST)
var variable = object[key];
*/
callback(variable,key);
$(function (){
}
var sectionRatings = document.getElementsByClassName("section-ratings");
}
if (sectionRatings.length === 0) return;
 
for (var i in sectionRatings){
// 문서에서 사용하는 플러그인들을 체크합니다. use-script클래스를 가진 모든 돔 요소를 조사하고
var param1 = sectionRatings.item(i).innerText;
// 그 돔에 내장된 플러그인 데이터를 docPlugins에 추가합니다.
fetch("https://dev.libertygame.work/rest.php/sectionratings/v0/ratings/"+param1+"/4").then(function (result){return result.json();}).then(function (result){
var checkDocPlugin = (function(docPlugins){
if (result.result !== "SUCCESS") return;
function getPluginData($this){
if (!result.category) return;
return {
var sectionRatings = document.getElementsByClassName("section-ratings");
name : $this.attr("data-name"), // 플러그인 이름
if (Object.keys(result.gameList).length === 0){
descript : $this.attr("data-descript"), // 플러그인 내용
for (var k in sectionRatings){
version : $this.attr("data-version"), // 플러그인 이름
if (sectionRatings.item(k).innerText === result.category){
local : ($this.attr("data-local") == "true") ? true : false,
sectionRatings.item(k).innerText = "\n\n\n\n\n\n";
creat : $this.attr("data-creat"),
break;
state : $this.attr("data-state"),
}
link : $this.attr("data-link"),
}
executable: $this.attr("data-executable") ? true : false,
return;
};
}
 
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 );
}
}
}
var tempElement = document.createElement("div");
 
tempElement.innerHTML = result.parseResult;
if(!isPluginsEmpty(docPlugins)){
for (var j in sectionRatings){
preloadedplugins = getUserPlugins(jsdoc);
if (sectionRatings.item(j).innerText === result.category){
forEach(docPlugins,function(docplugin){
sectionRatings.item(j).innerText = "";
var isHavePlugin = false;
var elemlist = tempElement.querySelectorAll(".gamecard");
forEach(preloadedplugins,function(myplugin){
console.log(elemlist);
if( !isSamePlugin(docplugin,myplugin) ) return;
for (var idx in elemlist){
if( !isSameVersionPlugin(docplugin,myplugin) ){
try{
unupdatedPlugins[docplugin.name] = docplugin;
var elem = elemlist.item(idx);
sectionRatings.item(j).appendChild(elem);
} catch (e) {
continue;
}
}
}
isHavePlugin = true;
break; // 작업 종료
});
 
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;
}
}
}).catch(function(e){console.log(e);});
}
});


function getDocFoot(plugin){
/**
var docFoot = "";
* DisucussionTools가 알림 상자 틀을 망가뜨리는 문제 해결을 위한 스크립트
if(plugin.local) docFoot += "\n  }\n";
* --[[사용자:Senouis|Senouis]] ([[사용자토론:Senouis|토론]]) 2024년 8월 30일 () 11:47 (KST)
docFoot += "\n}\n";
*/
if(plugin.executable) docFoot += "$( plugin_" + plugin["name"] + " );\n";
docFoot += "/* " + plugin["name"] + " 끝 */\n\n";
return docFoot;
}


var docHead = getDocHead(plugin), docFoot = getDocFoot(plugin);
$(function (){
return entityDecode(docHead + plugin["code"] + docFoot);
var amboces = document.getElementsByClassName("template-ambox");
}
if (amboces.length === 0) return;
for (var i in amboces) {
    var problemistic = amboces.item(i).querySelector("div div span:first-child");
    if (problemistic.id.substring(0,2) === "c-") {
    problemistic.style.display = "none";
    }
}
});


$(".install-button").text("설치중..");
/**
$(".install-button").off("click");
* 일반 이름공간 내에 있는 특정 분류의 문서 갯수를 가져오는 API 요청
 
* --[[사용자:Senouis|Senouis]] ([[사용자토론:Senouis|토론]]) 2024년 9월 18일 () 00:22 (KST)
var doc = "";
*/
forEach(needPlugins,function(pluginName){
$(function () {
var plugin = docPlugins[pluginName];
var categorylist = document.getElementsByClassName("pagecount");
jsdoc = removePluginByDoc(pluginName,jsdoc);
var parameter = [];
doc += getPluginCode( plugin );
for (var i in categorylist){
});
var param = categorylist.item(i).innerText; // 이름공간을 제외하고 공백을 언더바(_)로 바꾼 분류 이름(예: 철도_교통_게임)을 파라미터로 함
api.changeDocument(commonjs,"플러그인 "+ needPlugins +"설치", jsdoc + doc);
parameter.push(param); // namespace 0번(일반 이름공간) 내 분류 갯수를 세도록 파라미터를 삽입한다.
}
}
 
fetch("https://dev.libertygame.work/rest.php/sectionratings/v0/categorycounter/"+parameter.join("|")+"/0").then(function (result){return result.json();}).then(function (result) {
var checkinstalledPlugin = function(){
var categorylist = document.getElementsByClassName("pagecount");
function appendBox(plugin,status){
for (var i in result.count) {
var pluginName = plugin.name;
for (var j in categorylist){
var box = $(".cloneable.p-box").clone().removeClass("cloneable");
if (categorylist.item(j).innerText === result.category[i]){ // 파라미터와 result.category가 같으면 치환
var code = api.readDocument( plugin.state ).find("pre.script").html();
categorylist.item(j).innerText = result.count[i] === null ? 0 : result.count[i];
docPlugins[pluginName].code = code;
categorylist.item(j).style.display = "initial";
box.find(".p-status").html( status );
break;
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 )

2024년 9월 19일 (목) 01:22 기준 최신판

/* -- 전역 상수 선언 -- */
// 미디어위키 폴더명 url 다뤄야되는 함수들에서 사용됨, 메인터넌스 거친 후 w 혹은 wiki로 변경 예정, 
var wgScriptPath = "index.php";
/* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */
/** 플러그인이 작동하지 않을 때 나타나는 내용
 * js: noPlugin('(이름)');
 * html: class="noplugin-(이름)"
 * 작성자: [[사용자:Gustmd7410|Gustmd7410]] */
 
function noPlugin(name) {
    $('.noplugin-' + name).each(function() {
        $(this).remove();
    });
}

// [[미디어위키:common.js]] 미작동시: class="noplugin"
$('.noplugin').each(function() {
    $(this).remove();
});

/* window.location.search를 객체 형태로 반환
 @param {object} location 획득할 로케이션 객체, 비어있으면 window.location을 참조
 원작성자: [[사용자:BANIP|BANIP]]
 현 편집자: [[사용자:hsl0|hsl0]]
*/

function geturlSearch(location) {
	if(!location) location = window.location;
	else if(typeof location === 'string') location = new URL(location);
    var result = {};
    if (location.search)
        location.search.substring(1).replace(/\+/g, ' ').split("&").map(function(v) {
            return v.split("=");
        }).forEach(function(v) {
            result[decodeURIComponent(v[0])] = decodeURIComponent(v[1]);
        });
    return result;
}


/* 객체형태로 된 SearchParam을 받아 string형태로 반환
 원작성자: [[사용자:BANIP|BANIP]]
*/
function searchParamToString(searchParamsObj){
	return "?" + Object.entries(searchParamsObj).map(function(v){
		return v.map(function(v) {
			return encodeURIComponent(v);
		}).join("=");
	}).join("&");
}

/** [[백괴게임:연습장]] 문서 내용 비우기
 * 작성자: [[사용자:*devunt]]
 */
$(function() {
    if (mw.config.get("wgPageName") != "리버티게임:연습장")
        return;

    if (document.URL.lastIndexOf("action=edit") != -1) {
        if (document.URL.lastIndexOf("fakeaction=clean") == -1)
            return;

        var dbindex = document.editform.wpTextbox1;
        dbindex.value = "<!-- 이 줄은 지우지 마세요 -->{{리버티게임:연습장/안내문}}[["+"분류:리버티게임 도움말]]";
        document.editform.wpSummary.value = "연습장 비움";
        document.editform.wpSave.click();
        return;
    }
});

/* 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]
    };

}


/** 편집 저장시 다른 문서나 CGI로 넘겨주기
 * ?action=edit&redirectquery=(params)
 * 작성자: [[사용자:Gustmd7410|Gustmd7410]]
**/
$(function() {
	// 현재 URL 파라미터
	var params;
	
	// URLSearchParams 호환시
	if(URLSearchParams) params = new URLSearchParams(location.search);
	// 비호환시 geturlSearch() 사용
	else {
		// Map 호환시
		if(Map) params = new Map(Object.entries(geturlSearch()));
		// 비호환시 mw.Map 사용
		else {
			params = new mw.Map();
			params.values = geturlSearch();
			params.has = params.exists;
		}
	}
	
	// 편집창에서 redirectquery 파라미터가 있을때
	if(params.has('redirectquery')) {
		// 편집 폼에 wpExtraQueryRedirect 파라미터 input 요소 추가
		$('#editform').append($('<input />', {
			type: 'hidden',
			name: 'wpExtraQueryRedirect',
			value: params.get('redirectquery')
		}));
	}
});

/* 편집 저장시 다른 문서나 CGI로 넘겨주기 끝 */


/** 기여 확인용 플러그인
 * 작성자: [[사:Bd3076|Bd3076]]
 */
function enoughEdit(){
	function compareEditCount(number, id1, id2){
		var editCount = mw.config.get('wgUserEditCount');
		if(editCount < number){
			document.getElementById(id1).style.display = "block";
		}
		else{
			document.getElementById(id2).style.display = "block";
		}
	}
	
	$('.editCompare').each(function(){
		var num = $(this).attr("data-num");
		var enough = $(this).attr("data-id1");
		var nenough = $(this).attr("data-id2");
		compareEditCount(num, enough, nenough);
	});
}
$(enoughEdit);

/* 기여 확인용 플러그인 끝 */

/** 상위 문서 링크 바꿔치기
 * id="setsub"
 * 작성자: [[사용자:Gustmd7410|Gustmd7410]]
**/
function changeContentSub() {
	var newsub = document.getElementById('setsub');
	if(newsub) {
		document.querySelector('#contentSub').innerHTML = newsub.innerHTML;
		newsub.remove();
	}
}
$(changeContentSub);
/* 상위 문서 링크 바꿔치기 끝 */

/** [[틀:자동저장]]용 문서 미리 비워놓기
 * 원출처: [[틀:자동저장/플러그인]]
 * 비 자동 인증된 사용자가 자동저장 겸용 문서에서 복붙을 할 때 
 * 문서를 덮어씌우지 않고 밑에 복붙을 하는 상황을 막기 위한 플러그인입니다.
 */
 
 function nonautosaveready() {
 	
 	/* autosave 편집모드가 아닐 경우 플러그인 종료 */
	var searchParams = geturlSearch(location);
	var isEditMode = searchParams.action === "edit";
	var isAutosaveMode = searchParams.autosave === "1";
	if (!(isEditMode && isAutosaveMode)) return "";
	
	/* 자동 저장하기에 안전한 네임스페이스가 아닌 경우 플러그인 종료 */
	var safeNameSpace = [""];
	var thisNamespaceNumber = mw.config.get("wgNamespaceNumber");
	var nameSpaceIds = mw.config.get("wgNamespaceIds");
	var isSafeNameSpace = safeNameSpace
    .map(function (namespace) { return nameSpaceIds[namespace]; })
    .some(function (nsNumber) { return nsNumber == thisNamespaceNumber; });
    if (!(isSafeNameSpace)) return "";
    
    /* 자동 인증된 사용자가 일 경우 플러그인 종료 */
    var userGroups = mw.config.get('wgUserGroups');
    var autocheck = 0;
    if (userGroups) {
    	for (var i = 0; i < userGroups.length; i++) {
    		if (userGroups[i] === 'autoconfirmed') {
    			autocheck++;
    		}
    	}
    }
    if (autocheck != 0) return "";
    
    /* 미리 비워놓기 */
    var savetemp = document.editform.wpTextbox1;
    savetemp.value = "";
    return;
}
$(nonautosaveready);
/* [[틀:자동저장]]용 문서 미리 비워놓기 끝 */


/** mediawiki api를 통해 간단하게 문서들을 수집, 변경하는 함수.
 * @deprecated
 * 이 기능은 사용을 권장하지 않습니다. 대신 mw.Api를 사용해 주세요. (참조: https://doc.wikimedia.org/mediawiki-core/master/js/#!/api/mw.Api)
 * 동기 XHR은 정보를 가져오는 동안 페이지를 멈춰 현저한 성능 저하를 야기하여 WHATWG 표준에서 제외되었고, 이에 따라 최신 브라우저에서 작동하지 않게 되었습니다.
 * MediaWikiAPI는 동기 XHR 기능에 의존하도록 설계되었고, 이 기능을 사용하는 모든 기능들은 작동을 보장할 수 없게 되었습니다.
 * 
 * 플러그인 코어에서 사용하기 위해 만들었습니다.
 * 원작성자: [[사용자:BANIP|BANIP]], 수정자: [[사용자:Bd3076|Bd3076]]
 * 사용방법 
 *: var api = MediaWikiAPI(); .changeDocument()
 *: api.changeDocument(변경할 문서의 타이틀, 편집 요약, 변경할 문서의 내용) => 문서의 내용을 변경합니다.
 *: api.addDocument(변경할 문서의 타이틀, 편집 요약, 추가할 문서의 내용) => 문서에 새로운 내용을 추가합니다.
 *: api.getDocument(가져올 문서의 타이틀) => 문서의 모든 텍스트를 읽어옵니다.
 *: api.readDocument(가져올 문서의 타이틀) => 문서의 모든 텍스트를 jquery 객체로 읽어옵니다.
 * 영 좋지 않은 목적으로 사용 하면 안드로메다 경찰관이 잡아간다!
 */

function MediaWikiAPI() {
	console.warn('권장하지 않는 MediaWikiAPI를 사용하고 있습니다. 대신 mw.Api를 사용해 주세요.');
	
    var token;
    var getToken = function() {
        if (token !== undefined) return token;
        $.ajax({
            url: "/api.php?action=query&meta=tokens", // Note: URL은 서버 디렉토리 설정에 따라 바꾸어야 합니다.
            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, isUnReload, minor) {
    	mw.loader.using( ['mediawiki.util','mediawiki.Title'] ).then( function () {
		    $.ajax({
	            url: mw.util.wikiScript("api"),
	            data: {
	                format: 'json',
	                action: 'edit',
	                title: title,
	                summary: summary,
	                text: content,
	                minor: minor,
	                token: getToken(),
	            },
	            dataType: 'json',
	            type: 'POST',
	            success: function(data) {
	                if (data && data.edit && data.edit.result == 'Success') {
	                    if (!isUnReload) 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, isUnReload, minor) {
        originContent = getDocument(title);
        changeDocument(title, summary, originContent + content, isUnReload, minor);
    }

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

        var originContent;
        $.ajax({
            url: "/" + wgScriptPath + "?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: "/" + wgScriptPath + "/" + 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,
    };
}

/** @function fetchScript
 * 체크섬을 활용해 보다 안전하게 외부 스크립트를 가져올 수 있음
 * @author hsl0
**/
var fetchScript = fetch? function fetchScript(url, integrity) {
    return fetch(url, {
        header: {
            Accept: [
                'application/javascript',
                'application/ecmascript',
                'text/javascript',
                'application/x-javascript',
                '*/*'
            ]
        },
        integrity: integrity
    }).then(function(res) {
        return res.text().then(function(text) {
        	new Function(text)();
        	return new $.Deferred().resolve(text, res.statusText, res).promise();
        });
    });
} : $.getScript;
/**
 * API 에러가 반환될 경우 알려주는 함수
 * 저작자: [[사용자:hsl0|hsl0]]
 **/
function notifyApiError(msg, option, code, object) {
	option = option || {};
	mw.notification.notify(
        code === 'http'?
            $('<span />')
                .append($('<p />', {class: 'api-errmsg'}).text(object.xhr.responseText).html(option.additionalMessage || ''))
                .append($('<code />', {class: 'api-errcode'}).text('HTTP ' + object.xhr.status)) : 
            $('<span />')
                .append($('<p />', {class: 'api-errmsg'}).text(object.error.info).html(option.additionalMessage || ''))
                .append($('<code />', {class: 'api-errcode'}).text(code)),
        {
            title: msg,
            type: 'error',
            tag: option.tag,
            autoHideSeconds: 'long'
        }
    );
}
/** 링크경고
 * 자바스크립트로 링크에 경고를 넣을 수 있습니다.
 * 제작자: [[사용자:hsl0|hsl0]]
**/
function linkWarn(element, msg, msgClass) {
	return $(element)
		.addClass('linkwarn tooltip')
		.append($('<span class="tooltip-msg" />').append(msg).addClass(msgClass || 'messagebox'));
}

/**
 * [[리버티게임:오락실/2023년_8월#사이드바 '임의의 게임으로' 기능 관련]]
 * --[[사용자:BANIP|BANIP]] ([[사용자토론:BANIP|토론]]) 2023년 8월 14일 (월) 10:36 (KST)
 */
$(function(){
    var triggered = false;
    var $linkwrapper = $("#n-randompage, .move-randompage").find("a");
	//[[틀:임의_게임]] 구현, 사이드바 임의게임으로 링크 바인딩
	$linkwrapper.on("click",function(e){
		var category = $(this).closest(".move-randompage").data("category") || undefined
		e.preventDefault();
        if(triggered) return;
        triggered = true;

		(new mw.Api()).get({
		    action: 'parse',
		    page: '리버티게임:임의 게임',
		    formatversion: 2,
		    category:category
		}).then(function(res){
		    var page = $(res.parse.text).find(".redirect-random-page").text().trim();
		    location.href = mw.util.getUrl(page);
		}).catch(function(){
		    location.href = mw.util.getUrl("리버티게임:임의 게임",{category:category});
		});
	}).attr("rel","nofollow");

	//[[리버티게임:임의_게임]] 구현
	if($("#content .redirect-random-page").length){
    	history.replaceState(null, null, mw.util.getUrl($("#content .redirect-random-page").text().trim()));
    	location.reload();
	}
});

/**
 * 리버티게임 인기 게임 순위 정렬
 * --[[사용자:Senouis|Senouis]] ([[사용자토론:Senouis|토론]]) 2024년 8월 12일 (월) 22:05 (KST)
*/
$(function (){
	var sectionRatings = document.getElementsByClassName("section-ratings");
	if (sectionRatings.length === 0) return;
	for (var i in sectionRatings){
		var param1 = sectionRatings.item(i).innerText;
		fetch("https://dev.libertygame.work/rest.php/sectionratings/v0/ratings/"+param1+"/4").then(function (result){return result.json();}).then(function (result){
			if (result.result !== "SUCCESS") return;
			if (!result.category) return;
			var sectionRatings = document.getElementsByClassName("section-ratings");
			if (Object.keys(result.gameList).length === 0){
				for (var k in sectionRatings){
					if (sectionRatings.item(k).innerText === result.category){
						sectionRatings.item(k).innerText = "\n\n\n\n\n\n";
						break;
					}
				}
				return;
			}
			var tempElement = document.createElement("div");
			tempElement.innerHTML = result.parseResult;
			for (var j in sectionRatings){
				if (sectionRatings.item(j).innerText === result.category){
					sectionRatings.item(j).innerText = "";
					var elemlist = tempElement.querySelectorAll(".gamecard");
					console.log(elemlist);
					for (var idx in elemlist){
						try{
							var elem = elemlist.item(idx);
							sectionRatings.item(j).appendChild(elem);
						} catch (e) {
							continue;
						}
					}
					break; // 작업 종료
				}
			}
		}).catch(function(e){console.log(e);});
	}
});

/**
 * DisucussionTools가 알림 상자 틀을 망가뜨리는 문제 해결을 위한 스크립트
 * --[[사용자:Senouis|Senouis]] ([[사용자토론:Senouis|토론]]) 2024년 8월 30일 (금) 11:47 (KST)
*/

$(function (){
	var amboces = document.getElementsByClassName("template-ambox");
	if (amboces.length === 0) return;
	for (var i in amboces) {
	    var problemistic = amboces.item(i).querySelector("div div span:first-child");
	    if (problemistic.id.substring(0,2) === "c-") {
	    	problemistic.style.display = "none";
	    }
	}
});

/**
 * 일반 이름공간 내에 있는 특정 분류의 문서 갯수를 가져오는 API 요청
 * --[[사용자:Senouis|Senouis]] ([[사용자토론:Senouis|토론]]) 2024년 9월 18일 (수) 00:22 (KST)
*/
$(function () {
	var categorylist = document.getElementsByClassName("pagecount");
	var parameter = [];
	for (var i in categorylist){
		var param = categorylist.item(i).innerText; // 이름공간을 제외하고 공백을 언더바(_)로 바꾼 분류 이름(예: 철도_교통_게임)을 파라미터로 함
		parameter.push(param); // namespace 0번(일반 이름공간) 내 분류 갯수를 세도록 파라미터를 삽입한다.
	}
	fetch("https://dev.libertygame.work/rest.php/sectionratings/v0/categorycounter/"+parameter.join("|")+"/0").then(function (result){return result.json();}).then(function (result) {
		var categorylist = document.getElementsByClassName("pagecount");
		for (var i in result.count) {
			for (var j in categorylist){
				if (categorylist.item(j).innerText === result.category[i]){ // 파라미터와 result.category가 같으면 치환
					categorylist.item(j).innerText = result.count[i] === null ? 0 : result.count[i];
					categorylist.item(j).style.display = "initial";
					break;
				}
			}
		}
	});
});