곰믹스 자막(3-10)(3-11) 자막텍스트로 ClipIndex 값 구하는 로직 추가

This commit is contained in:
2025-03-21 17:26:51 +09:00
parent 77906aff1d
commit 257df29eee
11 changed files with 56 additions and 1158 deletions

View File

@@ -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') {