미디어위키:Common.js: 두 판 사이의 차이
둘러보기로 이동
검색으로 이동
백괴게임>Manymaster 편집 요약 없음 |
(임시 테스트) |
||
(사용자 13명의 중간 판 234개는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
/* -- 전역 상수 선언 -- */ | |||
// 미디어위키 폴더명 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를 객체 형태로 반환 | /* window.location.search를 객체 형태로 반환 | ||
@param {object} location 획득할 로케이션 객체, 비어있으면 window.location을 참조 | @param {object} location 획득할 로케이션 객체, 비어있으면 window.location을 참조 | ||
원작성자: [[사용자:BANIP|BANIP]] | |||
현 편집자: [[사용자:hsl0|hsl0]] | |||
*/ | */ | ||
function geturlSearch(location) { | function geturlSearch(location) { | ||
if(!location) location = window.location; | |||
var result = {} | else if(typeof location === 'string') location = new URL(location); | ||
var result = {}; | |||
.substring(1) | 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; | return result; | ||
} | } | ||
/* 객체형태로 된 SearchParam을 받아 string형태로 반환 | /* 객체형태로 된 SearchParam을 받아 string형태로 반환 | ||
원작성자: [[사용자:BANIP|BANIP]] | |||
*/ | */ | ||
function searchParamToString(searchParamsObj){ | function searchParamToString(searchParamsObj){ | ||
return "?" + Object.entries(searchParamsObj).map(function(v){ | |||
.map(function(v){ return v.join("=") }) | return v.map(function(v) { | ||
return encodeURIComponent(v); | |||
}).join("="); | |||
}).join("&"); | |||
} | } | ||
31번째 줄: | 54번째 줄: | ||
*/ | */ | ||
$(function() { | $(function() { | ||
if (mw.config.get("wgPageName") != " | if (mw.config.get("wgPageName") != "리버티게임:연습장") | ||
return; | return; | ||
39번째 줄: | 62번째 줄: | ||
var dbindex = document.editform.wpTextbox1; | var dbindex = document.editform.wpTextbox1; | ||
dbindex.value = "<!-- 이 줄은 지우지 마세요 -->{{연습장 안내문}}"; | dbindex.value = "<!-- 이 줄은 지우지 마세요 -->{{리버티게임:연습장/안내문}}[["+"분류:리버티게임 도움말]]"; | ||
document.editform.wpSummary.value = "연습장 비움"; | document.editform.wpSummary.value = "연습장 비움"; | ||
document.editform.wpSave.click(); | document.editform.wpSave.click(); | ||
45번째 줄: | 68번째 줄: | ||
} | } | ||
}); | }); | ||
/* userAgent */ | /* userAgent */ | ||
358번째 줄: | 84번째 줄: | ||
if (M[1] === 'Chrome') { | if (M[1] === 'Chrome') { | ||
tem = ua.match(/\bOPR\/(\d+)/) | tem = ua.match(/\bOPR\/(\d+)/); | ||
if (tem != null) { | if (tem != null) { | ||
return { | return { | ||
380번째 줄: | 106번째 줄: | ||
} | } | ||
function | /** 편집 저장시 다른 문서나 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 | |||
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를 통해 간단하게 문서들을 수집, 변경하는 함수. | /** 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() | *: var api = MediaWikiAPI(); .changeDocument() | ||
517번째 줄: | 244번째 줄: | ||
function MediaWikiAPI() { | function MediaWikiAPI() { | ||
console.warn('권장하지 않는 MediaWikiAPI를 사용하고 있습니다. 대신 mw.Api를 사용해 주세요.'); | |||
var token; | var token; | ||
var getToken = function() { | var getToken = function() { | ||
if (token != undefined) return token; | if (token !== undefined) return token; | ||
$.ajax({ | $.ajax({ | ||
url: " | url: "/api.php?action=query&meta=tokens", // Note: URL은 서버 디렉토리 설정에 따라 바꾸어야 합니다. | ||
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 | token = datas.query.tokens.csrftoken; | ||
}, | }, | ||
async: false | async: false | ||
}) | }); | ||
return token; | return token; | ||
} | }; | ||
function changeDocument(title, summary, content, isUnReload) { | 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) { | function addDocument(title, summary, content, isUnReload, minor) { | ||
originContent = getDocument(title) | originContent = getDocument(title); | ||
changeDocument(title, summary, originContent + content, isUnReload); | changeDocument(title, summary, originContent + content, isUnReload, minor); | ||
} | } | ||
571번째 줄: | 303번째 줄: | ||
var originContent; | var originContent; | ||
$.ajax({ | $.ajax({ | ||
url: "/ | 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); | ||
} | } | ||
583번째 줄: | 315번째 줄: | ||
var doc; | var doc; | ||
$.ajax({ | $.ajax({ | ||
url: "/ | 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; | ||
} | } | ||
599번째 줄: | 331번째 줄: | ||
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')); | |||
} | } | ||
/** | /** | ||
* [[ | * [[리버티게임:오락실/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; | |||
function | (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 | */ | ||
$(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"; | |||
} | |||
} | |||
});*/ | |||
function | /** | ||
* 일반 이름공간 내에 있는 특정 분류의 문서 갯수를 가져오는 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; | |||
} | |||
} | |||
} | |||
}); | |||
}); |
2024년 11월 11일 (월) 16:54 기준 최신판
/* -- 전역 상수 선언 -- */
// 미디어위키 폴더명 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;
}
}
}
});
});