diff --git a/250520_DIW_2504회_B형_TEST.xlsx b/250520_DIW_2504회_B형_TEST.xlsx deleted file mode 100644 index 6b1944e..0000000 Binary files a/250520_DIW_2504회_B형_TEST.xlsx and /dev/null differ diff --git a/250521_DIW_2504회_B형_채점결과.xlsx b/250521_DIW_2504회_B형_채점결과.xlsx new file mode 100644 index 0000000..8e8ec41 Binary files /dev/null and b/250521_DIW_2504회_B형_채점결과.xlsx differ diff --git a/250521_DIW_2504회_C형_TEST.xlsx b/250521_DIW_2504회_C형_TEST.xlsx new file mode 100644 index 0000000..9eda480 Binary files /dev/null and b/250521_DIW_2504회_C형_TEST.xlsx differ diff --git a/250521_DIW_2504회_C형_채점결과.xlsx b/250521_DIW_2504회_C형_채점결과.xlsx new file mode 100644 index 0000000..e3f7916 Binary files /dev/null and b/250521_DIW_2504회_C형_채점결과.xlsx differ diff --git a/DIW_2504A_new.json b/DIW_2504A_new.json index 04045c8..7028356 100644 --- a/DIW_2504A_new.json +++ b/DIW_2504A_new.json @@ -10,13 +10,13 @@ "1": { "path": "//PAGEMARGIN", "value": { - "Bottom": 5669, - "Footer": 2834, + "Top": 20, + "Bottom": 20, + "Left": 20, + "Right": 20, + "Header": 10, "Gutter": 0, - "Header": 2834, - "Left": 5669, - "Right": 5669, - "Top": 5669 + "Footer": 10 }, "tolerance": 1, "points": 4, diff --git a/DIW_2504B_new.json b/DIW_2504B_new.json index 7e2ec5e..f95e5af 100644 --- a/DIW_2504B_new.json +++ b/DIW_2504B_new.json @@ -10,13 +10,13 @@ "1": { "path": "//PAGEMARGIN", "value": { - "Bottom": 5669, - "Footer": 2834, - "Gutter": 0, - "Header": 2834, - "Left": 5669, - "Right": 5669, - "Top": 5669 + "Top": 20, + "Bottom": 20, + "Left": 20, + "Right": 20, + "Header": 10, + "Footer": 10, + "Gutter": 0 }, "tolerance": 1, "points": 4, @@ -58,7 +58,7 @@ "value": "199,82,82", "points": 2, "category": "Color", - "item": "문구 (친환경에너지박람회)/② 채우기 : 색상(RGB:100,170,92)" + "item": "문구 (친환경에너지박람회)/② 채우기 : 색상(RGB:199,82,82)" }, "3": { "path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width", @@ -438,21 +438,21 @@ "value": true, "points": 2, "category": "Boolean", - "item": "① 파일명 \"그림A.jpg\" 삽입" + "item": "① 파일명 \"그림B.jpg\" 삽입" }, "15": { "path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/SIZE/@Width", "value": "85", "points": 2, "category": "mmSize", - "item": "② 크기-너비 (85mm)" + "item": "② 크기-너비 (85 mm)" }, "16": { "path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/SIZE/@Height", "value": "40", "points": 2, "category": "mmSize", - "item": "③ 크기-높이 (40mm)" + "item": "③ 크기-높이 (40 mm)" }, "17": { "path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/POSITION/@HorzOffset", @@ -702,7 +702,7 @@ "points": 2, "category": "ChartType", "item": "① 종류 (꺾은선형)", - "desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (띄어쓰기 처리됨)" + "desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)" }, "46": { "chart_xpath": "//c:valAx/c:majorTickMark/@val", @@ -717,14 +717,14 @@ "value": "80", "points": 2, "category": "mmSize", - "item": "③ 크기-너비 (80mm)" + "item": "③ 크기-너비 (80 mm)" }, "48": { "path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Height", "value": "80", "points": 2, "category": "mmSize", - "item": "④ 크기-높이 (80mm)" + "item": "④ 크기-높이 (80 mm)" }, "49": { "chart_xpath": "boolean(//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계' or text()='평균']))", diff --git a/DIW_2504C_new.json b/DIW_2504C_new.json new file mode 100644 index 0000000..5f7940a --- /dev/null +++ b/DIW_2504C_new.json @@ -0,0 +1,834 @@ +{ + "0": { + "0": { + "path": "", + "path2": "", + "points": 0, + "category": "파일저장", + "item": "파일명 (수검번호.hwp/hwpx)" + }, + "1": { + "path": "//PAGEMARGIN", + "value": { + "Top": 20, + "Bottom": 20, + "Left": 20, + "Right": 20, + "Header": 10, + "Footer": 10, + "Gutter": 0 + }, + "tolerance": 1, + "points": 4, + "category": "PageSetting", + "item": "A4용지, 왼쪽/오른쪽/위쪽/아래쪽 (각20mm), 머리말/꼬리말 (10mm), 제본(0mm)" + }, + "2": { + "path": "", + "value": { + "FontName": "바탕", + "FontSize": "1000", + "Alignment": "Justify", + "LineSpacing": "160" + }, + "points": 4, + "category": "BasicSetting", + "item": "글꼴 (바탕, 10pt), 양쪽정렬, 줄간격 (160%)" + }, + "3": { + "path": "", + "value": null, + "points": 40, + "category": "오타감점", + "item": "오타 1개 -1점 / 2503회부터 오타 1개 -1점으로 변경" + } + }, + "1": { + "1": { + "path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName", + "searchValue": "서울국제도서박람회", + "value": "돋움", + "points": 1, + "category": "OneAnswer", + "item": "문구 (서울국제도서박람회)/① 글씨체 (돋움)" + }, + "2": { + "path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor", + "searchValue": "서울국제도서박람회", + "value": "28,61,98", + "points": 2, + "category": "Color", + "item": "문구 (서울국제도서박람회)/② 채우기 : 색상(RGB:100,170,92)" + }, + "3": { + "path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width", + "searchValue": "서울국제도서박람회", + "value": "100", + "tolerance": 1, + "points": 2, + "category": "mmSize", + "item": "문구 (서울국제도서박람회)/③ 크기-너비 (100mm)" + }, + "4": { + "path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height", + "searchValue": "서울국제도서박람회", + "value": "20", + "tolerance": 1, + "points": 2, + "category": "mmSize", + "item": "문구 (서울국제도서박람회)/④ 크기-높이 (20mm)" + }, + "5": { + "path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar", + "searchValue": "서울국제도서박람회", + "value": "true", + "points": 2, + "category": "OneAnswer", + "item": "문구 (서울국제도서박람회)/⑤ 위치 (글자처럼 취급)" + }, + "6": { + "path":"//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align", + "searchValue": "서울국제도서박람회", + "value": "Center", + "points": 2, + "category": "OneAnswer", + "item": "문구 (서울국제도서박람회)/⑥ 정렬 (가운데 정렬)" + }, + "7": { + "path": "//TEXTART[@Text='{searchValue}']", + "searchValue": "서울국제도서박람회", + "value": true, + "points": 2, + "category": "Boolean", + "item": "문구 (서울국제도서박람회)/⑦ 글맵시모양 (육안확인)" + }, + "8": { + "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE", + "searchValue": "책", + "value": { + "Height": 2800, + "Width": 2800 + }, + "tolerance": 200, + "points": 1, + "category": "TwoLineSize", + "item": "책/① 모양 (2줄)" + }, + "9": { + "path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape", + "searchValue": "책", + "value": "돋움", + "points": 1, + "category": "FontName", + "item": "책/② 글씨체 (돋움)" + }, + "10": { + "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor", + "searchValue": "책", + "value": "206,166,29", + "points": 2, + "category": "Color", + "item": "책/③ 면색 : 색상(RGB:206,166,29)" + }, + "11": { + "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right", + "searchValue": "책", + "value": "3.0", + "tolerance": 1, + "points": 2, + "category": "mmSize", + "item": "책/④ 본문과의 간격 : 3.0mm" + }, + "12": { + "path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]", + "searchValue": "문학, 인문학, 어린이/청소년 도서, 전자책, 독립 출판", + "value": "BOLD", + "points": 2, + "category": "FontAttribute", + "item": "문구 (문학, 인문학, 어린이/청소년 도서, 전자책, 독립 출판)/① 진하게" + }, + "13": { + "path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]", + "searchValue": "문학, 인문학, 어린이/청소년 도서, 전자책, 독립 출판", + "value": "ITALIC", + "points": 2, + "category": "FontAttribute", + "item": "문구 (문학, 인문학, 어린이/청소년 도서, 전자책, 독립 출판)/② 기울임" + }, + "14": { + "path": "//CHAR[contains(text(),'{char1}')]", + "path2": "//CHAR[contains(text(),'{char2}')]", + "path3": "//CHAR[contains(text(),'{char3}')]", + "char1": "◆", + "char2": "◆", + "char3": "※", + "value": 3, + "points": 3, + "category": "SpecialChar", + "item": "① ◆, ② ◆, ③ ※" + }, + "15": { + "path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape", + "searchValue": "행사안내", + "value": "궁서", + "points": 1, + "category": "FontName", + "item": "문구 (◆ 행사안내 ◆)/① 글씨체 (궁서)" + }, + "16": { + "path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align", + "searchValue": "행사안내", + "value": "Center", + "points": 1, + "category": "OneAnswer", + "item": "문구 (◆ 행사안내 ◆)/② 정렬 (가운데 정렬)" + }, + "17": { + "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]", + "hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]", + "searchValue": "서울 국제 도서 박람회 홈페이지(http://www.ihd.or.kr) 참조", + "value": "ITALIC", + "points": 1, + "category": "FontAttribute", + "item": "문구 (서울 국제 도서 박람회 홈페이지(http://www.ihd.or.kr) 참조)/① 기울임" + }, + "18": { + "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]", + "hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]", + "searchValue": "서울 국제 도서 박람회 홈페이지(http://www.ihd.or.kr) 참조", + "value": "UNDERLINE", + "points": 1, + "category": "FontAttribute", + "item": "문구 (서울 국제 도서 박람회 홈페이지(http://www.ihd.or.kr) 참조)/② 밑줄" + }, + "19": { + "path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN", + "searchValue": "기타사항", + "value": { + "Left": 15, + "Indent": 12 + }, + "points": 2, + "category": "ParaShape", + "item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (10pt), 내어쓰기 (12pt)", + "desc": "내부적으로 내어쓰기는 음수값 / JSON value값은 양수로 입력" + }, + "20": { + "path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height", + "searchValue": "2025. 04. 26.", + "value": "1300", + "points": 1, + "category": "OneAnswer", + "item": "문구 (2025. 04. 26.)/① 크기 (14pt)", + "desc": "1pt당 100" + }, + "21": { + "path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align", + "searchValue": "2025. 04. 26.", + "value": "Center", + "points": 1, + "category": "OneAnswer", + "item": "문구 (2025. 04. 26.)/② 정렬 (가운데 정렬)" + }, + "22": { + "path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape", + "searchValue": "서울국제도서박람회", + "value": "견고딕", + "points": 1, + "category": "FontName", + "item": "문구 (서울국제도서박람회)/① 글씨체 (견고딕)" + }, + "23": { + "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height", + "searchValue": "서울국제도서박람회", + "value": "2500", + "points": 1, + "category": "OneAnswer", + "item": "문구 (서울국제도서박람회)/② 크기 (25pt)" + }, + "24": { + "path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align", + "searchValue": "서울국제도서박람회", + "value": "Center", + "points": 1, + "category": "OneAnswer", + "item": "문구 (서울국제도서박람회)/③ 정렬 (가운데 정렬)" + }, + "25": { + "path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape", + "searchValue": "DIAT", + "value": "중고딕", + "points": 1, + "category": "FontName", + "item": "문구 (DIAT)/① 글꼴 (중고딕)" + }, + "26": { + "path": "//CHARSHAPE[@Id=//SECTION[1]//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height", + "searchValue": "DIAT", + "value": "900", + "points": 1, + "category": "OneAnswer", + "item": "문구 (DIAT)/② 크기 (9pt)" + }, + "27": { + "path": "//PARASHAPE[@Id=//SECTION[1]//CHAR[text()='{searchValue}']/parent::TEXT/parent::P/@ParaShape]/@Align", + "searchValue": "DIAT", + "value": "Right", + "points": 1, + "category": "OneAnswer", + "item": "문구 (DIAT)/③ 정렬 (오른쪽 정렬)" + }, + "28": { + "path": "//PAGENUM/@FormatType", + "value": "RomanSmall", + "points": 2, + "category": "PageNumber", + "item": "① 쪽 번호 매기기 (A,B,C 순으로)", + "desc1": { + "가,나,다":"HangulSyllable", + "1,2,3":"Digit", + "갑,을,병":"DecagonCircle", + "A,B,C":"LatinCapital", + "①,②,③":"CircledDigit", + "一,二,三":"Ideograph", + "㉠,㉡,㉢":"CircledHangulJamo", + "ⓐ,ⓑ,ⓒ":"CircledLatinSmall", + "i,ii,iii":"RomanSmall", + "정답에 맞는 값 value에 입력":"" + }, + "desc2": "1, 2페이지 모두 정답이어야 점수 부여" + }, + "29": { + "path": "//PAGENUM/@Pos", + "value": "BottomRight", + "points": 2, + "category": "PageNumber", + "item": "가운데 아래", + "desc": "1, 2페이지 모두 정답이어야 점수 부여", + "desc2": { + "가운데 아래": "BottomCenter", + "오른쪽 아래": "BottomRight" + } + }, + "30": { + "path": "not(//PARASHAPE[@Id=//SECTION[1]/P/@ParaShape]/PARAMARGIN[@LineSpacing!='{option}'])", + "option": "180", + "value": true, + "points": 2, + "category": "Boolean", + "item": "문제 1 줄간격 180% 설정", + "desc": "1페이지 문단의 줄간격이 정답이 아닌 문단이 있으면 False(감점)" + } + }, + "2": { + "1": { + "path": "//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@HeaderInside", + "path2": "//BORDERFILL[@Id=//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@BorferFill]", + "value": { + "header_inside": true, + "all_double_slim": true + }, + "points": 4, + "category": "PageBorder", + "item": "문제2 쪽테두리(이중 실선, 머리말 포함) 설정" + }, + "2": { + "path": "count(//SECTION)>1", + "value": true, + "points": 3, + "category": "Boolean", + "item": "① 구역나누기", + "desc": "섹션이 1개 이상이면 점수부여" + }, + "3": { + "path": "//COLDEF/@Count", + "value": "2", + "points": 3, + "category": "OneAnswer", + "item": "② 다단 2단" + }, + "4": { + "path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Width", + "searchValue": "출판 산업 트렌드", + "value": "70", + "points": 2, + "category": "mmSize", + "item": "문구 (출판 산업 트렌드)/① 크기-너비 (70mm)" + }, + "5": { + "path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Height", + "searchValue": "출판 산업 트렌드", + "value": "12", + "points": 2, + "category": "mmSize", + "item": "문구 (출판 산업 트렌드)/② 크기-높이 (12mm)" + }, + "6": { + "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//LINESHAPE/@Style", + "path2": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//LINESHAPE/@Width", + "searchValue": "출판 산업 트렌드", + "value": [ "DoubleSlim", "283" ], + "points": 2, + "category": "DoubleAnswer", + "item": "문구 (출판 산업 트렌드)/③ 테두리 : 이중 실선(1.00mm)", + "desc": "1mm = 283pt" + }, + "7": { + "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/@Ratio", + "searchValue": "출판 산업 트렌드", + "value": "50", + "points": 2, + "category": "OneAnswer", + "item": "문구 (출판 산업 트렌드)/④ 글상자 모서리 (반원)", + "desc": "모서리 비율 50이면 반원 / 20이면 둥근모양" + }, + "8": { + "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor", + "searchValue": "출판 산업 트렌드", + "value": "106,82,82", + "points": 2, + "category": "Color", + "item": "문구 (출판 산업 트렌드)/⑤ 채우기 : 색상(RGB:106,82,82)" + }, + "9": { + "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/POSITION/@TreatAsChar", + "searchValue": "출판 산업 트렌드", + "value": "true", + "points": 1, + "category": "OneAnswer", + "item": "문구 (출판 산업 트렌드)/⑥ 글상자 위치 (글자처럼 취급)" + }, + "10": { + "path": "//PARASHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::P[last()]/@ParaShape]/@Align", + "searchValue": "출판 산업 트렌드", + "value": "Center", + "points": 1, + "category": "OneAnswer", + "item": "문구 (출판 산업 트렌드)/⑦ 글상자 정렬 (가운데 정렬)" + }, + "11": { + "path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape", + "searchValue": "출판 산업 트렌드", + "value": "휴먼옛체", + "points": 1, + "category": "FontName", + "item": "문구 (출판 산업 트렌드)/⑧ 글씨체 (휴먼옛체)", + "desc": "폰트 '견고딕'과 '중고딕'은 한글프로그램 내부적으로 '한양견고딕', '한양중고딕'처리 되어서 프로그램 내부에서 수험자 답변에서 '한양'을 제거하는 과정을 거침" + }, + "12": { + "path": "//CHARSHAPE[@Id=//RECTANGLE//TEXT[./CHAR[text()='{searchValue}']]/@CharShape]/@Height", + "searchValue": "출판 산업 트렌드", + "value": "2000", + "points": 1, + "category": "OneAnswer", + "item": "문구 (출판 산업 트렌드)/⑨ 글씨크기 (20pt)", + "desc":"1pt당 100" + }, + "13": { + "path": "//PARASHAPE[@Id=//RECTANGLE//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align", + "searchValue": "출판 산업 트렌드", + "value": "Center", + "points": 1, + "category": "OneAnswer", + "item": "문구 (출판 산업 트렌드)/⑩ 정렬 (가운데 정렬)" + }, + "14": { + "path": "boolean(//PICTURE//SHAPECOMMENT[contains(text(),'{searchValue}')])", + "searchValue": "원본 그림의 이름: 그림", + "value": true, + "points": 2, + "category": "Boolean", + "item": "① 파일명 \"그림C.jpg\" 삽입" + }, + "15": { + "path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/SIZE/@Width", + "value": "80", + "points": 2, + "category": "mmSize", + "item": "② 크기-너비 (80 mm)" + }, + "16": { + "path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/SIZE/@Height", + "value": "40", + "points": 2, + "category": "mmSize", + "item": "③ 크기-높이 (40 mm)" + }, + "17": { + "path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/POSITION/@HorzOffset", + "value": "0", + "points": 2, + "category": "mmSize", + "item": "④ 위치 (어울림 : 가로-쪽의 왼쪽 0.0mm)" + }, + "18": { + "path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/POSITION/@VertOffset", + "value": "24", + "points": 2, + "category": "mmSize", + "item": "⑤ 위치 (어울림 : 세로-쪽의 위 24mm)" + }, + "19": { + "path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape", + "searchValue": "1. 출판 산업의 확장", + "value": "굴림", + "points": 1, + "category": "FontName", + "item": "문구① (1. 출판 산업의 확장)/① 글씨체 (굴림)" + }, + "20": { + "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height", + "searchValue": "1. 출판 산업의 확장", + "value": "1200", + "points": 1, + "category": "OneAnswer", + "item": "문구① (1. 출판 산업의 확장)/② 크기 (12pt)" + }, + "21": { + "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]", + "searchValue": "1. 출판 산업의 확장", + "value": "BOLD", + "points": 1, + "category": "FontAttribute", + "item": "문구① (1. 출판 산업의 확장)/③ 진하게" + }, + "22": { + "path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape", + "searchValue": "2. 도서 박람회의 가치", + "value": "굴림", + "points": 1, + "category": "FontName", + "item": "문구② (2. 도서 박람회의 가치)/① 글씨체 (굴림)" + }, + "23": { + "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height", + "searchValue": "2. 도서 박람회의 가치", + "value": "1200", + "points": 1, + "category": "OneAnswer", + "item": "문구② (2. 도서 박람회의 가치)/② 크기 (12pt)" + }, + "24": { + "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]", + "searchValue": "2. 도서 박람회의 가치", + "value": "BOLD", + "points": 1, + "category": "FontAttribute", + "item": "문구② (2. 도서 박람회의 가치)/③ 진하게" + }, + "25": { + "path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)", + "path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)", + "option": "오디오북", + "value": true, + "points": 2, + "category": "Boolean", + "item": "문구 (오디오북)/① 각주 설정 및 문구 입력" + }, + "26": { + "path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape", + "searchValue": "눈으로 읽는 대신 귀로 들을 수 있게 책의 내용(문자)을 음성으로 녹음하여 기록한 것을 의미함", + "value": "궁서", + "points": 1, + "category": "FontName", + "item": "문구 (오디오북)/② 글씨체 (궁서)" + }, + "27": { + "path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height", + "searchValue": "눈으로 읽는 대신 귀로 들을 수 있게 책의 내용(문자)을 음성으로 녹음하여 기록한 것을 의미함", + "value": "900", + "points": 1, + "category": "OneAnswer", + "item": "문구 (오디오북)/③ 크기 (9pt)" + }, + "28": { + "path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type", + "searchValue": "눈으로 읽는 대신 귀로 들을 수 있게 책의 내용(문자)을 음성으로 녹음하여 기록한 것을 의미함", + "value": "CircledLatinSmall", + "points": 2, + "category": "OneAnswer", + "item": "문구 (오디오북)/④ 각주 번호모양", + "desc": { + "가,나,다":"HangulSyllable", + "1,2,3":"Digit", + "갑,을,병":"DecagonCircle", + "A,B,C":"LatinCapital", + "①,②,③":"CircledDigit", + "一,二,三":"Ideograph", + "㉠,㉡,㉢":"CircledHangulJamo", + "ⓐ,ⓑ,ⓒ":"CircledLatinSmall", + "i,ii,iii":"RomanSmall", + "정답에 맞는 값 value에 입력":"" + } + }, + "29": { + "path": "boolean(//CHAR[contains(text(),'Platform')])", + "ignoreWord": "Platform", + "value": true, + "points": 3, + "category": "Boolean", + "item": "Platform/영단어 미입력, 대소문자/오타 시 전체 감점", + "desc": "유사도 검사를 진행하지 않고 영단어가 모두 일치해야 하므로 xpath구문 내 단어도 수정필요" + }, + "30": { + "path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]", + "word":[ + ["출판", "出版"], + ["독자", "讀者"], + ["박람회", "博覽會"], + ["교류", "交流"], + ["증가", "增加"] + ], + "value": 10, + "points": 10, + "category": "Hanja", + "item": "① 출판(出版), ② 독자(讀者), ③ 박람회(博覽會), ④ 교류(交流), ⑤ 증가(增加)" + }, + "31": { + "path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'래도점점')])", + "value": true, + "points": 3, + "category": "Boolean", + "item": "문구 (…콘텐츠 거래는 점점…)/\"는\" → \"도\" 글자바꿈" + }, + "32": { + "path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'양한산업')])", + "value": true, + "points": 3, + "category": "Boolean", + "item": "문구 (…요식업 등의 산업과 다양한 연계되며…)/\"산업과\" / \"다양한\" 순서바꿈" + }, + "33": { + "path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape", + "searchValue": "출판 산업 성장률(단위: %)", + "value": "돋움", + "points": 1, + "category": "FontName", + "item": "제목 문구 (출판 산업 성장률(단위: %))/① 글씨체 (돋움)" + }, + "34": { + "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height", + "searchValue": "출판 산업 성장률(단위: %)", + "value": "1200", + "points": 1, + "category": "OneAnswer", + "item": "제목 문구 (출판 산업 성장률(단위: %))/② 크기 (12pt)" + }, + "35": { + "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]", + "searchValue": "출판 산업 성장률(단위: %)", + "value": "BOLD", + "points": 1, + "category": "FontAttribute", + "item": "제목 문구 (출판 산업 성장률(단위: %))/③ 진하게" + }, + "36": { + "path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align", + "searchValue": "출판 산업 성장률(단위: %)", + "value": "Center", + "points": 1, + "category": "OneAnswer", + "item": "제목 문구 (출판 산업 성장률(단위: %))/④ 정렬 (가운데 정렬)" + }, + "37": { + "path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor", + "path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor", + "value": "233,174,212", + "points": 2, + "category": "Color", + "item": "위쪽 제목 셀/① 색상(RGB:233,174,212)" + }, + "38": { + "path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]", + "value": "BOLD", + "points": 1, + "category": "FontAttribute", + "item": "위쪽 제목 셀/② 진하게", + "desc": "글자 속성이라 CELLZONE으로 적용 되지 않음" + }, + "39": { + "path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Type", + "path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Type", + "value": "DoubleSlim", + "points": 2, + "category": "OneAnswer", + "item": "제목 셀 아래선/① 이중실선" + }, + "40": { + "path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Width", + "path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Width", + "value": "0.5mm", + "points": 2, + "category": "OneAnswer", + "item": "제목 셀 아래선/② 0.5mm" + }, + "41": { + "path": "//TABLE//TEXT/@CharShape", + "path2": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name", + "value": "중고딕", + "points": 1, + "category": "TableFontName", + "category_tmp": "FontName", + "item": "글자모양/① 글씨체 (중고딕)", + "desc": "테이블 폰트명 문항은 테이블의 모든 셀이 정답폰트와 일치해야 함, 하나만 일치해도 정답으로 채점할 경우 category값을 FontName으로 변경" + }, + "42": { + "path": "//CHARSHAPE[@Id=//TABLE//TEXT/@CharShape]/@Height", + "value": "1000", + "points": 1, + "category": "TableOneAnswer", + "item": "글자모양/② 크기 (10pt)" + }, + "43": { + "path": "//PARASHAPE[@Id=//TABLE/ROW//P/@ParaShape]/@Align", + "value": "Center", + "points": 1, + "category": "TableOneAnswer", + "item": "글자모양/③ 정렬 (가운데 정렬)" + }, + "44": { + "path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) and boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])", + "option": "AVG", + "value": true, + "points": 4, + "category": "Boolean", + "item": "블록 계산식/합계", + "desc": "option값에 합계는 SUM / 평균은 AVG" + }, + "45": { + "chart_xpath": "", + "chart_type": "묶은가로막대형", + "value": true, + "points": 2, + "category": "ChartType", + "item": "① 종류 (묶은가로막대형)", + "desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)" + }, + "46": { + "chart_xpath": "//c:valAx/c:majorTickMark/@val", + "value": "out", + "points": 2, + "category": "OneAnswer", + "item": "② 값 축 주 눈금선", + "desc": "chart xml파일에서 답안을 가져오는 문항은 path키값 대신 chart_xpath키값을 이용해 xapth구문을 작성한다" + }, + "47": { + "path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Width", + "value": "80", + "points": 2, + "category": "mmSize", + "item": "③ 크기-너비 (80 mm)" + }, + "48": { + "path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Height", + "value": "80", + "points": 2, + "category": "mmSize", + "item": "④ 크기-높이 (80 mm)" + }, + "49": { + "chart_xpath": "boolean(//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계' or text()='평균']))", + "value": true, + "points": 2, + "category": "Boolean", + "item": "⑤ 차트 데이터(표에서 블록계산식을 제외한 나머지 값만 이용)", + "desc": "차트가 존재하고 블록계산식(합계, 평균) 데이터가 없는 경우 정답 처리" + }, + "50": { + "chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface", + "searchValue": "출판 산업 성장률", + "value": "바탕", + "points": 1, + "category": "OneAnswer", + "item": "제목 문구 (출판 산업 성장률)/① 글씨체 (바탕)" + }, + "51": { + "chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz", + "searchValue": "출판 산업 성장률", + "value": "1200", + "points": 1, + "category": "OneAnswer", + "item": "제목 문구 (출판 산업 성장률)/② 크기 (12pt)" + }, + "52": { + "chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}", + "option": "b", + "searchValue": "출판 산업 성장률", + "value": "1", + "points": 1, + "category": "OneAnswer", + "item": "제목 문구 (출판 산업 성장률)/③ 진하게", + "desc": "option값 - 기울임(Italic):i / 굵게(Bold):b" + }, + "53": { + "chart_xpath": "//c:catAx//a:ea/@typeface", + "value": "돋움", + "points": 1, + "category": "OneAnswer", + "item": "X축/① 글꼴 (돋움)" + }, + "54": { + "chart_xpath": "//c:catAx//a:defRPr/@sz", + "value": "900", + "points": 1, + "category": "OneAnswer", + "item": "X축/② 크기 (9pt)" + }, + "55": { + "chart_xpath": "//c:catAx//a:defRPr/@{option}", + "option": "i", + "value": "1", + "points": 1, + "category": "OneAnswer", + "item": "X축/③ 기울임", + "desc": "option값 - 기울임(Italic):i / 굵게(Bold):b" + }, + "56": { + "chart_xpath": "//c:valAx//a:ea/@typeface", + "value": "돋움", + "points": 1, + "category": "OneAnswer", + "item": "Y축/① 글꼴 (돋움)" + }, + "57": { + "chart_xpath": "//c:valAx//a:defRPr/@sz", + "value": "900", + "points": 1, + "category": "OneAnswer", + "item": "Y축/② 크기 (9pt)" + }, + "58": { + "chart_xpath": "//c:valAx//a:defRPr/@{option}", + "option": "i", + "value": "1", + "points": 1, + "category": "OneAnswer", + "item": "Y축/③ 기울임", + "desc": "option값 - 기울임(Italic):i / 굵게(Bold):b" + + }, + "59": { + "chart_xpath": "//c:legend//a:ea/@typeface", + "value": "돋움", + "points": 1, + "category": "OneAnswer", + "item": "범례/① 글꼴 (돋움)" + }, + "60": { + "chart_xpath": "//c:legend//a:defRPr/@sz", + "value": "900", + "points": 1, + "category": "OneAnswer", + "item": "범례/② 크기 (9pt)" + }, + "61": { + "chart_xpath": "//c:legend//a:defRPr/@{option}", + "option": "i", + "value": "1", + "points": 1, + "category": "OneAnswer", + "item": "범례/③ 기울임", + "desc": "option값 - 기울임(Italic):i / 굵게(Bold):b" + } + } +} \ No newline at end of file diff --git a/diwScoring2.py b/diwScoring2.py index 9773e54..ebf3d5a 100644 --- a/diwScoring2.py +++ b/diwScoring2.py @@ -164,12 +164,6 @@ class XMLScorer: # search_value가 있는 경우 if search_value is not None: - # # search_value를 포함하는 텍스트 찾기 - # similar_text = self.find_similar_text(root, chart_tree, search_value) - # xpath = xpath.replace('{searchValue}', similar_text) if xpath else "" - # xpath2 = xpath2.replace('{searchValue}', similar_text) if xpath2 else "" - # chart_xpath = chart_xpath.replace('{searchValue}', similar_text) if chart_xpath else "" - if xpath or xpath2: similar_text = self.find_similar_text(root, search_value, xml_type="hml") xpath = xpath.replace('{searchValue}', similar_text) if xpath else "" @@ -192,22 +186,35 @@ class XMLScorer: 'right_answer': right_answer, # 정답 'user_answer': None, # 실제 작성 답안 'points': 0, # 점수 - 'deductions': [] # 각 기준별 감점 내역 } if (category or "") == "PageSetting": items = root.xpath(xpath) error_range = criterion.get('tolerance', 0) + + right_answer = { + 'Top' : float(right_answer.get("Top", 0)), + 'Bottom' : float(right_answer.get("Bottom", 0)), + 'Left' : float(right_answer.get("Left", 0)), + 'Right' : float(right_answer.get("Right", 0)), + 'Header' : float(right_answer.get("Header", 0)), + 'Footer' : float(right_answer.get("Footer", 0)), + 'Gutter' : float(right_answer.get("Gutter", 0)), + } + right_answer = { + k: self.convert_mm_to_pt(v) + for k, v in right_answer.items() + } for item in items: user_answer = { - 'Bottom' : int(item.get("Bottom", 0)), - 'Footer' : int(item.get("Footer", 0)), - 'Gutter' : int(item.get("Gutter", 0)), - 'Header' : int(item.get("Header", 0)), - 'Left' : int(item.get("Left", 0)), - 'Right' : int(item.get("Right", 0)), - 'Top' : int(item.get("Top", 0)), + 'Top' : float(item.get("Top", 0)), + 'Bottom' : float(item.get("Bottom", 0)), + 'Left' : float(item.get("Left", 0)), + 'Right' : float(item.get("Right", 0)), + 'Header' : float(item.get("Header", 0)), + 'Footer' : float(item.get("Footer", 0)), + 'Gutter' : float(item.get("Gutter", 0)), } self.evaluate_answer(scoring, user_answer, right_answer, points, method="tolerance", tolerance=error_range) @@ -274,19 +281,32 @@ class XMLScorer: self.partial_score += points scoring['points'] = points - # 정답이 하나인 경우 - elif (category or "") == "OneAnswer": + # 정답이 하나 또는 테이블의 모든 값이 정답인 경우 + elif (category or "") in ["OneAnswer", "TableOneAnswer"]: items = root.xpath(xpath) if xpath else [] items2 = root.xpath(xpath2) if xpath2 else [] chart_items = chart_tree.xpath(chart_xpath, namespaces=namespaces) if chart_xpath else [] - + + require_all_match = (category == "TableOneAnswer") + any_match = False + all_match = True + for item in chain(items, items2, chart_items): user_answer = item - self.evaluate_answer(scoring, user_answer, right_answer, points) - - if scoring['points'] > 0: - break + if user_answer == right_answer: + any_match = True + else: + all_match = False + if require_all_match: + break # 하나라도 다르면 바로 탈출 + + if require_all_match: + score = points if all_match else 0 + else: + score = points if any_match else 0 + + self.evaluate_answer(scoring, user_answer, right_answer, score) elif (category or "") == "DoubleAnswer": items1 = root.xpath(xpath) if xpath else [] @@ -312,14 +332,14 @@ class XMLScorer: # 이 경우를 대비하여 tolerance를 10으로 설정 (1pt=약0.04mm 만큼의 오차 혀용) error_range = criterion.get('tolerance', 10) + # JSON 파일 value키값에 mm나 공백이 입력될 경우 제거 + # 예) "80.2 mm" >> 80.2 로 변환 + float_string = right_answer.strip().replace("mm", "") + right_answer = self.convert_mm_to_pt(float(float_string)) + for item in items: user_answer = float(item) - - # JSON 파일 value키값에 mm나 공백이 입력될 경우 제거 - # 예) "80.2 mm" >> 80.2 로 변환 - float_string = right_answer.strip().replace("mm", "") - right_answer = self.convert_mm_to_pt(float(float_string)) - + self.evaluate_answer(scoring, user_answer, right_answer, points, method="tolerance", tolerance=error_range) if scoring['points'] > 0: @@ -356,7 +376,14 @@ class XMLScorer: items2 = root.xpath(xpath2) if xpath2 else [] rgb_text = right_answer - r, g, b = map(int, rgb_text.split(',')) + + # 정규식을 이용해 숫자만 리스트로 추출 + numbers = re.findall(r'\d+', rgb_text) + r, g, b = map(int, numbers) if len(numbers) == 3 else None + + # 콤마(,)로 구분된 문자열을 정수형으로 변환 + # r, g, b = map(int, rgb_text.split(',')) + rgb_int = (b << 16) + (g << 8) + r # items, items2를 순차적으로 순회 @@ -381,58 +408,48 @@ class XMLScorer: break # 폰트명 - elif (category or "") == "FontName": + elif (category or "") in ["FontName", "TableFontName"]: charshape_list = root.xpath(xpath) - if not charshape_list: - user_answer = "" - else: - for charshape_id in charshape_list: - font_id = root.xpath(f"//CHARSHAPE[@Id='{charshape_id}']/FONTID/@Hangul") - font_name = root.xpath(f"//FONTFACE[@Lang='Hangul']/FONT[@Id='{font_id[0]}']/@Name") - user_answer = font_name[0] - - # 폰트 "견고딕"과 "중고딕"은 - # 한글프로그램 내부적으로 "한양견고딕", "한양중고딕"으로 저장되므로 - # 수험자 답변에서 "한양"을 제거 - if right_answer in ["견고딕", "중고딕"]: - user_answer = user_answer.replace("한양", "") - - self.evaluate_answer(scoring, user_answer, right_answer, points, method="equal") - - if scoring['points'] > 0: - break - - # 테이블 폰트명 - # 테이블 내부 모든 셀의 폰트가 정답과 일치해야 함 - elif (category or "") == "TableFontName": - charshape_list = root.xpath(xpath) - + # 문자속성이 없는 경우 if not charshape_list: user_answer = "" self.evaluate_answer(scoring, user_answer, right_answer, points, method="equal") else: - all_match = True # 모든 항목이 정답과 일치해야 함 - + require_all_match = (category == "TableFontName") + any_match = False + all_match = True + for charshape_id in charshape_list: font_id = root.xpath(f"//CHARSHAPE[@Id='{charshape_id}']/FONTID/@Hangul") + if not font_id: + all_match = False + continue + font_name = root.xpath(f"//FONTFACE[@Lang='Hangul']/FONT[@Id='{font_id[0]}']/@Name") + if not font_name: + all_match = False + continue user_answer = font_name[0] - # 내부 저장된 접두어 제거 + # 접두어 제거 if right_answer in ["견고딕", "중고딕"]: user_answer = user_answer.replace("한양", "") - # 하나라도 다르면 바로 오답 처리 - if user_answer != right_answer: + if user_answer == right_answer: + any_match = True + else: all_match = False - break + if require_all_match: + break - if all_match: - self.evaluate_answer(scoring, user_answer, right_answer, points, method="equal") + if require_all_match: + score = points if all_match else 0 else: - self.evaluate_answer(scoring, user_answer, right_answer, 0, method="equal") # 오답 처리 + score = points if any_match else 0 + + self.evaluate_answer(scoring, user_answer, right_answer, score, method="equal") # 폰트 속성 elif (category or "") == "FontAttribute": @@ -960,8 +977,8 @@ def main(): exam_round = '2504' exam_types = [ # 'A', - 'B', - # 'C', + # 'B', + 'C', ] test_mode = False # test_mode = True diff --git a/zzz.xbook b/zzz.xbook index 4aab208..bce9d7b 100644 --- a/zzz.xbook +++ b/zzz.xbook @@ -1 +1 @@ -[{"kind":2,"language":"xpath","value":"//a:t[text()='클라우드 보안투자']/ancestor::a:r//a:ea/@typeface"},{"kind":2,"language":"xpath","value":"boolean(//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE/FONTID/@Hangul]/@Name='바탕' and //CHARSHAPE/@Height='1000' and //PARASHAPE/PARAMARGIN/@LineSpacing='160' and //PARASHAPE/@Align='Justify')"},{"kind":2,"language":"xpath","value":"//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE/FONTID/@Hangul]/@Name='바탕'"},{"kind":2,"language":"xpath","value":"//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE/FONTID/@Hangul]/@Name='바탕' and //CHARSHAPE/@Height='1000' and //PARASHAPE/PARAMARGIN/@LineSpacing='160' and //PARASHAPE/@Align='Justify')"},{"kind":2,"language":"xpath","value":"//FONTFACE[@Lang='Hangul']/FONT/@Name"},{"kind":2,"language":"xpath","value":"//CHARSHAPE/@Height"},{"kind":2,"language":"xpath","value":"//PARASHAPE/PARAMARGIN/@LineSpacing"},{"kind":2,"language":"xpath","value":"//PARASHAPE/@Align"},{"kind":2,"language":"xpath","value":"//P[TEXT]/@ParaShape"}] \ No newline at end of file +[{"kind":2,"language":"xpath","value":"//a:t[text()='클라우드 보안투자']/ancestor::a:r//a:ea/@typeface"},{"kind":2,"language":"xpath","value":"boolean(//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE/FONTID/@Hangul]/@Name='바탕' and //CHARSHAPE/@Height='1000' and //PARASHAPE/PARAMARGIN/@LineSpacing='160' and //PARASHAPE/@Align='Justify')"},{"kind":2,"language":"xpath","value":"//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE/FONTID/@Hangul]/@Name='바탕'"},{"kind":2,"language":"xpath","value":"//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE/FONTID/@Hangul]/@Name='바탕' and //CHARSHAPE/@Height='1000' and //PARASHAPE/PARAMARGIN/@LineSpacing='160' and //PARASHAPE/@Align='Justify')"},{"kind":2,"language":"xpath","value":"//FONTFACE[@Lang='Hangul']/FONT/@Name"},{"kind":2,"language":"xpath","value":"//CHARSHAPE/@Height"},{"kind":2,"language":"xpath","value":"//PARASHAPE/PARAMARGIN/@LineSpacing"},{"kind":2,"language":"xpath","value":"//PARASHAPE/@Align"},{"kind":2,"language":"xpath","value":"//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Width"}] \ No newline at end of file diff --git a/구버전신버전점수비교C형.xlsx b/구버전신버전점수비교C형.xlsx new file mode 100644 index 0000000..6005fe1 Binary files /dev/null and b/구버전신버전점수비교C형.xlsx differ