사용자:BANIP/script/manualParser.js
참고: 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 새로 고쳐야 합니다.
- 파이어폭스 / 사파리: Shift 키를 누르면서 새로 고침을 클릭하거나, Ctrl-F5 또는 Ctrl-R을 입력 (Mac에서는 ⌘-R)
- 구글 크롬: Ctrl-Shift-R키를 입력 (Mac에서는 ⌘-Shift-R)
- 인터넷 익스플로러 / 엣지: Ctrl 키를 누르면서 새로 고침을 클릭하거나, Ctrl-F5를 입력.
- 오페라: Ctrl-F5를 입력.
/*
lua로 포팅해서 모듈:GameJSONParser에서 사용 예정
--[[사용자:BANIP|BANIP]] ([[사용자토론:BANIP|토론]]) 2023년 7월 27일 (목) 15:12 (KST)
*/
/**
* 게임 메타데이터를 파싱하여 각 속성에 대해 적절한 포맷터를 사용하는 함수.
*
* @param {Object} scheme - 속성에 대한 정보를 담고 있는 스키마 객체.
* @param {Array} propertyCases - 검증과 포맷팅 규칙을 담고 있는 객체의 배열.
* @param {Object} gameMeta - 파싱할 게임 메타데이터 객체.
* @return {Array} - 파싱된 결과를 담고 있는 문자열의 배열.
*/
function manualParser(scheme, propertyCases, gameMeta) {
let results = [];
// 각 속성 케이스를 순회합니다.
for(let propertyCase of propertyCases) {
// 현재 속성의 유효성을 확인합니다.
let validatedGroup = propertyCase.validate(gameMeta,scheme);
if(validatedGroup !== false) {
if(validatedGroup.length !== 0 && !Array.isArray(validatedGroup[0])) {
validatedGroup = [validatedGroup];
}
for(let validated of validatedGroup) {
let resultString = propertyCase.formatter;
for( let {key,value} of validated) {
resultString = resultString.replaceAll(`$${key}`,value);
}
results.push(resultString);
}
}
}
return results;
}
function manualParse(frame){
let scheme = frame.scheme
let propertyCases = [
{
key:"platform",
formatter: "[[분류:$title 게임]]",
validate:function(gameMeta,scheme){
let platFormData =scheme.$defs.platform.oneOf.find((platform)=>{
return platform.const == gameMeta.platform
})
if( platFormData == undefined ) return false;
return [
{key:"title", value:platFormData.title}
]
}
},
{
key:"abandon",
formatter:"{{뱃지|버려진 게임}}",
validate:function(gameMeta,scheme){
return gameMeta.abondon || false;
}
},
{
key:"construction",
formatter:"{{뱃지|공사중|$value}}",
validate:function(gameMeta,scheme){
if(!gameMeta.construction) return false;
if(gameMeta.construction === true) return [{key:"value", value:""}]
return [
{key:"value", value:gameMeta.construction}
]
}
},
{
key:"progress",
formatter:"[[분류:$title]]",
validate:function(gameMeta,scheme){
let progressData = scheme.properties.progress.oneOf.find((progress)=>{
return progress.const == gameMeta.progress
})
return [
{key:"title", value:progressData.title}
]
}
},
{
key:"rating",
formatter:"[[분류:$title 게임]]",
validate:function(gameMeta,scheme){
let age = gameMeta.rating.libertygame.age
let ageData = scheme.properties.rating.oneOf[1].properties.libertygame.properties.age.oneOf.find((ageData)=>{
return ageData.const == age
});
return [
{key:"title", value:ageData.title}
]
}
},
{
key:"repair",
formatter:"{{뱃지|수리중}}",
validate:function(gameMeta,scheme){
if(!gameMeta.repair) return false;
if(gameMeta.repair === true) return [{key:"value", value:""}];
return [
{key:"value", value:gameMeta.repair}
]
}
},
{
key:"genre",
formatter:"[[분류:$title 게임]]",
validate:function(gameMeta,scheme){
let genres = gameMeta.genre;
if( typeof genres == "string" ) genres = [genres];
let genreData = genres.map((genre)=>{
return scheme.$defs.genre.oneOf.find((genreData)=>{
return genreData.const == genre
});
}
).filter((genreData)=>{
return genreData
});
console.log(genreData)
return genreData.map((genreData)=>{
return {key:"title", value:genreData.title}
});
}
},
]
let gameMeta = {
"progress": 4,
"editpolicy": "limited",
"platform": "web",
"rating": {
"libertygame": {
"age": "all"
}
},
"genre": [
"adv",
"rod"
],
"AuthorName": "표리부동",
"Name": "제3경인고속화도로",
"Summary": ""
};
let parsed = manualParser(scheme,propertyCases,gameMeta);
return parsed;
}
console.log(manualParse())