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

리버티게임, 모두가 만들어가는 자유로운 게임
imported>Senouis
(이전 완료)
imported>Senouis
편집 요약 없음
293번째 줄: 293번째 줄:




/** 임베드 플래시 무비
/** mediawiki api를 통해 간단하게 문서들을 수집, 변경하는 함수.
  * 문서에 플래시 파일을 넣을 수 있게 합니다. [[:플래시]]를 참고하십시오.
  * 플러그인 코어에서 사용하기 위해 만들었습니다.
  * 원작성자: [[:en:User:Olipro|Olipro]]
* 원작성자: [[사용자:BANIP|BANIP]], 수정자: [[사용자:Bd3076|Bd3076]]
* 사용방법
*: var api = MediaWikiAPI(); .changeDocument()
  *: api.changeDocument(변경할 문서의 타이틀, 편집 요약, 변경할 문서의 내용) => 문서의 내용을 변경합니다.
*: api.addDocument(변경할 문서의 타이틀, 편집 요약, 추가할 문서의 내용) => 문서에 새로운 내용을 추가합니다.
*: api.getDocument(가져올 문서의 타이틀) => 문서의 모든 텍스트를 읽어옵니다.
*: api.readDocument(가져올 문서의 타이틀) => 문서의 모든 텍스트를 jquery 객체로 읽어옵니다.
* 영 좋지 않은 목적으로 사용 하면 안드로메다 경찰관이 잡아간다!
  */
  */
// 플래시 사용 중지에 따라 이 기능은 비활성화됩니다.
/*
function useFlash() {
    var flashOk;
    var contentTempHolder;
    $(embedFlashCheck);
}


function embedFlashMovie(flashOk) {
function MediaWikiAPI() {
     mainbody = document.getElementById('bodyContent');
     var token;
     mainbody.innerHTML = contentTempHolder;
    var getToken = function() {
     spancheck = document.getElementsByTagName('span');
        if (token !== undefined) return token;
    for (i = 0; i < spancheck.length; i++) {
        $.ajax({
        if (spancheck[i].getAttribute('id') != 'embedFlashDoc') {
            url: "/w/api.php?action=query&meta=tokens",
             continue;
            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();
         }
         }
        obj = spancheck[i].innerHTML.split('@');
 
         flwidth = obj[0];
         var originContent;
         flheight = obj[1];
         $.ajax({
        flfile = obj[2].replace('fullurl://', 'https://');
             url: "/w/index.php?title=" + title + "&action=edit",
        showFlash = ' ';
             success: function ajaxSucess(data) {
        if (flashOk) {
                originContent = $(data).find("textarea").html();
             showFlash = '<object width="' + flwidth + '" height="' + flheight + '"';
            },
            showFlash += 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"';
            async: false
            showFlash += 'codebase="http://fpdownload.macromedia.com/pub/';
         });
            showFlash += 'shockwave/cabs/flash/swflash.cab#version=8,0,0,0">';
         return entityDecode(originContent);
            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() {
    function readDocument(title) {
    if (!document.getElementById('embedFlashDoc')) {
        var doc;
         return;
        $.ajax({
            url: "/wiki/" + title,
            success: function ajaxSucess(data) {
                doc = $(data).find("#mw-content-text");
            },
            async: false
        });
         return doc;
     }
     }
    mainbody = document.getElementById('bodyContent');
 
    contentTempHolder = mainbody.innerHTML;
 
     if (typeof displayFlashOverride != 'undefined') {
     return {
         embedFlashMovie(displayFlashOverride);
         getToken: getToken,
         return;
         changeDocument: changeDocument,
    }
        addDocument: addDocument,
    askmessage = '<div align="center" id="askflash">이 게임에는 ';
        getDocument: getDocument,
    askmessage += '<a href="/wiki/백괴:플래시" class="plainlinks">플래시</a>가 들어있습니다.<br />';
        readDocument: readDocument,
    askmessage += '컴퓨터에 해를 끼칠 수 있으므로 신뢰하는 경우에만 여십시오.<br />';
     };
    askmessage += '플래시가 포함된 게임을 보시겠습니까?<br><b> ';
    askmessage += '<a href="javascript:embedFlashMovie(true)" ';
    askmessage += 'onClick="embedFlashMovie(true)">예</a> | <a ';
    askmessage += 'href="https://libertygame.miraheze.org/">아니오</a>';
     mainbody.innerHTML = askmessage;
}
}
$(useFlash);
*/

2020년 12월 28일 (월) 17:28 판

/* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */
/*<source lang="javascript"><nowiki>*/

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

function UserNameReplace() {
    if (typeof(disableUsernameReplace) != 'undefined' && disableUsernameReplace) return;
    if (!document.getElementById('pt-userpage')) return;
    $("span.insertusername").each(function(i) {
        $(this).text(mw.config.get("wgUserName"))
    })
};
$(UserNameReplace);

/** 플러그인이 작동하지 않을 때 나타나는 내용
 * 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]]
*/
function geturlSearch(location) {
	location = location || window.location;
	var result = {};
	if(location.search) decodeURIComponent(location.search)
		.substring(1)
		.split("&")
		.map(function(v) { return v.split("=") })
		.forEach(function(v) { result[v[0]] = v[1] });
	return result;url.hash = encodeURIComponent(hash);
}

/* 객체형태로 된 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]
    };

}

/** paramtest 함수
 * [[틀:CGI2|CGI2]] 등에 적용되는 searchParams 메소드 지원 여부를 판단하는 함수
 * 작성자: [[사용자:Manymaster|manymaster]]
 */

function paramtest() {
    var test_code;
    var Params = new URL(document.location).searchParams;
    if (Params === undefined) {
        test_code = 0;
    } else {
        test_code = 1;
    }
    return test_code;
}

/** paraminfo 함수
 * paramtest의 부속 함수로 searchParams 메소드 지원시 지정한 메시지를 숨길 수 있게 해주는 함수
 * 메시지는 searchparam_test 클래스로 지정하여 숨길 수 있습니다. */
function paraminfo() {
    var test_code = paramtest();
    if (test_code == 0) {
        return;
    } else {
        for (var i = 0; i < document.getElementsByClassName("searchparam_test").length; i++) {
            document.getElementsByClassName("searchparam_test")[i].style.display = "none";
        }
    }
}

$(paraminfo);
/* paramtest 및 부속 함수 끝 */

/** 스크립트의 함수를 실행시키는 링크 만들기
 * $('(객체)').each(function() {
       scriptLink(this);
       $(this).click(function () {
           (함수)
       });
   });
 * 작성자: [[사용자:Gustmd7410|Gustmd7410]] */
 
function scriptLink(element) {
    $(element).html('<a>' + $(element).html() + '</a>');
}

/**
 * [[백괴게임:댸문]]문서의 일부 링크를 낚시문서로 바꿔치기
 * 원작성자: [[사용자:BANIP|BANIP]]
 */
 $(function(){
 	var gate = document.getElementsByClassName("fakegate");
    if (gate[0] === undefined || gate[0] === null) {
    return;
    } else{
	 	var targetLink = "https://libertygame.miraheze.org/wiki/"+gate[0].innerHTML;
		$("#bodyContent a").attr("href",targetLink);
	 }
 })
 /* [[백괴게임:댸문]]문서의 일부 링크를 낚시문서로 바꿔치기 끝 */

/** 편집 저장시 다른 문서나 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를 통해 간단하게 문서들을 수집, 변경하는 함수.
 * 플러그인 코어에서 사용하기 위해 만들었습니다.
 * 원작성자: [[사용자:BANIP|BANIP]], 수정자: [[사용자:Bd3076|Bd3076]]
 * 사용방법 
 *: 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, 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: "/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,
    };
}