diff --git a/250321_DIC_2502A_TEST.xlsx b/250321_DIC_2502A_TEST.xlsx new file mode 100644 index 0000000..637ebbf Binary files /dev/null and b/250321_DIC_2502A_TEST.xlsx differ diff --git a/DIC_2502A.json b/DIC_2502A.json index e3bb12d..fcbb4ca 100644 --- a/DIC_2502A.json +++ b/DIC_2502A.json @@ -219,18 +219,18 @@ }, "9": { "ele": "//CROwneUnit[{subtitleIndex}]/CRCUnitArr/@*[name()='VID600' or name()='VID601']", - "ele2": "//CRCUnitArr[@Name={search}]/@*[name()='VID600' or name()='VID601']", + "ele2": "//CRCUnitArr[@Name='{search}']/@*[name()='VID600' or name()='VID601']", "type": "video", "search": "나무기차", "value": [ - 0.240, + 0.406, 0.777 ], "point": 2 }, "10": { "ele": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/preceding-sibling::CRTrackClip/@Length)", - "ele2": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name='{search}']]/preceding-sibling::CROwneUnit)]/preceding-sibling::CRTrackClip/@Length)", + "ele2": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][@ClipIndex={clipIndex}]/preceding-sibling::CRTrackClip/@Length)", "search": "나무기차", "type": "video", "value": 160, @@ -238,7 +238,7 @@ }, "11": { "ele": "//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/@Length", - "ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name='{search}']]/preceding-sibling::CROwneUnit)]/@Length", + "ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][@ClipIndex={clipIndex}]/@Length", "search": "나무기차", "type": "video", "value": "150", @@ -383,7 +383,7 @@ }, "28": { "ele": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/preceding-sibling::CRTrackClip/@Length)", - "ele2": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name='{search}']]/preceding-sibling::CROwneUnit)]/preceding-sibling::CRTrackClip/@Length)", + "ele2": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][@ClipIndex={clipIndex}]/preceding-sibling::CRTrackClip/@Length)", "search": "멋진 기차 모형 (Fine Train Model)", "type": "opening", "value": 0, @@ -391,8 +391,7 @@ }, "29": { "ele": "//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/@Length", - "ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[sum(preceding-sibling::CRTrackClip/@Length) = {startTime}]/@Length", - "ele3": "//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name='{search}']]/preceding-sibling::CROwneUnit)]/@Length", + "ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][@ClipIndex={clipIndex}]/@Length", "search": "멋진 기차 모형 (Fine Train Model)", "type": "opening", "value": "120", diff --git a/DIC_2502B.json b/DIC_2502B.json index 8ec84df..aec7161 100644 --- a/DIC_2502B.json +++ b/DIC_2502B.json @@ -227,7 +227,7 @@ }, "10": { "ele": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/preceding-sibling::CRTrackClip/@Length)", - "ele2": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name='{search}']]/preceding-sibling::CROwneUnit)]/preceding-sibling::CRTrackClip/@Length)", + "ele2": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][@ClipIndex={clipIndex}]/preceding-sibling::CRTrackClip/@Length)", "search": "자연이 빚어낸 섬", "type": "video", "value": 150, @@ -235,7 +235,7 @@ }, "11": { "ele": "//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/@Length", - "ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name='{search}']]/preceding-sibling::CROwneUnit)]/@Length", + "ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][@ClipIndex={clipIndex}]/@Length", "search": "자연이 빚어낸 섬", "type": "video", "value": "120", @@ -380,7 +380,7 @@ }, "28": { "ele": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/preceding-sibling::CRTrackClip/@Length)", - "ele2": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name=\"{search}\"]]/preceding-sibling::CROwneUnit)]/preceding-sibling::CRTrackClip/@Length)", + "ele2": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][@ClipIndex={clipIndex}]/preceding-sibling::CRTrackClip/@Length)", "search": "마나가하섬으로 가자 (Let's go to Managaha Island)", "type": "opening", "value": 0, @@ -388,8 +388,7 @@ }, "29": { "ele": "//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/@Length", - "ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[sum(preceding-sibling::CRTrackClip/@Length) = {startTime}]/@Length", - "ele3": "//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name=\"{search}\"]]/preceding-sibling::CROwneUnit)]/@Length", + "ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][@ClipIndex={clipIndex}]/@Length", "search": "마나가하섬으로 가자 (Let's go to Managaha Island)", "type": "opening", "value": "120", diff --git a/DIC_2502C.json b/DIC_2502C.json index d122713..6bdf745 100644 --- a/DIC_2502C.json +++ b/DIC_2502C.json @@ -219,7 +219,7 @@ }, "9": { "ele": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/preceding-sibling::CRTrackClip/@Length)", - "ele2": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name='{search}']]/preceding-sibling::CROwneUnit)]/preceding-sibling::CRTrackClip/@Length)", + "ele2": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][@ClipIndex={clipIndex}]/preceding-sibling::CRTrackClip/@Length)", "search": "금학산 정상에서", "type": "video", "value": 170, @@ -227,7 +227,7 @@ }, "10": { "ele": "//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/@Length", - "ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name='{search}']]/preceding-sibling::CROwneUnit)]/@Length", + "ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][@ClipIndex={clipIndex}]/@Length", "search" : "금학산 정상에서", "type": "video", "value": "150", @@ -380,7 +380,7 @@ }, "28": { "ele": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/preceding-sibling::CRTrackClip/@Length)", - "ele2": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name='{search}']]/preceding-sibling::CROwneUnit)]/preceding-sibling::CRTrackClip/@Length)", + "ele2": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][@ClipIndex={clipIndex}]/preceding-sibling::CRTrackClip/@Length)", "search": "금학산의 기운 (Energy of a Mountain)", "type": "opening", "value": 0, @@ -388,8 +388,7 @@ }, "29": { "ele": "//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/@Length", - "ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[sum(preceding-sibling::CRTrackClip/@Length) = {startTime}]/@Length", - "ele3": "//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name='{search}']]/preceding-sibling::CROwneUnit)]/@Length", + "ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][@ClipIndex={clipIndex}]/@Length", "search": "금학산의 기운 (Energy of a Mountain)", "type": "opening", "value": "120", diff --git a/DIC_2502D.json b/DIC_2502D.json index a98a7c1..7f67686 100644 --- a/DIC_2502D.json +++ b/DIC_2502D.json @@ -226,7 +226,7 @@ }, "10": { "ele": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/preceding-sibling::CRTrackClip/@Length)", - "ele2": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name='{search}']]/preceding-sibling::CROwneUnit)]/preceding-sibling::CRTrackClip/@Length)", + "ele2": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][@ClipIndex={clipIndex}]/preceding-sibling::CRTrackClip/@Length)", "search": "대룡산의 아름다움", "type": "video", "value": 150, @@ -234,7 +234,7 @@ }, "11": { "ele": "//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/@Length", - "ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name='{search}']]/preceding-sibling::CROwneUnit)]/@Length", + "ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][@ClipIndex={clipIndex}]/@Length", "search": "대룡산의 아름다움", "type": "video", "value": "120", @@ -379,7 +379,7 @@ }, "28": { "ele": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/preceding-sibling::CRTrackClip/@Length)", - "ele2": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name='{search}']]/preceding-sibling::CROwneUnit)]/preceding-sibling::CRTrackClip/@Length)", + "ele2": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][@ClipIndex={clipIndex}]/preceding-sibling::CRTrackClip/@Length)", "search": "대룡산의 정기 (The spirit of the Mountain)", "type": "opening", "value": 0, @@ -387,8 +387,7 @@ }, "29": { "ele": "//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/@Length", - "ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[sum(preceding-sibling::CRTrackClip/@Length) = {startTime}]/@Length", - "ele3": "//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name='{search}']]/preceding-sibling::CROwneUnit)]/@Length", + "ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][@ClipIndex={clipIndex}]/@Length", "search": "대룡산의 정기 (The spirit of the Mountain)", "type": "opening", "value": "120", diff --git a/findSimilarString.js b/findSimilarString.js index ef7b911..f94f966 100644 --- a/findSimilarString.js +++ b/findSimilarString.js @@ -1,5 +1,5 @@ const xpath = require("xpath"); -const { DOMParser } = require("xmldom"); +const { DOMParser } = require("xmldom"); const stringSimilarity = require("string-similarity"); /** @@ -18,7 +18,7 @@ function findSimilarString(xmlDoc, targetString, threshold = 0.8) { }); return stringList; } - + // XML에서 모든 텍스트 추출 const stringList = getTextNodes(xmlDoc); @@ -32,13 +32,12 @@ function findSimilarString(xmlDoc, targetString, threshold = 0.8) { // console.log("🚀 ~ findSimilarString ~ text:", text) // console.log("🚀 ~ findSimilarString ~ targetString:", targetString) // console.log("🚀 ~ findSimilarString ~ similarity:", similarity) - + if (similarity > highestSimilarity && similarity >= threshold) { highestSimilarity = similarity; bestMatch = text; } }); - return bestMatch; } diff --git a/gpdpScoring.js b/gpdpScoring.js index be62a27..1f5d7f4 100644 --- a/gpdpScoring.js +++ b/gpdpScoring.js @@ -223,7 +223,7 @@ function getGpdpScore(gpdpData, scoringJson, index) { } if(distance.length !== 0 && distance[0].value == rightAnswer["distance"]){ shadowScore += 1; - console.log('distence matched'); + console.log('distance matched'); } if(blur.length !== 0 && blur[0].value == rightAnswer["blur"]){ shadowScore += 1; diff --git a/psdExport_2.js b/psdExport_2.js index bb13c11..75bf232 100644 --- a/psdExport_2.js +++ b/psdExport_2.js @@ -160,9 +160,7 @@ console.log('채점 결과가 ' + outputExcelFile + ' 파일에 저장되었습 /** * 자막 태그의 인덱스를 구할 때 사용 * 1. CRTrackClip 요소의 순서에 따라 그 요소에 해당하는 CROwneUnit 태그의 순서를 구함 - * 2. CRTrackClip 요소의 시작시간에 따라 그 요소에 해당하는 CROwneUnit 태그의 순서를 구함 - * @returns video index - * + * 2. CRTrackClip 요소의 시작시간에 따라 그 요소에 해당하는 CROwneUnit 태그의 순서를 구함 */ function getTrackClipNode(xmlDoc, type, videoStartTime, openingStartTime) { let trackClipNode = null; @@ -175,9 +173,30 @@ function getTrackClipNode(xmlDoc, type, videoStartTime, openingStartTime) { const trackClipNode1 = xpath.select1(`//CRTrackList[@Name="텍스트"]/CRTrackClip[not(@ClipIndex='-1')][${subtitleOrder}]`, xmlDoc); const trackClipNode2 = xpath.select1(`//CRTrackList[@Name='텍스트']/CRTrackClip[sum(preceding-sibling::CRTrackClip/@Length) = ${startTime}]`, xmlDoc); + return trackClipNode = trackClipNode1 ?? trackClipNode2; } +/** + * 자막텍스트를 이용해 자막 태그의 인덱스를 구할 때 사용 + * 1. 자막 텍스트의 유사도를 판별 + * 2. 자막텍스트와 일치하는 자막요소(CROWneUnit)의 순서를 구함 + */ +function getClipIndexBySubtitle(xmlDoc, search) { + // 1. search값이 일치하지 않는 경우 : count가 0이 되어 @ClipIndex = 0 / CROwneUnit[1]을 가리킴 [오류] + // 2. search값이 일치하는 경우 + // 1) search값이 CROwneUnit[1]이면 : preceding-sibling::CROwneUnit이 없어서 @ClipIndex = 0 / CROwneUnit[1]을 가리킴 [정상] + // 2) search값이 CROwneUnit[2]이면 : preceding-sibling::CROwneUnit이 한개 있으므로 @ClipIndex = 1 / CROwneUnit[2]을 가리킴 [정상] ... + if (!search) { + return null; + } + const searchResult = search ? findSimilarString(xmlDoc, search, 0.8) : null; + const crowneUnitPreceding = searchResult ? xpath.select(`//CROwneUnit[CRCUnitArr[@Name='${searchResult}']]/preceding-sibling::CROwneUnit`, xmlDoc) : null; + + const clipIndex = crowneUnitPreceding ? crowneUnitPreceding.length : null; + return clipIndex; +} + // xml 형식의 gmep 파일을 읽어서 점수를 계산 // scoring.json 파일 내에 있는 ele 요소는 xpath 형식으로 접근하여 요소를 탐색하고 나오는 값을 value와 비교하여 점수를 계산 // scoring.json 파일 내에 있는 type은 비교할 값의 타입을 의미하며, boolean, array 등이 있음 @@ -206,19 +225,20 @@ function getGmepScore(gmepData, scoringJson, index) { const videoStartTime = scoringData.videoStartTime; const openingStartTime = scoringData.openingStartTime; + console.log(`example number: ${key}`) + // xpath 전처리 const trackClipNode = getTrackClipNode(gmepXmlDoc, type, videoStartTime, openingStartTime); const subtitleIndex = trackClipNode ? parseInt(trackClipNode.getAttribute('ClipIndex'), 10) + 1 : null; + const clipIndex = getClipIndexBySubtitle(gmepXmlDoc, search); const subtitleOrder = type === 'video' ? 2 : type === 'opening' ? 1 : null; const startTime = type === 'video' ? videoStartTime : type === 'opening' ? openingStartTime : null; - [ele, ele2] = [ele, ele2].map(e => e?.replace(/{subtitleIndex}/g, subtitleIndex)); - [ele, ele2] = [ele, ele2].map(e => e?.replace(/{subtitleOrder}/g, subtitleOrder)); - [ele, ele2] = [ele, ele2].map(e => e?.replace(/{startTime}/g, startTime)); - - console.log("🚀 ~ getGmepScore ~ ele:", ele) - console.log("🚀 ~ getGmepScore ~ ele2:", ele2) + [ele, ele2, ele3] = [ele, ele2, ele3].map(e => e?.replace(/{subtitleIndex}/g, subtitleIndex)); + [ele, ele2, ele3] = [ele, ele2, ele3].map(e => e?.replace(/{subtitleOrder}/g, subtitleOrder)); + [ele, ele2, ele3] = [ele, ele2, ele3].map(e => e?.replace(/{startTime}/g, startTime)); + [ele, ele2, ele3] = [ele, ele2, ele3].map(e => e?.replace(/{clipIndex}/g, clipIndex)); // search 값이 undefined 아니면 ele의 {search}부분을 search로 치환 /** @@ -239,8 +259,10 @@ function getGmepScore(gmepData, scoringJson, index) { = [ele, ele2, ele3].map(e => e?.includes('{search}') ? null : e); } } - - console.log(`example number: ${key}`) + + console.log("🚀 ~ getGmepScore ~ ele:", ele) + console.log("🚀 ~ getGmepScore ~ ele2:", ele2) + console.log("🚀 ~ getGmepScore ~ ele3:", ele3) // xpath if (ele === 'none') { diff --git a/z.xbook b/z.xbook index f4e87fe..8f91250 100644 --- a/z.xbook +++ b/z.xbook @@ -1 +1 @@ -[{"kind":2,"language":"xpath","value":"//CROwneUnit[position() = (//CRTrackList[@Name='텍스트']/CRTrackClip[sum(preceding-sibling::CRTrackClip/@Length) = 170]/@ClipIndex) + 1]/CRCUnitArr/@VID600 | //CROwneUnit[position() = (//CRTrackList[@Name='텍스트']/CRTrackClip[sum(preceding-sibling::CRTrackClip/@Length) = 170]/@ClipIndex) + 1]/CRCUnitArr/@VID601"},{"kind":2,"language":"xpath","value":"//CRCUnitArr[@Name='대룡산의 아름다움']/@*[name()='VID600' or name()='VID601']"}] \ No newline at end of file +[{"kind":2,"language":"xpath","value":"//CROwneUnit[position() = (//CRTrackList[@Name='텍스트']/CRTrackClip[sum(preceding-sibling::CRTrackClip/@Length) = 170]/@ClipIndex) + 1]/CRCUnitArr/@VID600 | //CROwneUnit[position() = (//CRTrackList[@Name='텍스트']/CRTrackClip[sum(preceding-sibling::CRTrackClip/@Length) = 170]/@ClipIndex) + 1]/CRCUnitArr/@VID601"},{"kind":2,"language":"xpath","value":"//CRCUnitArr[@Name='대룡산의 아름다움']/@*[name()='VID600' or name()='VID601']"},{"kind":2,"language":"xpath","value":"sum(//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name='나무기차']]/preceding-sibling::CROwneUnit)]/preceding-sibling::CRTrackClip/@Length)"},{"kind":2,"language":"xpath","value":"//CROwneUnit[CRCUnitArr[@Name='나무 기차']]"},{"kind":2,"language":"xpath","value":"sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/preceding-sibling::CRTrackClip/@Length)\r\nsum(//CRTrackList[@Name='텍스트']/CRTrackClip[]/preceding-sibling::CRTrackClip/@Length)"},{"kind":2,"language":"xpath","value":"count(//CROwneUnit[CRCUnitArr[@Name='나무 기차']]/preceding-sibling::CROwneUnit)"},{"kind":2,"language":"xpath","value":"//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name='나무 기차']]/preceding-sibling::CROwneUnit)]"},{"kind":2,"language":"xpath","value":"//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=1]"},{"kind":2,"language":"xpath","value":"sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][@ClipIndex=0]/preceding-sibling::CRTrackClip/@Length)"},{"kind":2,"language":"xpath","value":"//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][@ClipIndex=1]/@Length"}] \ No newline at end of file diff --git a/회차별채점자료/2502/json_채점기준표/0320_DIC_채점기준표_Clipping.json b/회차별채점자료/2502/json_채점기준표/0320_DIC_채점기준표_Clipping.json deleted file mode 100644 index e3bb12d..0000000 --- a/회차별채점자료/2502/json_채점기준표/0320_DIC_채점기준표_Clipping.json +++ /dev/null @@ -1,561 +0,0 @@ -{ - "0": { - "1": { - "ele": "none", - "point": 0 - }, - "2": { - "ele": "none", - "point": 0 - }, - "3": { - "ele": "none", - "point": 0 - }, - "4": { - "ele": "none", - "point": 0 - }, - "5": { - "ele": "none", - "point": 0 - }, - "6": { - "ele": "none", - "point": 0 - }, - "7": { - "ele": "none", - "point": 0 - }, - "8": { - "ele": "$[?(@.width == 65 && @.height == 45)]", - "type": "boolean", - "point": 10 - } - }, - "1": { - "1": { - "ele": "none", - "point": 0 - }, - "2": { - "ele": "none", - "point": 0 - }, - "3": { - "ele": "none", - "point": 0 - }, - "4": { - "ele": "none", - "point": 0 - }, - "5": { - "ele": "$.children[?(@.name=='Animal Village')].name", - "value": "Animal Village", - "point": 10 - }, - "6": { - "ele": "$.children[?(@.name=='Animal Village')].text.font.names[0]", - "type": "font", - "value": "Arial", - "point": 10 - }, - "7": { - "ele": "$.children[?(@.name=='Animal Village')].text.font.names[0]", - "value": "Arial-BoldItalicMT", - "point": 10 - }, - "8": { - "ele": "$.children[?(@.name=='Animal Village')].text.font.sizes[0]", - "value": 48, - "point": 10 - }, - "9": { - "ele": "$.children[?(@.name=='Animal Village')].text.font.colors[0]", - "type": "color", - "value": "65f743", - "point": 10 - }, - "10": { - "ele": "none", - "point": 0 - }, - "11": { - "ele": "none", - "point": 0 - }, - "12": { - "ele": "none", - "point": 0 - }, - "13": { - "ele": "$.children[?(@.name=='동물 마을')].name", - "value": "동물 마을", - "point": 10 - }, - "14": { - "ele": "$.children[?(@.name=='동물 마을')].text.font.names[0]", - "type": "font", - "value": "GungsuhChe", - "point": 10 - }, - "15": { - "ele": "$.children[?(@.name=='동물 마을')].text.font.sizes[0]", - "value": 36, - "point": 10 - }, - "16": { - "ele": "$.children[?(@.name=='동물 마을')].text.font.colors[0]", - "type": "color", - "value": "f74343", - "point": 10 - }, - "17": { - "ele": "none", - "point": 0 - }, - "18": { - "ele": "none", - "point": 0 - }, - "19": { - "ele": "none", - "point": 0 - }, - "20": { - "ele": "none", - "point": 0 - }, - "21": { - "ele": "none", - "point": 0 - }, - "22": { - "ele": "none", - "point": 0 - }, - "23": { - "ele": "none", - "point": 0 - }, - "24": { - "ele": "none", - "point": 0 - }, - "25": { - "ele": "none", - "point": 0 - }, - "26": { - "ele": "none", - "point": 0 - }, - "27": { - "ele": "$[?(@.width == 65 && @.height == 45)]", - "type": "boolean", - "point": 10 - } - }, - "2": { - "videoStartTime": 160, - "openingStartTime": 0, - "1": { - "ele": "//CRClipArr/CRClip[position() = //CRTrackList[1]/CRTrackClip/@ClipIndex]/@Path", - "type": "array", - "value": [ - "동영상.mp4", - "이미지2.jpg", - "이미지1.jpg", - "이미지3.jpg" - ], - "point": 4 - }, - "2": { - "ele": "/CROASTERP/CRTrackArr[1]/CRVideoTrackArr[1]/CRTrackList[1]/CRTrackClip[1][@Speed='150']", - "point": 2 - }, - "3": { - "ele": "count(//CRClip[@Path='동영상.mp4']/preceding-sibling::*)", - "type": "startend", - "start": "0", - "end": "370", - "point": 2 - }, - "4": { - "ele": "//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='동영상.mp4']/preceding-sibling::*)]//CRFilter[@Type='1'][@ID='43'][@VID100='9'][@VID103<=0.7 and @VID103>0.69]", - "point": 3 - }, - "5": { - "ele": "//CROwneUnit[{subtitleIndex}]/CRCUnitArr/@Name", - "type": "video", - "value": "나무기차", - "point": 3 - }, - "6": { - "ele": "//CROwneUnit[{subtitleIndex}]/CRCUnitArr//GCUnitPool[@Type='1']/GCUnit/@VID102", - "ele2": "//CRCUnitArr[@Name='{search}']//GCUnitPool[@Type='1']/GCUnit/@VID102", - "search": "나무기차", - "type": "video", - "value": "돋움체", - "point": 2 - }, - "7": { - "ele": "//CROwneUnit[{subtitleIndex}]/CRCUnitArr//GCUnitPool[@Type='1']/GCUnit/@VID101", - "ele2": "//CRCUnitArr[@Name='{search}']//GCUnitPool[@Type='1']/GCUnit/@VID101", - "search": "나무기차", - "type": "video", - "value": "120", - "point": 2 - }, - "8": { - "ele": "//CROwneUnit[{subtitleIndex}]/CRCUnitArr//GCUnitPool/GCUnit[@Type='4']/@VID100", - "ele2": "//CRCUnitArr[@Name='{search}']//GCUnitPool/GCUnit[@Type='4']/@VID100", - "search": "나무기차", - "type": "video", - "value": "-13290016", - "point": 2 - }, - "9": { - "ele": "//CROwneUnit[{subtitleIndex}]/CRCUnitArr/@*[name()='VID600' or name()='VID601']", - "ele2": "//CRCUnitArr[@Name={search}]/@*[name()='VID600' or name()='VID601']", - "type": "video", - "search": "나무기차", - "value": [ - 0.240, - 0.777 - ], - "point": 2 - }, - "10": { - "ele": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/preceding-sibling::CRTrackClip/@Length)", - "ele2": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name='{search}']]/preceding-sibling::CROwneUnit)]/preceding-sibling::CRTrackClip/@Length)", - "search": "나무기차", - "type": "video", - "value": 160, - "point": 2 - }, - "11": { - "ele": "//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/@Length", - "ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name='{search}']]/preceding-sibling::CROwneUnit)]/@Length", - "search": "나무기차", - "type": "video", - "value": "150", - "point": 2 - }, - "12": { - "existEle": "//CRClip[@Path='동영상.mp4']", - "ele": "//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='동영상.mp4']/preceding-sibling::*)]/@Mute", - "type": "searchIndex", - "value": "1", - "point": 2 - }, - "13": { - "existEle": "//CRClip[@Path='이미지2.jpg'] | //CRClip[@Type='11']/CRCUnitArr[@Path='이미지2.jpg']", - "ele": "//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='이미지2.jpg']/preceding-sibling::CRClip | //CRClip[@Type='11']/CRCUnitArr[@Path='이미지2.jpg']/../preceding-sibling::CRClip)][1]/@Length", - "type": "searchIndex", - "value": "150", - "point": 2 - }, - "14": { - "type": "multi", - "ele": "//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='이미지2.jpg']/preceding-sibling::CRClip | //CRClip[@Type='11']/CRCUnitArr[@Path='이미지2.jpg']/../preceding-sibling::CRClip)][1]//CRFilter/@*[name()='ID' or name()='VID101']", - "value": [ - "96", - "13" - ], - "point": 2 - }, - "15": { - "type": "multi", - "ele": "//CRTransFilter[@ClipIndex=count(//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='이미지2.jpg']/preceding-sibling::CRClip | //CRClip[@Type='11']/CRCUnitArr[@Path='이미지2.jpg']/../preceding-sibling::CRClip)][1]/preceding-sibling::CRTrackClip)]/@*[name()='ID' or name()='Range' or name()='Type']", - "value": [ - "35", - "490:520", - "2" - ], - "point": 2 - }, - "16": { - "existEle": "//CRClip[@Path='이미지1.jpg'] | //CRClip[@Type='11']/CRCUnitArr[@Path='이미지1.jpg']", - "ele": "//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='이미지1.jpg']/preceding-sibling::CRClip | //CRClip[@Type='11']/CRCUnitArr[@Path='이미지1.jpg']/../preceding-sibling::CRClip)][1]/@Length", - "type": "searchIndex", - "value": "180", - "point": 2 - }, - "17": { - "type": "multi", - "ele": "//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='이미지1.jpg']/preceding-sibling::CRClip | //CRClip[@Type='11']/CRCUnitArr[@Path='이미지1.jpg']/../preceding-sibling::CRClip)][1]//CRFilter/@*[name()='ID' or name()='VID102']", - "value": [ - "104", - "8" - ], - "point": 2 - }, - "18": { - "type": "multi", - "ele": "//CRTransFilter[@ClipIndex=count(//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='이미지1.jpg']/preceding-sibling::CRClip | //CRClip[@Type='11']/CRCUnitArr[@Path='이미지1.jpg']/../preceding-sibling::CRClip)][1]/preceding-sibling::CRTrackClip)]/@*[name()='ID' or name()='Range' or name()='Type']", - "value": [ - "19", - "670:700", - "2" - ], - "point": 2 - }, - "19": { - "existEle": "//CRClip[@Path='이미지3.jpg'] | //CRClip[@Type='11']/CRCUnitArr[@Path='이미지3.jpg']", - "ele": "//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='이미지3.jpg']/preceding-sibling::CRClip | //CRClip[@Type='11']/CRCUnitArr[@Path='이미지3.jpg']/../preceding-sibling::CRClip)][1]/@Length", - "type": "searchIndex", - "value": "180", - "point": 2 - }, - "20": { - "type": "multi", - "ele": "//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='이미지3.jpg']/preceding-sibling::CRClip | //CRClip[@Type='11']/CRCUnitArr[@Path='이미지3.jpg']/../preceding-sibling::CRClip)][1]//CRFilter/@*[name()='ID' or name()='VID103']", - "value": [ - "108", - "90" - ], - "point": 2 - }, - "21": { - "type": "multi", - "ele": "//CRTransFilter[@ClipIndex=count(//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='이미지3.jpg']/preceding-sibling::CRClip | //CRClip[@Type='11']/CRCUnitArr[@Path='이미지3.jpg']/../preceding-sibling::CRClip)][1]/preceding-sibling::CRTrackClip)]/@*[name()='ID' or name()='Range' or name()='Type']", - "value": [ - "9", - "820:880", - "2" - ], - "point": 2 - }, - "22": { - "ele": "//CROwneUnit[{subtitleIndex}]/CRCUnitArr/@Name", - "type": "opening", - "value": "멋진 기차 모형 (Fine Train Model)", - "point": 3 - }, - "23": { - "ele": "//CROwneUnit[{subtitleIndex}]/CRCUnitArr//GCUnitPool[@Type='1']/GCUnit/@VID102", - "ele2": "//CRCUnitArr[@Name='{search}']//GCUnitPool[@Type='1']/GCUnit/@VID102", - "search": "멋진 기차 모형 (Fine Train Model)", - "type": "opening", - "value": "바탕체", - "point": 2 - }, - "24": { - "ele": "//CROwneUnit[{subtitleIndex}]/CRCUnitArr//GCUnitPool[@Type='1']/GCUnit/@VID101", - "ele2": "//CRCUnitArr[@Name='{search}']//GCUnitPool[@Type='1']/GCUnit/@VID101", - "search": "멋진 기차 모형 (Fine Train Model)", - "type": "opening", - "value": "150", - "point": 2 - }, - "25": { - "ele": "//CROwneUnit[{subtitleIndex}]/CRCUnitArr//GCUnitPool/GCUnit[@Type='4']/@VID100", - "ele2": "//CRCUnitArr[@Name='{search}']//GCUnitPool/GCUnit[@Type='4']/@VID100", - "search": "멋진 기차 모형 (Fine Train Model)", - "type": "opening", - "value": "-14688179", - "point": 2 - }, - "26": { - "ele": "//CROwneUnit[{subtitleIndex}]/CRCUnitArr//GCUnitPool/GCUnit[@Type='2']/@*[name()='VID100' or name()='VID101']", - "ele2": "//CRCUnitArr[@Name='{search}']//GCUnitPool/GCUnit[@Type='2']/@*[name()='VID100' or name()='VID101']", - "search": "멋진 기차 모형 (Fine Train Model)", - "type": "opening", - "value": [ - "0.2", - "-16307450" - ], - "point": 2 - }, - "27": { - "ele": "//CROwneUnit[{subtitleIndex}]/CRCUnitArr/@*[name()='VID505' or name()='VID507']", - "ele2": "//CRCUnitArr[@Name='{search}']/@*[name()='VID505' or name()='VID507']", - "search": "멋진 기차 모형 (Fine Train Model)", - "type": "opening", - "value": [ - "2", - "2" - ], - "point": 3 - }, - "28": { - "ele": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/preceding-sibling::CRTrackClip/@Length)", - "ele2": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name='{search}']]/preceding-sibling::CROwneUnit)]/preceding-sibling::CRTrackClip/@Length)", - "search": "멋진 기차 모형 (Fine Train Model)", - "type": "opening", - "value": 0, - "point": 2 - }, - "29": { - "ele": "//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/@Length", - "ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[sum(preceding-sibling::CRTrackClip/@Length) = {startTime}]/@Length", - "ele3": "//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name='{search}']]/preceding-sibling::CROwneUnit)]/@Length", - "search": "멋진 기차 모형 (Fine Train Model)", - "type": "opening", - "value": "120", - "point": 2 - }, - "30": { - "ele": "//CRTrackList[@Name='오디오1'][@Count>='1']/CRTrackClip[1][not(@ClipIndex='-1')]", - "point": 2 - }, - "31": { - "ele": "//CRTrackArr/CRAudioTrackArr/CRTrackList[@Name='오디오1']/CRTrackClip[@Length='880']", - "point": 2 - }, - "32": { - "ele": "//CRTrackArr/CRAudioTrackArr/CRTrackList[@Name='오디오1']//CRFilter[@Type='2'][@ID='1'][@VID8='60']", - "point": 2 - } - }, - "4": { - "1": { - "type": "multi", - "ele": "//Document/Width/@value | //Document/Height/@value", - "value": [ - "650", - "450" - ], - "point": 5, - "desc": "캔버스 사이즈 650*450" - }, - "2": { - "ele": "none", - "point": 5, - "desc": "배경색 문항은 채점 불가" - }, - "3": { - "ele": "//Layer[contains(Name/@value, 'Layer 2')][MaskOpType/@value='Layering']", - "point": 6 - }, - "4": { - "ele": "none", - "point": 5, - "desc": "가로방향 흐릿하게 문항은 채점 불가" - }, - "5": { - "ele": "//Layer[contains(Name/@value, 'Layer 3')]//shape_type/@value", - "answer": "ROUNDED_RECTANGLE", - "point": 6 - }, - "6": { - "type": "size", - "posX": "//Layer[contains(Name/@value, 'Layer 3')]//op_points[Item]/Item[last()]/X/@value - //Layer[contains(Name/@value, 'Layer 3')]//op_points[Item]/Item[1]/X/@value", - "posY": "//Layer[contains(Name/@value, 'Layer 3')]//op_points[Item]/Item[last()]/Y/@value - //Layer[contains(Name/@value, 'Layer 3')]//op_points[Item]/Item[1]/Y/@value", - "value": { - "width": 370, - "height": 60 - }, - "point": 3, - "desc": "레이어 쉐이프 X, Y 좌표를 가지고 너비, 높이 계산하여 정답 채점" - }, - "7": { - "type": "gradient", - "startColor": "//Layer[contains(Name/@value, 'Layer 3')]//gradient_start_color/@value", - "endColor": "//Layer[contains(Name/@value, 'Layer 3')]//gradient_end_color/@value", - "value": { - "startColor": "347813", - "endColor": "041177" - }, - "point": 6 - }, - "8": { - "type": "exact", - "ele": "//Layer//Shape[shape_type/@value='TEXT']/lines/Item/@value", - "value": "어린이 과학관", - "point": 5 - }, - "9": { - "type": "exact", - "ele": "//Layer//Shape[shape_type/@value='TEXT']/font/Name/@value", - "value": "돋움", - "point": 3 - }, - "10": { - "type": "exact", - "ele": "//Layer//Shape[shape_type/@value='TEXT']/font/Italic/@value", - "value": "True", - "point": 3 - }, - "11": { - "type": "exact", - "ele": "//Layer//Shape[shape_type/@value='TEXT']/font/Size/@value", - "value": "32", - "point": 3 - }, - "12": { - "type": "color", - "ele": "//Layer//Shape[shape_type/@value='TEXT'][contains(draw_type/@value, 'Interior')]/secondary_color/@value", - "value": "f04da5", - "point": 3, - "desc": "색상 코드 비교 시 소문자로 입력할 것" - }, - "13": { - "type": "exact", - "ele": "//Layer//Shape[shape_type/@value='TEXT']/outline_peninfo/Width/@value", - "value": "3", - "point": 3 - }, - "14": { - "type": "color", - "ele": "//Layer//Shape[shape_type/@value='TEXT'][contains(draw_type/@value, 'Outline')]/primary_color/@value", - "value": "ffe000", - "point": 3, - "desc": "색상 코드 비교 시 소문자로 입력할 것" - }, - "15": { - "ele": "//Layer[MaskOpType/@value='Clipping'][last()]", - "point": 6, - "desc": "클리핑 마스크 항목은 별도 레이어로 추가되고 해당 속성을 추가해놓은 레이어가 있는지 여부 체크 함" - }, - "16": { - "ele": "//Layer[contains(Name/@value, 'Layer 3')]//shape_type/@value", - "value": "RECTANGLE", - "point": 3 - }, - "17": { - "type": "size", - "posX": "//Layer[contains(Name/@value, 'Layer 5')]//op_points[Item]/Item[last()]/X/@value - //Layer[contains(Name/@value, 'Layer 5')]//op_points[Item]/Item[1]/X/@value", - "posY": "//Layer[contains(Name/@value, 'Layer 5')]//op_points[Item]/Item[last()]/Y/@value - //Layer[contains(Name/@value, 'Layer 5')]//op_points[Item]/Item[1]/Y/@value", - "value": { - "width": 150, - "height": 150 - }, - "point": 3, - "desc": "레이어 쉐이프 X, Y 좌표를 가지고 너비, 높이 계산하여 정답 채점" - }, - "18": { - "ele": "//Layer[contains(Name/@value, 'Layer 5')]//outline_peninfo/Width/@value", - "value": "7", - "point": 3 - }, - "19": { - "type": "color", - "ele": "//Layer//Shape[shape_type/@value='RECTANGLE'][contains(draw_type/@value, 'Outline')]/primary_color/@value", - "value": "008878", - "point": 3, - "desc": "색상 코드 비교 시 소문자로 입력할 것(채우기:secondary_color, 외곽선:primary_color)" - }, - "20": { - "type": "shadow", - "ele": { - "shadow": "//Layer//Shape[shape_type/@value='RECTANGLE'][contains(draw_type/@value, 'Shadow')]", - "width": "//Layer//Shape[shape_type/@value='RECTANGLE'][contains(draw_type/@value, 'Shadow')]/shadow_width/@value", - "distance": "//Layer//Shape[shape_type/@value='RECTANGLE'][contains(draw_type/@value, 'Shadow')]/shadow_distance/@value", - "blur": "//Layer//Shape[shape_type/@value='RECTANGLE'][contains(draw_type/@value, 'Shadow')]/shadow_blur/@value", - "angle": "//Layer//Shape[shape_type/@value='RECTANGLE'][contains(draw_type/@value, 'Shadow')]/shadow_angle/@value" - }, - "value": { - "width": "5", - "distance": "3", - "blur": "1", - "angle": "320" - }, - "point": 5, - "desc": "그림자 속성이 있는 경우 그림자 속성의 너비, 거리, 흐림 정도, 각도를 비교하여 정답 채점" - } - } -} \ No newline at end of file diff --git a/회차별채점자료/2502/json_채점기준표/0320_DIC_채점기준표_Layer.json b/회차별채점자료/2502/json_채점기준표/0320_DIC_채점기준표_Layer.json deleted file mode 100644 index 8ec84df..0000000 --- a/회차별채점자료/2502/json_채점기준표/0320_DIC_채점기준표_Layer.json +++ /dev/null @@ -1,558 +0,0 @@ -{ - "0": { - "1": { - "ele": "none", - "point": 0 - }, - "2": { - "ele": "none", - "point": 0 - }, - "3": { - "ele": "none", - "point": 0 - }, - "4": { - "ele": "none", - "point": 0 - }, - "5": { - "ele": "none", - "point": 0 - }, - "6": { - "ele": "none", - "point": 0 - }, - "7": { - "ele": "none", - "point": 0 - }, - "8": { - "ele": "$[?(@.width == 65 && @.height == 45)]", - "type": "boolean", - "point": 10 - } - }, - "1": { - "1": { - "ele": "none", - "point": 0 - }, - "2": { - "ele": "none", - "point": 0 - }, - "3": { - "ele": "none", - "point": 0 - }, - "4": { - "ele": "$.children[?(@.name=='마나가하')]", - "type": "boolean", - "point": 10 - }, - "5": { - "ele": "none", - "point": 0 - }, - "6": { - "ele": "$.children[?(@.name=='Managaha Island')].name", - "value": "Managaha Island", - "point": 10 - }, - "7": { - "ele": "$.children[?(@.name=='Managaha Island')].text.font.names[0]", - "type": "font", - "value": "Arial", - "point": 10 - }, - "8": { - "ele": "$.children[?(@.name=='Managaha Island')].text.font.names[0]", - "value": "Arial-BoldItalicMT", - "point": 10 - }, - "9": { - "ele": "$.children[?(@.name=='Managaha Island')].text.font.sizes[0]", - "value": 48, - "point": 10 - }, - "10": { - "ele": "$.children[?(@.name=='Managaha Island')].text.font.colors[0]", - "type": "color", - "value": "495fd1", - "point": 10 - }, - "11": { - "ele": "none", - "point": 0 - }, - "12": { - "ele": "none", - "point": 0 - }, - "13": { - "ele": "none", - "point": 0 - }, - "14": { - "ele": "$.children[?(@.name=='사이판 섬 즐기기')].name", - "value": "사이판 섬 즐기기", - "point": 10 - }, - "15": { - "ele": "$.children[?(@.name=='사이판 섬 즐기기')].text.font.names[0]", - "type": "font", - "value": "DotumChe", - "point": 10 - }, - "16": { - "ele": "$.children[?(@.name=='사이판 섬 즐기기')].text.font.sizes[0]", - "value": 36, - "point": 10 - }, - "17": { - "ele": "$.children[?(@.name=='사이판 섬 즐기기')].text.font.colors[0]", - "type": "color", - "value": "e52e20", - "point": 10 - }, - "18": { - "ele": "none", - "point": 0 - }, - "19": { - "ele": "none", - "point": 0 - }, - "20": { - "ele": "none", - "point": 0 - }, - "21": { - "ele": "none", - "point": 0 - }, - "22": { - "ele": "$.children[?(@.name=='마나가하')]", - "type": "boolean", - "point": 10 - }, - "23": { - "ele": "none", - "point": 0 - }, - "24": { - "ele": "none", - "point": 0 - }, - "25": { - "ele": "none", - "point": 0 - }, - "26": { - "ele": "$[?(@.width == 65 && @.height == 35)]", - "type": "boolean", - "point": 10 - } - }, - "2": { - "1": { - "ele": "//CRClipArr/CRClip[position() = //CRTrackList[1]/CRTrackClip/@ClipIndex]/@Path", - "type": "array", - "value": [ - "동영상.mp4", - "이미지1.jpg", - "이미지3.jpg", - "이미지2.jpg" - ], - "point": 4 - }, - "2": { - "ele": "/CROASTERP/CRTrackArr[1]/CRVideoTrackArr[1]/CRTrackList[1]/CRTrackClip[1][@Speed='150']", - "point": 2 - }, - "3": { - "ele": "count(//CRClip[@Path='동영상.mp4']/preceding-sibling::*)", - "type": "startend", - "start": "0", - "end": "270", - "point": 2 - }, - "4": { - "ele": "//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='동영상.mp4']/preceding-sibling::*)]//CRFilter[@ID='40'][@VID100='8'][@VID103='0.89999998']", - "point": 3 - }, - "5": { - "ele": "//CROwneUnit[{subtitleIndex}]/CRCUnitArr/@Name", - "type": "video", - "value": "자연이 빚어낸 섬", - "point": 3 - }, - "6": { - "ele": "//CROwneUnit[{subtitleIndex}]/CRCUnitArr//GCUnitPool[@Type='1']/GCUnit/@VID102", - "ele2": "//CRCUnitArr[@Name='{search}']//GCUnitPool[@Type='1']/GCUnit/@VID102", - "search": "자연이 빚어낸 섬", - "type": "video", - "value": "바탕체", - "point": 2 - }, - - "7": { - "ele": "//CROwneUnit[{subtitleIndex}]/CRCUnitArr//GCUnitPool[@Type='1']/GCUnit/@VID101", - "ele2": "//CRCUnitArr[@Name=\"{search}\"]//GCUnitPool[@Type='1']/GCUnit/@VID101", - "search": "자연이 빚어낸 섬", - "type": "video", - "value": "120", - "point": 2 - }, - "8": { - "ele": "//CROwneUnit[{subtitleIndex}]/CRCUnitArr//GCUnitPool/GCUnit[@Type='4']/@VID100", - "ele2": "//CRCUnitArr[@Name=\"{search}\"]//GCUnitPool/GCUnit[@Type='4']/@VID100", - "search": "자연이 빚어낸 섬", - "type": "video", - "value": "-1487764", - "point": 2 - }, - "9": { - "ele": "//CROwneUnit[{subtitleIndex}]/CRCUnitArr/@VID600' or name()='VID601", - "ele2": "//CRCUnitArr[@Name={search}]/@*[name()='VID600' or name()='VID601']", - "type": "video", - "search": "자연이 빚어낸 섬", - "value": [ - 0.071, - 0.777 - ], - "point": 2 - }, - "10": { - "ele": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/preceding-sibling::CRTrackClip/@Length)", - "ele2": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name='{search}']]/preceding-sibling::CROwneUnit)]/preceding-sibling::CRTrackClip/@Length)", - "search": "자연이 빚어낸 섬", - "type": "video", - "value": 150, - "point": 2 - }, - "11": { - "ele": "//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/@Length", - "ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name='{search}']]/preceding-sibling::CROwneUnit)]/@Length", - "search": "자연이 빚어낸 섬", - "type": "video", - "value": "120", - "point": 2 - }, - "12": { - "existEle": "//CRClip[@Path='동영상.mp4']", - "ele": "//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='동영상.mp4']/preceding-sibling::*)]/@Mute", - "type": "searchIndex", - "value": "1", - "point": 2 - }, - "13": { - "existEle": "//CRClip[@Path='이미지1.jpg'] | //CRClip[@Type='11']/CRCUnitArr[@Path='이미지1.jpg']", - "ele": "//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='이미지1.jpg']/preceding-sibling::CRClip | //CRClip[@Type='11']/CRCUnitArr[@Path='이미지1.jpg']/../preceding-sibling::CRClip)][1]/@Length", - "type": "searchIndex", - "value": "150", - "point": 2 - }, - "14": { - "type": "multi", - "ele": "//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='이미지1.jpg']/preceding-sibling::CRClip | //CRClip[@Type='11']/CRCUnitArr[@Path='이미지1.jpg']/../preceding-sibling::CRClip)][1]//CRFilter/@*[name()='ID' or name()='VID101']", - "value": [ - "173", - "450" - ], - "point": 2 - }, - "15": { - "type": "multi", - "ele": "//CRTransFilter[@ClipIndex=count(//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='이미지1.jpg']/preceding-sibling::CRClip | //CRClip[@Type='11']/CRCUnitArr[@Path='이미지1.jpg']/../preceding-sibling::CRClip)][1]/preceding-sibling::CRTrackClip)]/@*[name()='ID' or name()='Range' or name()='Type']", - "value": [ - "11", - "360:420", - "2" - ], - "point": 2 - }, - "16": { - "existEle": "//CRClip[@Path='이미지3.jpg'] | //CRClip[@Type='11']/CRCUnitArr[@Path='이미지3.jpg']", - "ele": "//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='이미지3.jpg']/preceding-sibling::CRClip | //CRClip[@Type='11']/CRCUnitArr[@Path='이미지3.jpg']/../preceding-sibling::CRClip)][1]/@Length", - "type": "searchIndex", - "value": "180", - "point": 2 - }, - "17": { - "type": "multi", - "ele": "//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='이미지3.jpg']/preceding-sibling::CRClip | //CRClip[@Type='11']/CRCUnitArr[@Path='이미지3.jpg']/../preceding-sibling::CRClip)][1]//CRFilter/@*[name()='ID' or name()='VID101']", - "value": [ - "128", - "7" - ], - "point": 2 - }, - "18": { - "type": "multi", - "ele": "//CRTransFilter[@ClipIndex=count(//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='이미지3.jpg']/preceding-sibling::CRClip | //CRClip[@Type='11']/CRCUnitArr[@Path='이미지3.jpg']/../preceding-sibling::CRClip)][1]/preceding-sibling::CRTrackClip)]/@*[name()='ID' or name()='Range' or name()='Type']", - "value": [ - "8", - "540:600", - "2" - ], - "point": 2 - }, - "19": { - "existEle": "//CRClip[@Path='이미지2.jpg'] | //CRClip[@Type='11']/CRCUnitArr[@Path='이미지2.jpg']", - "ele": "//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='이미지2.jpg']/preceding-sibling::CRClip | //CRClip[@Type='11']/CRCUnitArr[@Path='이미지2.jpg']/../preceding-sibling::CRClip)][1]/@Length", - "type": "searchIndex", - "value": "180", - "point": 2 - }, - "20": { - "type": "multi", - "ele": "//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='이미지2.jpg']/preceding-sibling::CRClip | //CRClip[@Type='11']/CRCUnitArr[@Path='이미지2.jpg']/../preceding-sibling::CRClip)][1]//CRFilter/@*[name()='ID' or name()='VID104']", - "value": [ - "67", - "5" - ], - "point": 2 - }, - "21": { - "type": "multi", - "ele": "//CRTransFilter[@ClipIndex=count(//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='이미지2.jpg']/preceding-sibling::CRClip | //CRClip[@Type='11']/CRCUnitArr[@Path='이미지2.jpg']/../preceding-sibling::CRClip)][1]/preceding-sibling::CRTrackClip)]/@*[name()='ID' or name()='Range' or name()='Type']", - "value": [ - "19", - "750:780", - "2" - ], - "point": 2 - }, - "22": { - "ele": "//CROwneUnit[{subtitleIndex}]/CRCUnitArr/@Name", - "type": "opening", - "value": "마나가하섬으로 가자 (Let's go to Managaha Island)", - "point": 3 - }, - "23": { - "ele": "//CROwneUnit[{subtitleIndex}]/CRCUnitArr//GCUnitPool[@Type='1']/GCUnit/@VID102", - "ele2": "//CRCUnitArr[@Name='{search}']//GCUnitPool[@Type='1']/GCUnit/@VID102", - "search": "마나가하섬으로 가자 (Let's go to Managaha Island)", - "type": "opening", - "value": "돋움체", - "point": 2 - }, - "24": { - "ele": "//CROwneUnit[{subtitleIndex}]/CRCUnitArr//GCUnitPool[@Type='1']/GCUnit/@VID101", - "ele2": "//CRCUnitArr[@Name=\"{search}\"]//GCUnitPool[@Type='1']/GCUnit/@VID101", - "search": "마나가하섬으로 가자 (Let's go to Managaha Island)", - "type": "opening", - "value": "150", - "point": 2 - }, - "25": { - "ele": "//CROwneUnit[{subtitleIndex}]/CRCUnitArr//GCUnitPool/GCUnit[@Type='4']/@VID100", - "ele2": "//CRCUnitArr[@Name=\"{search}\"]//GCUnitPool/GCUnit[@Type='4']/@VID100", - "search": "마나가하섬으로 가자 (Let's go to Managaha Island)", - "type": "opening", - "value": "-1487764", - "point": 2 - }, - "26": { - "ele": "//CROwneUnit[{subtitleIndex}]/CRCUnitArr//GCUnitPool/GCUnit[@Type='2']/@*[name()='VID100' or name()='VID101']", - "ele2": "//CRCUnitArr[@Name=\"{search}\"]//GCUnitPool/GCUnit[@Type='2']/@*[name()='VID100' or name()='VID101']", - "search": "마나가하섬으로 가자 (Let's go to Managaha Island)", - "type": "opening", - "value": [ - "0.300", - "-1" - ], - "point": 2 - }, - "27": { - "ele": "//CROwneUnit[{subtitleIndex}]/CRCUnitArr/@*[name()='VID505' or name()='VID507']", - "ele2": "//CRCUnitArr[@Name=\"{search}\"]/@*[name()='VID505' or name()='VID507']", - "search": "마나가하섬으로 가자 (Let's go to Managaha Island)", - "type": "opening", - "value":[ - "1", - "2" - ], - "point": 3 - }, - "28": { - "ele": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/preceding-sibling::CRTrackClip/@Length)", - "ele2": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name=\"{search}\"]]/preceding-sibling::CROwneUnit)]/preceding-sibling::CRTrackClip/@Length)", - "search": "마나가하섬으로 가자 (Let's go to Managaha Island)", - "type": "opening", - "value": 0, - "point": 2 - }, - "29": { - "ele": "//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/@Length", - "ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[sum(preceding-sibling::CRTrackClip/@Length) = {startTime}]/@Length", - "ele3": "//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name=\"{search}\"]]/preceding-sibling::CROwneUnit)]/@Length", - "search": "마나가하섬으로 가자 (Let's go to Managaha Island)", - "type": "opening", - "value": "120", - "point": 2 - }, - "30": { - "ele": "//CRTrackList[@Name='오디오1'][@Count>='1']/CRTrackClip[1][not(@ClipIndex='-1')]", - "point": 2 - }, - "31": { - "ele": "//CRTrackArr/CRAudioTrackArr/CRTrackList[@Name='오디오1']/CRTrackClip[@Length='720']", - "point": 2 - }, - "32": { - "ele": "//CRTrackArr/CRAudioTrackArr/CRTrackList[@Name='오디오1']//CRFilter[@Type='2'][@ID='1'][@VID8='90']", - "point": 2 - } - }, - "4": { - "1": { - "type": "multi", - "ele": "//Document/Width/@value | //Document/Height/@value", - "value": [ - "650", - "450" - ], - "point": 5, - "desc": "캔버스 사이즈 650*450" - }, - "2": { - "ele": "none", - "point": 5, - "desc": "배경색 문항은 채점 불가" - }, - "3": { - "ele": "//Layer[contains(Name/@value, 'Layer 2')][MaskOpType/@value='Layering']", - "point": 6 - }, - "4": { - "ele": "none", - "point": 5, - "desc": "가로방향 흐릿하게 문항은 채점 불가" - }, - "5": { - "ele": "//Layer[contains(Name/@value, 'Layer 3')]//shape_type/@value", - "answer": "ROUNDED_RECTANGLE", - "point": 6 - }, - "6": { - "type": "size", - "posX": "//Layer[contains(Name/@value, 'Layer 3')]//op_points[Item]/Item[last()]/X/@value - //Layer[contains(Name/@value, 'Layer 3')]//op_points[Item]/Item[1]/X/@value", - "posY": "//Layer[contains(Name/@value, 'Layer 3')]//op_points[Item]/Item[last()]/Y/@value - //Layer[contains(Name/@value, 'Layer 3')]//op_points[Item]/Item[1]/Y/@value", - "value": { - "width": 370, - "height": 60 - }, - "point": 3, - "desc": "레이어 쉐이프 X, Y 좌표를 가지고 너비, 높이 계산하여 정답 채점" - }, - "7": { - "type": "gradient", - "startColor": "//Layer[contains(Name/@value, 'Layer 3')]//gradient_start_color/@value", - "endColor": "//Layer[contains(Name/@value, 'Layer 3')]//gradient_end_color/@value", - "value": { - "startColor": "347813", - "endColor": "041177" - }, - "point": 6 - }, - "8": { - "type": "exact", - "ele": "//Layer//Shape[shape_type/@value='TEXT']/lines/Item/@value", - "value": "어린이 과학관", - "point": 5 - }, - "9": { - "type": "exact", - "ele": "//Layer//Shape[shape_type/@value='TEXT']/font/Name/@value", - "value": "돋움", - "point": 3 - }, - "10": { - "type": "exact", - "ele": "//Layer//Shape[shape_type/@value='TEXT']/font/Italic/@value", - "value": "True", - "point": 3 - }, - "11": { - "type": "exact", - "ele": "//Layer//Shape[shape_type/@value='TEXT']/font/Size/@value", - "value": "32", - "point": 3 - }, - "12": { - "type": "color", - "ele": "//Layer//Shape[shape_type/@value='TEXT'][contains(draw_type/@value, 'Interior')]/secondary_color/@value", - "value": "f04da5", - "point": 3, - "desc": "색상 코드 비교 시 소문자로 입력할 것" - }, - "13": { - "type": "exact", - "ele": "//Layer//Shape[shape_type/@value='TEXT']/outline_peninfo/Width/@value", - "value": "3", - "point": 3 - }, - "14": { - "type": "color", - "ele": "//Layer//Shape[shape_type/@value='TEXT'][contains(draw_type/@value, 'Outline')]/primary_color/@value", - "value": "ffe000", - "point": 3, - "desc": "색상 코드 비교 시 소문자로 입력할 것" - }, - "15": { - "ele": "//Layer[MaskOpType/@value='Clipping'][last()]", - "point": 6, - "desc": "클리핑 마스크 항목은 별도 레이어로 추가되고 해당 속성을 추가해놓은 레이어가 있는지 여부 체크 함" - }, - "16": { - "ele": "//Layer[contains(Name/@value, 'Layer 3')]//shape_type/@value", - "value": "RECTANGLE", - "point": 3 - }, - "17": { - "type": "size", - "posX": "//Layer[contains(Name/@value, 'Layer 5')]//op_points[Item]/Item[last()]/X/@value - //Layer[contains(Name/@value, 'Layer 5')]//op_points[Item]/Item[1]/X/@value", - "posY": "//Layer[contains(Name/@value, 'Layer 5')]//op_points[Item]/Item[last()]/Y/@value - //Layer[contains(Name/@value, 'Layer 5')]//op_points[Item]/Item[1]/Y/@value", - "value": { - "width": 150, - "height": 150 - }, - "point": 3, - "desc": "레이어 쉐이프 X, Y 좌표를 가지고 너비, 높이 계산하여 정답 채점" - }, - "18": { - "ele": "//Layer[contains(Name/@value, 'Layer 5')]//outline_peninfo/Width/@value", - "value": "7", - "point": 3 - }, - "19": { - "type": "color", - "ele": "//Layer//Shape[shape_type/@value='RECTANGLE'][contains(draw_type/@value, 'Outline')]/primary_color/@value", - "value": "008878", - "point": 3, - "desc": "색상 코드 비교 시 소문자로 입력할 것(채우기:secondary_color, 외곽선:primary_color)" - }, - "20": { - "type": "shadow", - "ele": { - "shadow": "//Layer//Shape[shape_type/@value='RECTANGLE'][contains(draw_type/@value, 'Shadow')]", - "width": "//Layer//Shape[shape_type/@value='RECTANGLE'][contains(draw_type/@value, 'Shadow')]/shadow_width/@value", - "distance": "//Layer//Shape[shape_type/@value='RECTANGLE'][contains(draw_type/@value, 'Shadow')]/shadow_distance/@value", - "blur": "//Layer//Shape[shape_type/@value='RECTANGLE'][contains(draw_type/@value, 'Shadow')]/shadow_blur/@value", - "angle": "//Layer//Shape[shape_type/@value='RECTANGLE'][contains(draw_type/@value, 'Shadow')]/shadow_angle/@value" - }, - "value": { - "width": "5", - "distance": "3", - "blur": "1", - "angle": "320" - }, - "point": 5, - "desc": "그림자 속성이 있는 경우 그림자 속성의 너비, 거리, 흐림 정도, 각도를 비교하여 정답 채점" - } - } -} \ No newline at end of file