미디어위키:Gadget-CGI2.js
참고: 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 새로 고쳐야 합니다.
- 파이어폭스 / 사파리: Shift 키를 누르면서 새로 고침을 클릭하거나, Ctrl-F5 또는 Ctrl-R을 입력 (Mac에서는 ⌘-R)
- 구글 크롬: Ctrl-Shift-R키를 입력 (Mac에서는 ⌘-Shift-R)
- 인터넷 익스플로러 / 엣지: Ctrl 키를 누르면서 새로 고침을 클릭하거나, Ctrl-F5를 입력.
- 오페라: Ctrl-F5를 입력.
/** [[틀:CGI2]] 변수 구문 해석기
* 작성자: [[사용자:Gustmd7410]]
**/
var CGI2Parser = (function() {
function CGI2Parser(actions) {
// new 키워드 미사용시
if(!(this instanceof CGI2Parser)) {
console.warn("CGI2Parser 객체를 new 키워드 없이 생성했습니다");
return new CGI2Parser(actions);
}
if(typeof actions === "object") this.actions = actions;
else if(actions === undefined) this.actions = {};
else throw new TypeError("생성자 CGI2Parser의 첫번째 변수가 객체가 아닙니다");
}
CGI2Parser.prototype.parse = function parse(origin, params, useStrict) {
var actions = this.actions;
JSON.parse(params.replace(/\,\s*\]/, "]")).forEach(function(command, useStrict) {
var wrapper = Object.entries(command)[0];
var action = actions[wrapper[0]];
var arg = wrapper[1];
if(typeof action === "function") {
origin = actions[wrapper[0]].apply(origin, Array.isArray(arg)? arg : [arg]) || origin;
} else if(!useStrict) {
return;
} else if(action === undefined) {
origin = new TypeError('동작 "' + wrapper[0] + '"이(가) 존재하지 않습니다');
origin.name = "ActionNoExistError";
throw origin;
} else {
origin = new TypeError('동작 "' + wrapper[0] + '"은(는) 유효하지 않는 타입(' + typeof action + ') 입니다');
origin.name = "ActionWrongTypeError";
throw origin;
}
});
return origin;
};
return CGI2Parser;
})();
/** [[틀:CGI2|CGI2]]를 사용 가능하게 만드는 jquery 구문
* 원작성자: [[사용자:BANIP|BANIP]]
* 2차 작성자: [[사용자:Gustmd7410|Gustmd7410]]
**/
function useCGI2() {
$(".cgilink").each(function() {
// CGI2의 page속성과 data속성을 가져옴
var page = $(this).data("page").split('#');
var variables = $(this).data("var");
// 가져온 page데이터 속성을 조합해 url인스턴스 생성
var pagename = page.shift() || mw.config.get('wgPageName');
var hash = page.join('#');
var urlstr = window.location.origin;
var url = new URL(urlstr);
var searchParam = geturlSearch();
// 엄격모드 사용여부 결정
if(typeof useCGI2.useStrict !== "boolean") {
useCGI2.useStrict = (searchParam.debug === "true" || searchParam.debug == 1)? true : false;
}
// 가져온 var속성으로 url 인스턴스의 searchparams를 씹고 뜯고 맛보고 즐기고
var enabledKey = null;
try {
searchParam = new CGI2Parser({
set: function(key, value) {
this[key.trim()] = value.trim();
},
"default": function(key, value) {
key = key.trim();
this[key] = this[key] || value.trim();
},
del: function(key) {
delete this[key.trim()];
},
restrict: function(key) {
if(!enabledKey) enabledKey = [];
enabledKey.push(key);
}
}).parse(searchParam, variables, useCGI2.useStrict);
if(enabledKey) Object.keys(searchParam).forEach(function(key) {
if(!enabledKey.includes(key)) delete searchParam[key];
});
} catch(error) {
$(this).html($("<span class='error' />").text(error.message));
return;
}
// url 경로 조정
if(Object.keys(searchParam).length > 0) {
url.pathname = "/w/index.php";
searchParam.title = pagename;
} else url.pathname = "/wiki/" + mw.util.wikiUrlencode(pagename);
url.search = searchParamToString(searchParam);
url.hash = mw.util.escapeIdForLink(hash);
// cgilink에 a태그 추가
var children = $(this).html();
$(this).html("<a href='" + url.href.replace("'", "'") + "'>" + children + "</a>");
});
}
/*
true = 항상 엄격모드
null = 디버그 모드 (debug=true) 에 엄격모드 자동 전환
false = 엄격모드 사용 안함
*/
useCGI2.useStrict = null;
$(useCGI2);
/* [[틀:CGI2|CGI2]]를 사용 가능하게 만드는 jquery 구문 끝 */