v2 - 2504회 C형 채점 및 추가 수정

This commit is contained in:
2025-05-21 17:57:41 +09:00
parent 220374145e
commit c8554adbb7
10 changed files with 936 additions and 85 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -10,13 +10,13 @@
"1": { "1": {
"path": "//PAGEMARGIN", "path": "//PAGEMARGIN",
"value": { "value": {
"Bottom": 5669, "Top": 20,
"Footer": 2834, "Bottom": 20,
"Left": 20,
"Right": 20,
"Header": 10,
"Gutter": 0, "Gutter": 0,
"Header": 2834, "Footer": 10
"Left": 5669,
"Right": 5669,
"Top": 5669
}, },
"tolerance": 1, "tolerance": 1,
"points": 4, "points": 4,

View File

@@ -10,13 +10,13 @@
"1": { "1": {
"path": "//PAGEMARGIN", "path": "//PAGEMARGIN",
"value": { "value": {
"Bottom": 5669, "Top": 20,
"Footer": 2834, "Bottom": 20,
"Gutter": 0, "Left": 20,
"Header": 2834, "Right": 20,
"Left": 5669, "Header": 10,
"Right": 5669, "Footer": 10,
"Top": 5669 "Gutter": 0
}, },
"tolerance": 1, "tolerance": 1,
"points": 4, "points": 4,
@@ -58,7 +58,7 @@
"value": "199,82,82", "value": "199,82,82",
"points": 2, "points": 2,
"category": "Color", "category": "Color",
"item": "문구 (친환경에너지박람회)/② 채우기 : 색상(RGB:100,170,92)" "item": "문구 (친환경에너지박람회)/② 채우기 : 색상(RGB:199,82,82)"
}, },
"3": { "3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width", "path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
@@ -438,21 +438,21 @@
"value": true, "value": true,
"points": 2, "points": 2,
"category": "Boolean", "category": "Boolean",
"item": "① 파일명 \"그림A.jpg\" 삽입" "item": "① 파일명 \"그림B.jpg\" 삽입"
}, },
"15": { "15": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/SIZE/@Width", "path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/SIZE/@Width",
"value": "85", "value": "85",
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "② 크기-너비 (85mm)" "item": "② 크기-너비 (85 mm)"
}, },
"16": { "16": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/SIZE/@Height", "path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/SIZE/@Height",
"value": "40", "value": "40",
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "③ 크기-높이 (40mm)" "item": "③ 크기-높이 (40 mm)"
}, },
"17": { "17": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/POSITION/@HorzOffset", "path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/POSITION/@HorzOffset",
@@ -702,7 +702,7 @@
"points": 2, "points": 2,
"category": "ChartType", "category": "ChartType",
"item": "① 종류 (꺾은선형)", "item": "① 종류 (꺾은선형)",
"desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (띄어쓰기 처리됨)" "desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)"
}, },
"46": { "46": {
"chart_xpath": "//c:valAx/c:majorTickMark/@val", "chart_xpath": "//c:valAx/c:majorTickMark/@val",
@@ -717,14 +717,14 @@
"value": "80", "value": "80",
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "③ 크기-너비 (80mm)" "item": "③ 크기-너비 (80 mm)"
}, },
"48": { "48": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Height", "path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Height",
"value": "80", "value": "80",
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "④ 크기-높이 (80mm)" "item": "④ 크기-높이 (80 mm)"
}, },
"49": { "49": {
"chart_xpath": "boolean(//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계' or text()='평균']))", "chart_xpath": "boolean(//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계' or text()='평균']))",

834
DIW_2504C_new.json Normal file
View File

@@ -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"
}
}
}

View File

@@ -164,12 +164,6 @@ class XMLScorer:
# search_value가 있는 경우 # search_value가 있는 경우
if search_value is not None: 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: if xpath or xpath2:
similar_text = self.find_similar_text(root, search_value, xml_type="hml") similar_text = self.find_similar_text(root, search_value, xml_type="hml")
xpath = xpath.replace('{searchValue}', similar_text) if xpath else "" xpath = xpath.replace('{searchValue}', similar_text) if xpath else ""
@@ -192,22 +186,35 @@ class XMLScorer:
'right_answer': right_answer, # 정답 'right_answer': right_answer, # 정답
'user_answer': None, # 실제 작성 답안 'user_answer': None, # 실제 작성 답안
'points': 0, # 점수 'points': 0, # 점수
'deductions': [] # 각 기준별 감점 내역
} }
if (category or "") == "PageSetting": if (category or "") == "PageSetting":
items = root.xpath(xpath) items = root.xpath(xpath)
error_range = criterion.get('tolerance', 0) 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: for item in items:
user_answer = { user_answer = {
'Bottom' : int(item.get("Bottom", 0)), 'Top' : float(item.get("Top", 0)),
'Footer' : int(item.get("Footer", 0)), 'Bottom' : float(item.get("Bottom", 0)),
'Gutter' : int(item.get("Gutter", 0)), 'Left' : float(item.get("Left", 0)),
'Header' : int(item.get("Header", 0)), 'Right' : float(item.get("Right", 0)),
'Left' : int(item.get("Left", 0)), 'Header' : float(item.get("Header", 0)),
'Right' : int(item.get("Right", 0)), 'Footer' : float(item.get("Footer", 0)),
'Top' : int(item.get("Top", 0)), 'Gutter' : float(item.get("Gutter", 0)),
} }
self.evaluate_answer(scoring, user_answer, right_answer, points, method="tolerance", tolerance=error_range) self.evaluate_answer(scoring, user_answer, right_answer, points, method="tolerance", tolerance=error_range)
@@ -274,19 +281,32 @@ class XMLScorer:
self.partial_score += points self.partial_score += points
scoring['points'] = points scoring['points'] = points
# 정답이 하나인 경우 # 정답이 하나 또는 테이블의 모든 값이 정답인 경우
elif (category or "") == "OneAnswer": elif (category or "") in ["OneAnswer", "TableOneAnswer"]:
items = root.xpath(xpath) if xpath else [] items = root.xpath(xpath) if xpath else []
items2 = root.xpath(xpath2) if xpath2 else [] items2 = root.xpath(xpath2) if xpath2 else []
chart_items = chart_tree.xpath(chart_xpath, namespaces=namespaces) if chart_xpath 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): for item in chain(items, items2, chart_items):
user_answer = item user_answer = item
self.evaluate_answer(scoring, user_answer, right_answer, points) if user_answer == right_answer:
any_match = True
if scoring['points'] > 0: else:
break 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": elif (category or "") == "DoubleAnswer":
items1 = root.xpath(xpath) if xpath else [] items1 = root.xpath(xpath) if xpath else []
@@ -312,14 +332,14 @@ class XMLScorer:
# 이 경우를 대비하여 tolerance를 10으로 설정 (1pt=약0.04mm 만큼의 오차 혀용) # 이 경우를 대비하여 tolerance를 10으로 설정 (1pt=약0.04mm 만큼의 오차 혀용)
error_range = criterion.get('tolerance', 10) 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: for item in items:
user_answer = float(item) 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) self.evaluate_answer(scoring, user_answer, right_answer, points, method="tolerance", tolerance=error_range)
if scoring['points'] > 0: if scoring['points'] > 0:
@@ -356,7 +376,14 @@ class XMLScorer:
items2 = root.xpath(xpath2) if xpath2 else [] items2 = root.xpath(xpath2) if xpath2 else []
rgb_text = right_answer 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 rgb_int = (b << 16) + (g << 8) + r
# items, items2를 순차적으로 순회 # items, items2를 순차적으로 순회
@@ -381,58 +408,48 @@ class XMLScorer:
break break
# 폰트명 # 폰트명
elif (category or "") == "FontName": elif (category or "") in ["FontName", "TableFontName"]:
charshape_list = root.xpath(xpath) 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: if not charshape_list:
user_answer = "" user_answer = ""
self.evaluate_answer(scoring, user_answer, right_answer, points, method="equal") self.evaluate_answer(scoring, user_answer, right_answer, points, method="equal")
else: else:
all_match = True # 모든 항목이 정답과 일치해야 함 require_all_match = (category == "TableFontName")
any_match = False
all_match = True
for charshape_id in charshape_list: for charshape_id in charshape_list:
font_id = root.xpath(f"//CHARSHAPE[@Id='{charshape_id}']/FONTID/@Hangul") 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") 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] user_answer = font_name[0]
# 내부 저장된 접두어 제거 # 접두어 제거
if right_answer in ["견고딕", "중고딕"]: if right_answer in ["견고딕", "중고딕"]:
user_answer = user_answer.replace("한양", "") user_answer = user_answer.replace("한양", "")
# 하나라도 다르면 바로 오답 처리 if user_answer == right_answer:
if user_answer != right_answer: any_match = True
else:
all_match = False all_match = False
break if require_all_match:
break
if all_match: if require_all_match:
self.evaluate_answer(scoring, user_answer, right_answer, points, method="equal") score = points if all_match else 0
else: 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": elif (category or "") == "FontAttribute":
@@ -960,8 +977,8 @@ def main():
exam_round = '2504' exam_round = '2504'
exam_types = [ exam_types = [
# 'A', # 'A',
'B', # 'B',
# 'C', 'C',
] ]
test_mode = False test_mode = False
# test_mode = True # test_mode = True

View File

@@ -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"}] [{"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"}]

Binary file not shown.