사용자: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())