From 3935dd45b132cb35571ce88ba3f424440e97deee Mon Sep 17 00:00:00 2001 From: dragdra Date: Thu, 20 Feb 2025 18:30:42 +0900 Subject: [PATCH] =?UTF-8?q?(3-1)=ED=81=B4=EB=A6=BD=20=EC=A1=B0=EA=B0=81,?= =?UTF-8?q?=20=EA=B3=B5=EB=B0=B1=205=ED=94=84=EB=A0=88=EC=9E=84=20?= =?UTF-8?q?=EC=9D=B4=ED=95=98=20=EB=AC=B4=EC=8B=9C=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +++ 250220_DIC_2521A_TEST.xlsx | Bin 0 -> 26410 bytes README.md | 8 ++++++-- getToday.js | 12 ++++++++++++ psdExport_2.js | 30 +++++++++++++++++------------- z.xbook | 2 +- 6 files changed, 39 insertions(+), 16 deletions(-) create mode 100644 250220_DIC_2521A_TEST.xlsx create mode 100644 getToday.js diff --git a/.gitignore b/.gitignore index 1406706..4e287b3 100644 --- a/.gitignore +++ b/.gitignore @@ -132,4 +132,7 @@ dist output +# xpath notebook +.xbook + 회차별채점자료/*/정답파일 \ No newline at end of file diff --git a/250220_DIC_2521A_TEST.xlsx b/250220_DIC_2521A_TEST.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c86787e3d8c964ba568cbcd13fbb1d65867971fb GIT binary patch literal 26410 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 { + const now = new Date(); + const yy = String(now.getFullYear()).slice(2); // 연도 끝 두 자리 + const mm = String(now.getMonth() + 1).padStart(2, "0"); // 월 (01~12) + const dd = String(now.getDate()).padStart(2, "0"); // 일 (01~31) + return `${yy}${mm}${dd}`; +}; + +// 실행 +console.log(getToday()); // 예: 240217 (2024년 2월 17일) + +module.exports = getToday; \ No newline at end of file diff --git a/psdExport_2.js b/psdExport_2.js index a55bcc1..b57a8aa 100644 --- a/psdExport_2.js +++ b/psdExport_2.js @@ -7,12 +7,14 @@ const xpath = require('xpath'); const { DOMParser } = require('xmldom'); const findSimilarString = require('./findSimilarString'); +const getToday = require('./getToday.js'); +const todayDate = getToday(); // -------------------------------------------------------- -// const scoringJson = require('./DIC_2521A.json'); +const scoringJson = require('./DIC_2521A.json'); // const scoringJson = require('./DIC_2521B.json'); // const scoringJson = require('./DIC_2521C.json'); -const scoringJson = require('./DIC_2521D.json'); +// const scoringJson = require('./DIC_2521D.json'); // TEST // const scoringJson = require('./DIC_2521A_TEST.json'); @@ -23,25 +25,25 @@ const scoringJson = require('./DIC_2521D.json'); // const answerFilesDir = './output/A/DIC'; // const answerFilesDir = './output/B/DIC'; // const answerFilesDir = './output/C/DIC'; -const answerFilesDir = './output/D/DIC'; +// const answerFilesDir = './output/D/DIC'; // TEST -// const answerFilesDir = './output/A/TEST'; +const answerFilesDir = './output/A/TEST'; // const answerFilesDir = './output/B/TEST'; // const answerFilesDir = './output/C/TEST'; // const answerFilesDir = './output/D/TEST'; // -------------------------------------------------------- -// const outputExcelFile = './DIC_2521A_result.xlsx'; -// const outputExcelFile = './DIC_2521B_result.xlsx'; -// const outputExcelFile = './DIC_2521C_result.xlsx'; -// const outputExcelFile = './DIC_2521D_result.xlsx'; +// const outputExcelFile = './'+todayDate+'_DIC_2521A_result.xlsx'; +// const outputExcelFile = './'+todayDate+'_DIC_2521B_result.xlsx'; +// const outputExcelFile = './'+todayDate+'_DIC_2521C_result.xlsx'; +// const outputExcelFile = './'+todayDate+'_DIC_2521D_result.xlsx'; // TEST -// const outputExcelFile = './DIC_2521A_TEST.xlsx'; -// const outputExcelFile = './DIC_2521B_TEST.xlsx'; -// const outputExcelFile = './DIC_2521C_TEST.xlsx'; -const outputExcelFile = './DIC_2521D_TEST.xlsx'; +const outputExcelFile = './'+todayDate+'_DIC_2521A_TEST.xlsx'; +// const outputExcelFile = './'+todayDate+'_DIC_2521B_TEST.xlsx'; +// const outputExcelFile = './'+todayDate+'_DIC_2521C_TEST.xlsx'; +// const outputExcelFile = './'+todayDate+'_DIC_2521D_TEST.xlsx'; // -------------------------------------------------------- // 답안 폴더 내부에 디렉토리가 아닌 일반 파일이 있을 경우 디렉토리만 필터링 해서 불러옴 @@ -186,7 +188,9 @@ function getGmepScore(gmepData, scoringJson, index) { if (trackListNode) { // CRTrackClip 요소의 ClipIndex를 참조하여 CRClip 요소의 Path와 Type 출력 - const clipIndexes = xpath.select('CRTrackClip[@ClipIndex!="-1"][@Length!="1"]/@ClipIndex' + // @Length(클립재생길이) 5프레임 이하, @ClipLength -1인 항목은 제외 + // 10프레임은 타임라인상 눈에 잘 보여서 5프레임으로 우선 수정 + const clipIndexes = xpath.select('CRTrackClip[not(@Length<="5" and @ClipLength="-1")]/@ClipIndex' , trackListNode); clipIndexes.forEach(indexNode => { const clipIndex = parseInt(indexNode.value, 10) + 1; // XPath는 1-based index를 사용 diff --git a/z.xbook b/z.xbook index b96caed..de698e8 100644 --- a/z.xbook +++ b/z.xbook @@ -1 +1 @@ -[{"kind":1,"language":"markdown","value":"# XPath Notebook\r\nDate: 2025-02-04     Time: 17:56:45"},{"kind":2,"language":"xpath","value":"//CRTransFilter[@ClipIndex=count(//CRTrackList[@Name='비디오1']/CRTrackClip[@Type='2' and @ClipIndex=count(//CRClip[@Path='이미지2.jpg']/preceding-sibling::*)]/preceding-sibling::CRTrackClip)]/@ID|//CRTransFilter[@ClipIndex=count(//CRTrackList[@Name='비디오1']/CRTrackClip[@Type='2' and @ClipIndex=count(//CRClip[@Path='이미지2.jpg']/preceding-sibling::*)]/preceding-sibling::CRTrackClip)]/@Range|//CRTransFilter[@ClipIndex=count(//CRTrackList[@Name='비디오1']/CRTrackClip[@Type='2' and @ClipIndex=count(//CRClip[@Path='이미지2.jpg']/preceding-sibling::*)]/preceding-sibling::CRTrackClip)]/@Type"},{"kind":2,"language":"xpath","value":"//CRTransFilter[@ClipIndex=count(//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='이미지2.jpg']/preceding-sibling::*)]/preceding-sibling::CRTrackClip)]/@ID"},{"kind":2,"language":"xpath","value":"count(//CRClip[@Path='이미지2.jpg']/preceding-sibling::*)"},{"kind":2,"language":"xpath","value":"//CRVideoTrackArr/CRTrackList[@Name=\"비디오1\"]/CRTrackClip[@ClipIndex!='-1']/@ClipIndex"},{"kind":2,"language":"xpath","value":"//CRVideoTrackArr/CRTrackList[@Name=\"비디오1\"]/CRTrackClip[@ClipIndex!='-1']/@ClipIndex"},{"kind":2,"language":"xpath","value":"(//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=3])[1]/preceding-sibling::CRTrackClip"},{"kind":2,"language":"xpath","value":"count((//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=3])[1]/preceding-sibling::CRTrackClip)"},{"kind":2,"language":"xpath","value":"//CRTransFilter[@ClipIndex=count(//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='이미지2.jpg']/preceding-sibling::*)][1]/preceding-sibling::CRTrackClip)]/@ID"},{"kind":2,"language":"xpath","value":"//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex=count(//CROwneUnit[1]/CRCUnitArr/preceding::CROwneUnit))]"},{"kind":2,"language":"xpath","value":"//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex=count(//CROwneUnit[1]/CRCUnitArr/preceding::CROwneUnit))]"},{"kind":2,"language":"xpath","value":"sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex=count(//CROwneUnit[1]/CRCUnitArr/preceding::CROwneUnit))]/@Length)"},{"kind":2,"language":"xpath","value":"//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex=count(//CROwneUnit[2]/CRCUnitArr/preceding::CROwneUnit))]/@Length"},{"kind":2,"language":"xpath","value":"sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex=count(//CROwneUnit[2]/preceding-sibling::CROwneUnit))]/@Length)"},{"kind":2,"language":"xpath","value":"//CROwneUnit[2]/preceding-sibling::CROwneUnit"},{"kind":2,"language":"xpath","value":"//CROwneUnit[2]/CRCUnitArr"},{"kind":2,"language":"xpath","value":"/CROASTERP/CRTrackArr[1]/CRVideoTrackArr[1]/CRTrackList[1]/CRTrackClip[@ClipIndex != '-1'][1][@Speed='120']"},{"kind":2,"language":"xpath","value":"//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='이미지3.jpg']/preceding-sibling::*)]//CRFilter/@ID |//CRTrackList[@Name='비디오1']/CRTrackClip[@ClipIndex=count(//CRClip[@Path='이미지3.jpg']/preceding-sibling::*)]//CRFilter/@VID100"},{"kind":2,"language":"xpath","value":"//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][@ClipLength - @Length = @Pos]"},{"kind":2,"language":"xpath","value":"//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[.//CRCUnitArr[@Name='젖소와 함께한 시간 With milk cow']]/preceding::CROwneUnit)][@ClipLength - @Length = @Pos]"},{"kind":2,"language":"xpath","value":"//CRTrackList[@Name='텍스트']/CRTrackClip[1][@ClipLength - @Length = @Pos]"},{"kind":2,"language":"xpath","value":"sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex=count(//CROwneUnit[1]/CRCUnitArr/preceding::CROwneUnit))]/@Length)"},{"kind":2,"language":"xpath","value":"//CROwneUnitArr/CROwneUnit[//CRTrackList[@Name='텍스트']//CRTrackClip[position()=1]/@ClipIndex+1]"},{"kind":2,"language":"xpath","value":"//CRTrackList[@Name='텍스트']//CRTrackClip[1]/@ClipIndex+1"},{"kind":2,"language":"xpath","value":"//CRClipArr/CRClip[position() = //CRVideoTrackArr/CRTrackList[1]/CRTrackClip/@ClipIndex]/@Path"},{"kind":2,"language":"xpath","value":"//CRClipArr/CRClip[position()=[0,4,3,2]]"},{"kind":2,"language":"xpath","value":"//CRTrackList[@Name=\"비디오1\"]/CRTrackClip[@ClipIndex != \"-1\" or @ClipLength != \"-1\"]/@ClipIndex"},{"kind":2,"language":"xpath","value":"//CRTrackList[@Name=\"비디오1\"]/CRTrackClip[@ClipIndex >= 0 and @ClipIndex <= 4]/@ClipIndex"},{"kind":2,"language":"xpath","value":"//CRTrackList[@Name=\"비디오1\"]/CRTrackClip[@ClipIndex != \"-1\"]/@ClipIndex"},{"kind":2,"language":"xpath","value":"sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex=count(//CROwneUnit[1]/CRCUnitArr/preceding::CROwneUnit))]/@Length)"},{"kind":2,"language":"xpath","value":"//CROwneUnitArr/CROwneUnit[//CRTrackList[@Name='텍스트']//CRTrackClip[position()=1]/@ClipIndex+1]"},{"kind":2,"language":"xpath","value":"//CRTrackList[@Name='텍스트']//CRTrackClip[position()=1]"}] \ No newline at end of file +[{"kind":2,"language":"xpath","value":"//CRTrackList[@Name=\"비디오1\"]//CRTrackClip[not(@Length<\"10\" and @ClipLength=\"-1\")]/@ClipIndex\r\n//CRTrackList[@Name=\"비디오1\"]//CRTrackClip[not(@Length<\"10\" and @ClipLength='-1')]"}] \ No newline at end of file