imported>Senouis |
imported>Hsl0 |
1번째 줄: |
1번째 줄: |
| <noinclude>{{관리자 요청 보존|2018|11}}</noinclude>
| | #REDIRECT [[보존:관리자 요청/2018년 11월]] |
| | |
| == Common.js 수정 요청 ==
| |
| | |
| DB 플러그인 파트를
| |
| <pre>
| |
| /** DB기능 초기화
| |
| * [[틀:DB]]를 사용 가능하게 해 줍니다.
| |
| * [[사용자:BANIP|BANIP]]
| |
| */
| |
| | |
| function enableLocalStorage() {
| |
| // 문서 미리보기 상태일 시 종료
| |
| if (location.pathname === "/w/index.php") return;
| |
| | |
| //플러그인의 모든 키 순회
| |
| function forEach(object, callback) {
| |
| for (var key in object) {
| |
| var variable = object[key];
| |
| callback(variable, key);
| |
| }
| |
| }
| |
| | |
| function setLocalStorage(parentKey, datas) {
| |
| var stringKeys = JSON.stringify(Object.keys(datas));
| |
| localStorage.setItem(parentKey + "/__keys__", stringKeys);
| |
| forEach(datas, function(v, i) {
| |
| if (i === "action") return;
| |
| localStorage.setItem(parentKey + "/" + i, v);
| |
| });
| |
| }
| |
| | |
| | |
| function getLocalStorage(parentKey) {
| |
| var datas = {};
| |
| var stringKeys = localStorage.getItem(parentKey + "/__keys__");
| |
| if (stringKeys === null) return null;
| |
| var keys = JSON.parse(stringKeys);
| |
| keys.forEach(function(key) {
| |
| datas[key] = localStorage.getItem(parentKey + "/" + key);
| |
| })
| |
| return datas;
| |
| }
| |
| | |
| function clearLocalStorage(parentKey) {
| |
| var datas = {};
| |
| var stringKeys = localStorage.getItem(parentKey + "/__keys__");
| |
| if (stringKeys === null) return null;
| |
| var keys = JSON.parse(stringKeys);
| |
| keys.forEach(function(key) {
| |
| datas[key] = localStorage.removeItem(parentKey + "/" + key);
| |
| })
| |
| }
| |
| | |
| function getSearch() {
| |
| return geturlSearch();
| |
| }
| |
| | |
| function searchParamToString(searchParamsObj){
| |
| var params = "?" + Object.entries(searchParamsObj)
| |
| .map(function(v){ return v.join("=") })
| |
| .join("&");
| |
| return encodeURI(params);
| |
| }
| |
|
| |
| function setSearch(datas) {
| |
| var searchParams = getSearch();
| |
| forEach(datas, function(v, i) {
| |
| searchParams[i] = v;
| |
| });
| |
| location.search = searchParamToString(searchParams);
| |
| }
| |
| | |
| function hasSearch() {
| |
| return !(location.search === "");
| |
| }
| |
| | |
| $(".controlLocalStorage").each(function() {
| |
| var parentKey = $(this).data("key");
| |
| var behavior = $(this).data("behavior");
| |
| switch (behavior) {
| |
| case "세이브":
| |
| if (!hasSearch()) return;
| |
| var datas = getSearch();
| |
| clearLocalStorage(parentKey);
| |
| setLocalStorage(parentKey, datas);
| |
| break;
| |
| case "로드":
| |
| if (hasSearch()) return;
| |
| var datas = getLocalStorage(parentKey, datas);
| |
| if (datas === null) return;
| |
| setSearch(datas);
| |
| break;
| |
| case "초기화":
| |
| clearLocalStorage(parentKey);
| |
| break;
| |
| }
| |
| })
| |
| | |
| | |
| }
| |
| $(enableLocalStorage);
| |
| </pre>
| |
| 처럼 바꿔주세요. 초기화 기능을 추가했습니다. -- {{:사용자:Bd3076/서명}} 2018년 11월 1일 (목) 18:07 (KST)
| |
| :{{완료}} by [[사용자:Manymaster|manymaster]] ([[사용자토론:Manymaster|토론]]|[[특수기능:기여/Manymaster|기여]]) 2018년 11월 1일 (목) 18:16 (KST)
| |
| | |
| == 로고변경 스크립트를 수정했습니다 ==
| |
| | |
| <pre>
| |
| | |
| /** [[틀:로고 바꾸기]]용 함수
| |
| * 작성자: [[사용자:Manymaster|manymaster]]
| |
| */
| |
| function logochange() {
| |
| // 허용 확장자 및 url 패턴
| |
| var allwedURLPattern = ["i.uncyclopedia.kr/game/","i.uncyclopedia.kr/pedia/","upload.wikimedia.org/wikipedia/commons/"]
| |
| var allowedExt = ["gif","png","jpg","jpeg","svg"]
| |
| | |
| const logoElement = document.getElementsByClassName("changelogo123");
| |
| /* .changelogo 요소가 없으면 종료 */
| |
| if (logoElement.length === 0) {
| |
| return;
| |
| | |
| }
| |
| | |
| var logoTest = logoElement[0].innerHTML.toLowerCase();
| |
| //이미지 url이 주어진 조건에 맞는지 검사
| |
| var isSafeURL = allwedURLPattern.some( function(middleURL){
| |
| var reg = new RegExp("^//" + middleURL)
| |
| return ( logoTest.match(reg) != null)
| |
| })
| |
| var isSafeExt = allowedExt.some( function(ext){
| |
| var reg = new RegExp("\." + ext + "$")
| |
| return ( logoTest.match(reg) != null)
| |
| })
| |
| | |
| // URL패턴과 확장자의 조건이 맞지 않으면 종료
| |
| if ( !(isSafeURL && isSafeExt) ) {
| |
| return;
| |
| }
| |
| | |
| /* 로고 교체 */
| |
| var orglogoElement = document.querySelector("#p-logo a");
| |
| orglogoElement.style.backgroundImage = "url('" + logoElement[0].innerHTML + "')";
| |
| /* 사이즈 교체 */
| |
| var sizeElement = document.querySelector(".changelogosize");
| |
| orglogoElement.style.backgroundSize = sizeElement === null ? "160px 160px" : sizeElement.innerHTML + " " + sizeElement.innerHTML
| |
| | |
| }
| |
| logochange()
| |
| /* [[틀:로고 바꾸기]]용 함수 끝 */
| |
| </pre>
| |
| slice로 테스트한 부분을 정규표현식으로 변경함으로써 코드 전체의 가독성을 높이고
| |
| | |
| 확장자와 url을 추가/수정하기 쉽게 고쳤습니다 --{{사용자:BANIP/서명}} 2018년 11월 7일 (수) 15:47 (KST)
| |
| :{{완료}} 언제나 감사드립니다. by [[사용자:Manymaster|manymaster]] ([[사용자토론:Manymaster|토론]]|[[특수기능:기여/Manymaster|기여]]) 2018년 11월 7일 (수) 15:50 (KST)
| |
| :: 앗.. 죄송합니다 깜빡하고 제가 테스트하던 코드 그대로 넣어서 작동이 안되는것 같습니다
| |
| ::getElementsByClassName("changelogo123"); 이부분에서 123을 지워주시면 감사드리겠습니다 두번 손보게 해서 죄송합니다.. --2018년 11월 7일 (수) 16:09 (KST)
| |
| :::그 부분은 [[틀:로고 바꾸기]]의 클래스가 겹치기 쉽다는 것으로 해석되어 그냥 그 틀의 클래스를 바꾸는 것으로 해결했네요. by [[사용자:Manymaster|manymaster]] ([[사용자토론:Manymaster|토론]]|[[특수기능:기여/Manymaster|기여]]) 2018년 11월 7일 (수) 16:57 (KST)
| |
| | |
| == 커먼자스 편집 요청 ==
| |
| | |
| 제가 플러그인을 만들다가 실수를 해서 문서 내용을 볼 수 없게 되었습니다. 죄송하지만 아무나 제 커먼자스에서 최근 편집 하나 되돌려 주실 수 있나요? [[특수:기여/221.159.32.3|221.159.32.3]] 2018년 11월 8일 (목) 07:53 (KST) (Bd3076)
| |
| : {{완료|[[특수:차이/340454|완료]]}} — [[사용자토론:유한림|유한림]] 2018년 11월 8일 (목) 08:44 (KST)
| |
| | |
| == 이동+찾아바꾸기 ==
| |
| | |
| <code>사:올/마피아 게임</code> 문자열을 <code>마피아 게임</code>으로 바꿔주시고, 해당 문서의 하위 문서들도 이동해주세요.--{{사:올/서명}} 2018년 11월 10일 (토) 10:58 (KST)
| |
| : {{완료}} — [[사용자토론:유한림|유한림]] 2018년 11월 10일 (토) 11:19 (KST)
| |
| | |
| == Common.js 편집 요청 ==
| |
| | |
| [[미디어위키:Common.js]]의 pluginX 부분을 [[사:Bd3076/common.js]]의 현재 내용으로 변경해 주세요.
| |
| | |
| * 플러그인 문서 생성 시 콘텐츠 모델을 자바스크립트로 설정
| |
| * 이미 실행한 플러그인은 앞으로 확인 없이 계속 실행됨
| |
| | |
| 위와 같은 변경 사항이 있었습니다. -- {{:사용자:Bd3076/서명}} 2018년 11월 11일 (일) 18:27 (KST)
| |
| :{{보류}} 현 백괴게임 개인정보 정책에서는 쿠키는 오로지 회원 식별만을 목적으로 하고 있다고 나와있는데, 이와 충돌합니다. 민감한 문제인 만큼, 정책 개정이 우선되어야 할 것 같습니다. by [[사용자:Manymaster|manymaster]] ([[사용자토론:Manymaster|토론]]|[[특수기능:기여/Manymaster|기여]]) 2018년 11월 11일 (일) 18:36 (KST)
| |
| ::아... 그런 문제가 있군요. 알겠습니다. -- {{:사용자:Bd3076/서명}} 2018년 11월 11일 (일) 18:40 (KST)
| |
| ::json을 통해 실행 가능 플러그인을 검색하는 쪽으로 개발 방향을 돌려 보겠습니다. -- {{:사용자:Bd3076/서명}} 2018년 11월 11일 (일) 18:48 (KST)
| |
| | |
| | |
| 재요청합니다. 코드는 아래와 같습니다. 편집 창으로 들어가시면 제대로 된 코드를 보실 수 있습니다.
| |
| | |
| <!--
| |
| | |
| /**
| |
| * pluginX Core
| |
| * pluginX 시스템이 제대로 돌아가게 해 줍니다.
| |
| * 작성자: [[사용자:Bd3076|Bd3076]]
| |
| */
| |
| | |
| function pluginXCore() {
| |
| var _afterLoad = function(){};
| |
|
| |
| var _ready_for_ready = function(){
| |
| setTimeout(_ready_pluginX, 1000);
| |
| };
| |
|
| |
| var _ready_pluginX = function(){
| |
| document.getElementById('firstHeading').innerHTML = "플러그인 문서를 생성하시려면 아래의 <strong>바꾸기</strong> 버튼을 누르세요.";
| |
| $('#ooui-4').css('display', 'none');
| |
| $('#ooui-5').css('display', 'none');
| |
| $('#ooui-6').css('display', 'none');
| |
| };
| |
|
| |
| if(mw.config.get('wgPageName').substr(0, 11) == "특수:콘텐츠모델바꾸기"){
| |
| var url = new URL(window.location);
| |
| var mode = url.searchParams.get('mode');
| |
| if(mode == 'usingPluginX'){
| |
| _afterLoad = _ready_for_ready;
| |
| }
| |
| }
| |
| | |
| $(_afterLoad());
| |
|
| |
| var api = MediaWikiAPI();
| |
| var ipUser = false;
| |
|
| |
| if(mw.config.get("wgUserName") === null) ipUser = true;
| |
|
| |
| var script_list = [];
| |
| var pluginExist = false;
| |
| var neededPluginExist = false;
| |
| var html_before;
| |
| var jsonDoc = "사용자:" + mw.config.get("wgUserName") + "/pluginX.json";
| |
| var jsonData = JSON.parse(api.getDocument(jsonDoc));
| |
|
| |
| /// 플러그인의 정보가 담긴 데이터를 만듭니다.
| |
| var generateScriptData = function(_url, _name, _creator, _doc, _script, _revid){
| |
| return {
| |
| url: _url,
| |
| name: _name,
| |
| creator: _creator,
| |
| doc: _doc,
| |
| script: _script,
| |
| revid: _revid
| |
| };
| |
| };
| |
|
| |
| /// 플러그인 목록을 만들어서 script_list[]에 담습니다.
| |
| var getPluginList = function(){
| |
| $(".c_pluginX").each(function() {
| |
| pluginExist = true;
| |
| var url = $(this).attr('data-url');
| |
| var name = $(this).attr('data-name');
| |
| var creator = $(this).attr('data-creator');
| |
| var doc = $(this).attr('data-doc');
| |
| var revid = $(this).attr('data-revid');
| |
|
| |
| var script = api.getDocument(doc);
| |
|
| |
| script_list.push(generateScriptData(url, name, creator, doc, script, revid));
| |
|
| |
| if(jsonData[doc] === undefined || jsonData[doc] !== revid){
| |
|
| |
| neededPluginExist = true;
| |
| }
| |
| });
| |
| };
| |
|
| |
| /// 플러그인을 실행합니다.
| |
| var executePlugins = function(){
| |
| document.getElementById('mw-content-text').innerHTML = html_before;
| |
|
| |
| script_list.forEach(function(data){
| |
| var link = data.url;
| |
| var revid = data.revid;
| |
| var doc = data.doc;
| |
|
| |
| if(neededPluginExist){
| |
| jsonData[doc] = revid;
| |
| }
| |
|
| |
| $.getScript(link);
| |
| });
| |
|
| |
| if(neededPluginExist && !ipUser){
| |
| api.changeDocument(jsonDoc, "pluginX - 새로운 플러그인", JSON.stringify(jsonData));
| |
| }
| |
| };
| |
|
| |
| /// 플러그인을 실행하지 않습니다.
| |
| var doNotExecutePlugins = function(){
| |
| document.getElementById('mw-content-text').innerHTML = html_before;
| |
| };
| |
|
| |
| /// 알림 창을 만듭니다.
| |
| var showWindow = function(){
| |
| html_before = document.getElementById('mw-content-text').innerHTML;
| |
| $('#mw-content-text').html(api.readDocument("틀:PluginX/setup"));
| |
| var script = "";
| |
|
| |
| script_list.forEach(function(data){
| |
| var addingCode;
| |
| addingCode = '<div class="px-code"><pre>';
| |
| addingCode = addingCode.concat(((data.script.replace('&', '&')).replace('<', '<')).replace('>', '>'));
| |
| addingCode = addingCode.concat('</pre> </div> <div class="px-codeinfo"> <ul> <li> 플러그인 이름: ');
| |
| addingCode = addingCode.concat(data.name);
| |
| addingCode = addingCode.concat('</li> <li> 플러그인 제작자: ');
| |
| addingCode = addingCode.concat(data.creator);
| |
| addingCode = addingCode.concat('</li> </ul> </div>');
| |
|
| |
| script += addingCode;
| |
| });
| |
|
| |
| document.getElementById('px-script').innerHTML = script;
| |
|
| |
| $('#px-button').on('click', executePlugins);
| |
| $('#px-button2').on('click', doNotExecutePlugins);
| |
| };
| |
|
| |
| getPluginList();
| |
|
| |
| if(pluginExist === false) return;
| |
|
| |
| showWindow();
| |
|
| |
| if(neededPluginExist === false){
| |
| executePlugins();
| |
| return;
| |
| }
| |
| }
| |
| $(pluginXCore());
| |
| | |
| /* pluginX Core 끝 */
| |
| | |
| | |
| -->
| |
| | |
| 위와 기능은 같습니다.
| |
| | |
| * 이미 실행한 플러그인은 앞으로 확인 없이 계속 실행됨
| |
| | |
| 이 부분을 ip 사용자에게 처리하는 게 힘들었는데, 이건 그냥 ip 사용자는 계속 확인하는 방식으로 처리했습니다.
| |
| | |
| 언제나 백괴게임을 위해 힘써 주셔서 감사합니다. -- {{:사용자:Bd3076/서명}} 2018년 11월 12일 (월) 19:02 (KST)
| |
| | |
| : {{완료}} Js091213님이 깜박하신 것 같아서... (하면 안 되는 건가...?) -- {{:사용자:Bd3076/서명}} 2018년 11월 12일 (월) 19:14 (KST)
| |