미디어위키:Common.js 문서 원본 보기
←
미디어위키:Common.js
둘러보기로 이동
검색으로 이동
문서 편집 권한이 없습니다. 다음 이유를 확인해주세요:
요청한 명령은 다음 권한을 가진 사용자에게 제한됩니다:
사용자
.
이 문서는 소프트웨어 인터페이스에 쓰이는 문서로, 부정 행위를 막기 위해 보호되어 있습니다.
이 문서는
관리자
만이 수정할 수 있습니다. 내용의 변경이 필요하다면
관리자 요청
에 편집 요청을 남겨 주세요.
모든 방문자에게 영향을 미칠 수 있기 때문에 이 자바스크립트 문서의 편집 권한이 없습니다.
문서의 원본을 보거나 복사할 수 있습니다.
/* -- 전역 상수 선언 -- */ // 미디어위키 폴더명 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; } } } }); });
이 문서에서 사용한 틀:
리버티게임:연습장/안내문
(
원본 보기
)
미디어위키:Common.js
문서로 돌아갑니다.
둘러보기 메뉴
개인 도구
계정 만들기
로그인
어두운 모드
이름공간
메시지
토론
English
보기
읽기
원본 보기
역사 보기
더 보기
새로 고침
검색
둘러보기
대문
최근 바뀜
게임 목록
임의의 게임으로
커뮤니티
리버티게임 본진
도구
여기를 가리키는 문서
가리키는 글의 최근 바뀜
특수 문서 목록
문서 정보
축약된 URL 얻기