score5.py > diwScoring.py 변경 / JSON파일 구조 변경에 따라 일부 소스코드 변경

This commit is contained in:
2025-04-17 17:24:12 +09:00
parent 148437c97a
commit d6ef894fc6
11 changed files with 6595 additions and 2590 deletions

855
DIW_2503A copy.json Normal file
View File

@@ -0,0 +1,855 @@
{
"0-0": {
"path": "",
"path2": "",
"points": 0,
"category": "파일저장",
"item": "파일명 (수검번호.hwp/hwpx)"
},
"0-1": {
"path": "boolean(//PAGEMARGIN[(@Bottom='5668'or @Bottom='5669') and (@Footer='2834' or @Footer='2835') and @Gutter='0' and (@Header='2834' or @Header='2835') and (@Left='5668' or @Left='5669') and (@Right='5668' or @Right='5669') and (@Top='5668' or @Top='5669')])",
"path2": null,
"searchValue": null,
"value": true,
"points": 4,
"category": "용지설정",
"item": "A4용지, 왼쪽/오른쪽/위쪽/아래쪽 (각20mm), 머리말/꼬리말 (10mm), 제본(0mm)"
},
"0-2": {
"path": "boolean(//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE/FONTID/@Hangul]/@Name='바탕' and //CHARSHAPE/@Height='1000' and //PARASHAPE/PARAMARGIN/@LineSpacing='160' and //PARASHAPE/@Align='Justify')",
"path2": null,
"searchValue": null,
"value": true,
"points": 4,
"category": "기본설정",
"item": "글꼴 (바탕, 10pt), 양쪽정렬, 줄간격 (160%)"
},
"0-3": {
"path": "",
"path2": null,
"searchValue": null,
"value": null,
"points": 40,
"category": "오타감점",
"item": "오타 1개 -1점 / 2503회부터 오타 1개 -1점으로 변경"
},
"1-1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"path2": null,
"searchValue": "친환경이동수단컨퍼런스",
"value": "견고딕",
"points": 1,
"category": "글맵시",
"item": "문구 (친환경이동수단컨퍼런스)/① 글씨체 (견고딕)"
},
"1-2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"path2": null,
"searchValue": "친환경이동수단컨퍼런스",
"value": "9920305",
"points": 2,
"category": "글맵시",
"item": "문구 (친환경이동수단컨퍼런스)/② 채우기 : 색상(RGB:49,95,151)"
},
"1-3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"path2": null,
"searchValue": "친환경이동수단컨퍼런스",
"value": 28346,
"points": 2,
"category": "글맵시",
"item": "문구 (친환경이동수단컨퍼런스)/③ 크기-너비 (100mm)"
},
"1-4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"path2": null,
"searchValue": "친환경이동수단컨퍼런스",
"value": 5669,
"points": 2,
"category": "글맵시",
"item": "문구 (친환경이동수단컨퍼런스)/④ 크기-높이 (20mm)"
},
"1-5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"path2": null,
"searchValue": "친환경이동수단컨퍼런스",
"value": "true",
"points": 2,
"category": "글맵시",
"item": "문구 (친환경이동수단컨퍼런스)/⑤ 위치 (글자처럼 취급)"
},
"1-6": {
"path": "//PARASHAPE[@Id=//TEXTART[@Text='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"path2": null,
"searchValue": "친환경이동수단컨퍼런스",
"value": "Center",
"points": 2,
"category": "글맵시",
"item": "문구 (친환경이동수단컨퍼런스)/⑥ 정렬 (가운데 정렬)"
},
"1-7": {
"path": "boolean(//TEXTART[@Text='{searchValue}'])",
"path2": null,
"searchValue": "친환경이동수단컨퍼런스",
"value": true,
"points": 2,
"category": "글맵시",
"item": "문구 (친환경이동수단컨퍼런스)/⑦ 글맵시모양 (육안확인)"
},
"1-8": {
"path": "boolean(//RECTANGLE[.//CHAR[text()='지']][.//SIZE[(@Height >= 2600 and @Height <= 2800)and(@Width >= 2600 and @Width <= 2800)]])",
"path2": null,
"searchValue": null,
"value": true,
"points": 1,
"category": "문단첫글자장식",
"item": "지/① 모양 (2줄)"
},
"1-9": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TEXT[CHAR[text()='지']]/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": null,
"value": "궁서체",
"points": 1,
"category": "문단첫글자장식",
"item": "지/② 글씨체 (궁서체)"
},
"1-10": {
"path": "//RECTANGLE[.//CHAR[text()='지']]//WINDOWBRUSH/@FaceColor",
"path2": null,
"searchValue": null,
"value": "3644265",
"points": 2,
"category": "문단첫글자장식",
"item": "지/③ 면색 : 색상(RGB:105,155,55)"
},
"1-11": {
"path": "//RECTANGLE[.//CHAR[text()='지']]//OUTSIDEMARGIN/@Right",
"path2": null,
"searchValue": null,
"value": "850",
"points": 2,
"category": "문단첫글자장식",
"item": "지/④ 본문과의 간격 : 3.0mm"
},
"1-12": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[contains(text()[1],'{searchValue}')]/parent::TEXT/@CharShape][ITALIC])",
"path2": null,
"searchValue": "전 세계적으로 차량의 수는 약 13억 대가 있고 국내는 약 2,500만 대",
"value": true,
"points": 2,
"category": "글꼴 속성",
"item": "문구 (전 세계적으로 차량의 수는 약 13억 대가 있고 국내는 약 2,500만 대)/① 기울임"
},
"1-13": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[contains(text()[1],'{searchValue}')]/parent::TEXT/@CharShape][UNDERLINE])",
"path2": null,
"searchValue": "전 세계적으로 차량의 수는 약 13억 대가 있고 국내는 약 2,500만 대",
"value": true,
"points": 2,
"category": "글꼴 속성",
"item": "문구 (전 세계적으로 차량의 수는 약 13억 대가 있고 국내는 약 2,500만 대)/② 밑줄"
},
"1-14": {
"path": "count(//CHAR[contains(text(),'☆')]) + count(//CHAR[contains(text(),'※')])",
"path2": "string-length(//CHAR[contains(text(),'☆')]) - string-length(translate(//CHAR[contains(text(),'☆')], '☆', '')) + string-length(//CHAR[contains(text(),'※')]) - string-length(translate(//CHAR[contains(text(),'※')], '※', ''))",
"searchValue": null,
"value": 3,
"points": 3,
"category": "특수문자",
"item": "① ☆, ② ☆, ③ ※"
},
"1-15": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "☆ 행사안내 ☆",
"value": "궁서",
"points": 1,
"category": "글꼴 속성",
"item": "문구 (☆ 행사안내 ☆)/① 글씨체 (궁서)"
},
"1-16": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"path2": null,
"searchValue": "☆ 행사안내 ☆",
"value": "Center",
"points": 1,
"category": "글꼴 속성",
"item": "문구 (☆ 행사안내 ☆)/② 정렬 (가운데 정렬)"
},
"1-17": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape][BOLD])",
"path2": null,
"searchValue": "2025. 03. 27.(목) 24:00까지",
"value": true,
"points": 1,
"category": "글꼴 속성",
"item": "문구 (2025. 03. 27.(목) 24:00까지)/① 진하게"
},
"1-18": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape][UNDERLINE])",
"path2": null,
"searchValue": "2025. 03. 27.(목) 24:00까지",
"value": true,
"points": 1,
"category": "글꼴 속성",
"item": "문구 (2025. 03. 27.(목) 24:00까지)/② 밑줄"
},
"1-19": {
"path": "boolean(//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN/@Left=3000 and //PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN/@Indent=-2400)",
"path2": null,
"searchValue": "기타사항",
"value": true,
"points": 2,
"category": "문단모양",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (15pt), 내어쓰기 (12pt)"
},
"1-20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "2025. 03. 22.",
"value": 1300,
"points": 1,
"category": "글꼴 속성",
"item": "문구 (2025. 03. 22.)/① 크기 (13pt)"
},
"1-21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"path2": null,
"searchValue": "2025. 03. 22.",
"value": "Center",
"points": 1,
"category": "글꼴 속성",
"item": "문구 (2025. 03. 22.)/② 정렬 (가운데 정렬)"
},
"1-22": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "한국육상운송협회",
"value": "굴림체",
"points": 1,
"category": "글꼴 속성",
"item": "문구 (한국육상운송협회)/① 글씨체 (굴림체)"
},
"1-23": {
"path": "//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "한국육상운송협회",
"value": 2400,
"points": 1,
"category": "글꼴 속성",
"item": "문구 (한국육상운송협회)/② 크기 (24pt)"
},
"1-24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"path2": null,
"searchValue": "한국육상운송협회",
"value": "Center",
"points": 1,
"category": "글꼴 속성",
"item": "문구 (한국육상운송협회)/③ 정렬 (가운데 정렬)"
},
"1-25": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "DIAT",
"value": "돋움",
"points": 1,
"category": "머리말",
"item": "문구 (DIAT)/① 글꼴 (돋움)"
},
"1-26": {
"path": "//CHARSHAPE[@Id=//SECTION[1]//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "DIAT",
"value": 900,
"points": 1,
"category": "머리말",
"item": "문구 (DIAT)/② 크기 (9pt)"
},
"1-27": {
"path": "//PARASHAPE[@Id=//SECTION[1]//CHAR[text()='{searchValue}']/parent::TEXT/parent::P/@ParaShape]/@Align",
"path2": null,
"searchValue": "DIAT",
"value": "Right",
"points": 1,
"category": "머리말",
"item": "문구 (DIAT)/③ 정렬 (오른쪽 정렬)"
},
"1-28": {
"path": "//PAGENUM/@FormatType",
"path2": null,
"searchValue": null,
"value": "LatinCapital",
"points": 2,
"category": "쪽번호",
"item": "① 쪽 번호 매기기 (A,B,C 순으로)"
},
"1-29": {
"path": "//PAGENUM/@Pos",
"path2": null,
"searchValue": null,
"value": "BottomCenter",
"points": 2,
"category": "쪽번호",
"item": "② 가운데 아래"
},
"1-30": {
"path": "not(//PARASHAPE[@Id=//SECTION[1]/P/@ParaShape]/PARAMARGIN[@LineSpacing!='180'])",
"path2": null,
"searchValue": null,
"value": true,
"points": 2,
"category": "줄간격",
"item": "문제 1 줄간격 180% 설정"
},
"2-01": {
"path": "boolean(//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@HeaderInside='true' and //BORDERFILL[@Id=//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@BorferFill]/*[contains(local-name(), 'BORDER')]/@Type='DoubleSlim')",
"path2": null,
"searchValue": null,
"value": true,
"points": 4,
"category": "쪽 테두리",
"item": "문제2 쪽테두리(이중 실선, 머리말 포함) 설정"
},
"2-02": {
"path": "count(//SECTION)>1",
"path2": null,
"searchValue": null,
"value": true,
"points": 3,
"category": "다단",
"item": "① 구역나누기"
},
"2-03": {
"path": "//COLDEF/@Count>1",
"path2": null,
"searchValue": null,
"value": true,
"points": 3,
"category": "다단",
"item": "② 다단 2단"
},
"2-04": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"path2": null,
"searchValue": "친환경 이동수단",
"value": 19842,
"points": 2,
"category": "글상자",
"item": "문구 (친환경 이동수단)/① 크기-너비 (70mm)"
},
"2-05": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"path2": null,
"searchValue": "친환경 이동수단",
"value": 3401,
"points": 2,
"category": "글상자",
"item": "문구 (친환경 이동수단)/② 크기-높이 (12mm)"
},
"2-06": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/descendant::LINESHAPE/@Style",
"path2": null,
"searchValue": "친환경 이동수단",
"value": "DoubleSlim",
"points": 2,
"category": "글상자",
"item": "문구 (친환경 이동수단)/③ 테두리 (이중실선(1.00mm))"
},
"2-07": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/@Ratio",
"path2": null,
"searchValue": "친환경 이동수단",
"value": 50,
"points": 2,
"category": "글상자",
"item": "문구 (친환경 이동수단)/④ 글상자 모서리 (반원)"
},
"2-08": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/descendant::WINDOWBRUSH/@FaceColor",
"path2": null,
"searchValue": "친환경 이동수단",
"value": "9537333",
"points": 2,
"category": "글상자",
"item": "문구 (친환경 이동수단)/⑤ 채우기 : 색상(RGB:53,135,145)"
},
"2-09": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/POSITION/@TreatAsChar",
"path2": null,
"searchValue": "친환경 이동수단",
"value": "true",
"points": 1,
"category": "글상자",
"item": "문구 (친환경 이동수단)/⑥ 글상자 위치 (글자처럼 취급)"
},
"2-10": {
"path": "//PARASHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::P[last()]/@ParaShape]/@Align",
"path2": null,
"searchValue": "친환경 이동수단",
"value": "Center",
"points": 1,
"category": "글상자",
"item": "문구 (친환경 이동수단)/⑦ 글상자 정렬 (가운데 정렬)"
},
"2-11": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "친환경 이동수단",
"value": "맑은 고딕",
"points": 1,
"category": "글상자",
"item": "문구 (친환경 이동수단)/⑧ 글씨체 (맑은 고딕)"
},
"2-12": {
"path": "boolean(//CHARSHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/@Height='2400')",
"path2": null,
"searchValue": "친환경 이동수단",
"value": true,
"points": 1,
"category": "글상자",
"item": "문구 (친환경 이동수단)/⑨ 글씨크기 (24pt)"
},
"2-13": {
"path": "//PARASHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::P[1]/@ParaShape]/@Align",
"path2": null,
"searchValue": "친환경 이동수단",
"value": "Center",
"points": 1,
"category": "글상자",
"item": "문구 (친환경 이동수단)/⑩ 정렬 (가운데 정렬)"
},
"2-14": {
"path": "boolean(//PICTURE/descendant::SHAPECOMMENT[contains(text(),'{searchValue}')])",
"path2": null,
"searchValue": "원본 그림의 이름: 그림",
"value": true,
"points": 2,
"category": "그림삽입",
"item": "① 파일명 \"그림A.jpg\" 삽입"
},
"2-15": {
"path": "//IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]/preceding-sibling::SHAPEOBJECT/SIZE/@Width",
"path2": null,
"searchValue": null,
"value": 24094,
"points": 2,
"category": "그림삽입",
"item": "② 크기-너비 (85mm)"
},
"2-16": {
"path": "//IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]/preceding-sibling::SHAPEOBJECT/SIZE/@Height",
"path2": null,
"searchValue": null,
"value": 11338,
"points": 2,
"category": "그림삽입",
"item": "③ 크기-높이 (40mm)"
},
"2-17": {
"path": "//IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]/preceding-sibling::SHAPEOBJECT/POSITION/@HorzOffset",
"path2": null,
"searchValue": null,
"value": 0,
"points": 2,
"category": "그림삽입",
"item": "④ 위치 (어울림 : 가로-쪽의 왼쪽 0.0mm)"
},
"2-18": {
"path": "//IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]/preceding-sibling::SHAPEOBJECT/POSITION/@VertOffset",
"path2": null,
"searchValue": null,
"value": 6236,
"points": 2,
"category": "그림삽입",
"item": "⑤ 위치 (어울림 : 세로-쪽의 위 22mm)"
},
"2-19": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "1. 친환경 자동차",
"value": "궁서",
"points": 1,
"category": "속성",
"item": "문구① (1. 친환경 자동차)/① 글씨체 (궁서)"
},
"2-20": {
"path": "//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "1. 친환경 자동차",
"value": 1200,
"points": 1,
"category": "속성",
"item": "문구① (1. 친환경 자동차)/② 크기 (12pt)"
},
"2-21": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/BOLD)",
"path2": null,
"searchValue": "1. 친환경 자동차",
"value": true,
"points": 1,
"category": "속성",
"item": "문구① (1. 친환경 자동차)/③ 진하게"
},
"2-22": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "2. 친환경 자동차 보급 추이",
"value": "궁서",
"points": 1,
"category": "속성",
"item": "문구② (2. 친환경 자동차 보급 추이)/① 글씨체 (궁서)"
},
"2-23": {
"path": "//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "2. 친환경 자동차 보급 추이",
"value": 1200,
"points": 1,
"category": "속성",
"item": "문구② (2. 친환경 자동차 보급 추이)/② 크기 (12pt)"
},
"2-24": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/BOLD)",
"path2": null,
"searchValue": "2. 친환경 자동차 보급 추이",
"value": true,
"points": 1,
"category": "속성",
"item": "문구② (2. 친환경 자동차 보급 추이)/③ 진하게"
},
"2-25": {
"path":"boolean(//CHAR[contains(text(),'자동차 탄소발자국')]/ancestor::TEXT/FOOTNOTE/descendant::CHAR)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('자동차 탄소발자국') + 1) = '자동차 탄소발자국']/following-sibling::FOOTNOTE/descendant::CHAR)",
"searchValue": null,
"value": true,
"points": 2,
"category": "각주",
"item": "문구 (자동차 탄소발자국)/① 각주 설정 및 문구 입력"
},
"2-26": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "자동차 생애에서 배출하는 이산화탄소의 총량",
"value": "굴림",
"points": 1,
"category": "각주",
"item": "문구 (자동차 탄소발자국)/② 글씨체 (굴림)"
},
"2-27": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "자동차 생애에서 배출하는 이산화탄소의 총량",
"value": 900,
"points": 1,
"category": "각주",
"item": "문구 (자동차 탄소발자국)/③ 크기 (9pt)"
},
"2-28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"path2": null,
"searchValue": "자동차 생애에서 배출하는 이산화탄소의 총량",
"value": "CircledHangulSyllable",
"points": 2,
"category": "각주",
"item": "문구 (자동차 탄소발자국)/④ 각주 번호모양"
},
"2-29": {
"path": "boolean(//CHAR[contains(text(),'Hybrid')])",
"path2": null,
"searchValue": null,
"value": true,
"points": 3,
"category": "영단어",
"item": "Hybrid/영단어 미입력, 대소문자/오타 시 전체 감점"
},
"2-30": {
"path": "(count(//CHAR[contains(text(),'전지')][contains(text(),'電池')])+count(//CHAR[contains(text(),'유해')][contains(text(),'有害')])+count(//CHAR[contains(text(),'내연')][contains(text(),'內燃')])+count(//CHAR[contains(text(),'이륜차')][contains(text(),'二輪車')])+count(//CHAR[contains(text(),'기타')][contains(text(),'其他')]))*2",
"path2": null,
"searchValue": null,
"value": 10,
"points": 10,
"category": "한자",
"item": "① 전지(電池), ② 유해(有害), ③내연(內燃), ④ 이륜차(二輪車), ⑤ 기타(其他)"
},
"2-31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'터를독립')])",
"path2": null,
"searchValue": null,
"value": true,
"points": 3,
"category": "편집",
"item": "문구 (…내장된 전기모터이 독립적으로 또는 병행해서…)/\"이\" → \"를\" 글자바꿈"
},
"2-32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'면서환경')])",
"path2": null,
"searchValue": null,
"value": true,
"points": 3,
"category": "편집",
"item": "문구 (…주행하는 방식으로 환경에 주행하면서 유해(有害)한 물질을…)/\"환경에\" / \"주행하면서\" 순서바꿈"
},
"2-33": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "자동차 증가 추이",
"value": "돋움",
"points": 1,
"category": "표",
"item": "제목 문구 (자동차 증가 추이)/① 글씨체 (돋움)"
},
"2-34": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "자동차 증가 추이",
"value": 1200,
"points": 1,
"category": "표",
"item": "제목 문구 (자동차 증가 추이)/② 크기 (12pt)"
},
"2-35": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/BOLD)",
"path2": null,
"searchValue": "자동차 증가 추이",
"value": true,
"points": 1,
"category": "표",
"item": "제목 문구 (자동차 증가 추이)/③ 진하게"
},
"2-36": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"path2": null,
"searchValue": "자동차 증가 추이",
"value": "Center",
"points": 1,
"category": "표",
"item": "제목 문구 (자동차 증가 추이)/④ 정렬 (가운데 정렬)"
},
"2-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='2']/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"searchValue": null,
"value": "7034570",
"points": 2,
"category": "표",
"item": "위쪽 제목 셀/① 색상(RGB:202,86,107)"
},
"2-38": {
"path": "boolean(//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]/BOLD)",
"path2": null,
"searchValue": null,
"value": true,
"points": 1,
"category": "표",
"item": "위쪽 제목 셀/② 진하게"
},
"2-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='2']/@BorderFill]/BOTTOMBORDER/@Type",
"searchValue": null,
"value": "DoubleSlim",
"points": 2,
"category": "표",
"item": "제목 셀 아래선/① 이중실선"
},
"2-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='2']/@BorderFill]/BOTTOMBORDER/@Width",
"searchValue": null,
"value": "0.5mm",
"points": 2,
"category": "표",
"item": "제목 셀 아래선/② 0.5mm"
},
"2-41": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": null,
"value": "궁서체",
"points": 1,
"category": "표",
"item": "글자모양/① 글씨체 (궁서체)"
},
"2-42": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": null,
"value": 1000,
"points": 1,
"category": "표",
"item": "글자모양/② 크기 (10pt)"
},
"2-43": {
"path": "//PARASHAPE[@Id=//TABLE/ROW/descendant::P/@ParaShape]/@Align",
"path2": null,
"searchValue": null,
"value": "Center",
"points": 1,
"category": "표",
"item": "글자모양/③ 정렬 (가운데 정렬)"
},
"2-44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[last()-1]//FIELDBEGIN[starts-with(@Command, '=SUM') and substring(@Command, string-length(@Command) - 2) = '290'] and //TABLE[1]/ROW[last()]/CELL[last()]//FIELDBEGIN[starts-with(@Command, '=SUM') and substring(@Command, string-length(@Command) - 2) = '190'])",
"path2": null,
"searchValue": null,
"value": true,
"points": 4,
"category": "표",
"item": "블록계산식/합계"
},
"2-45": {
"path": "boolean(//c:barChart[c:barDir[@val='col'] and c:grouping[@val='clustered']])",
"path2": null,
"searchValue": null,
"value": true,
"points": 2,
"category": "chart_xml",
"item": "① 종류 (묶은세로막대형)"
},
"2-46": {
"path": "//c:valAx/c:majorTickMark/@val",
"path2": null,
"searchValue": null,
"value": "out",
"points": 2,
"category": "chart_xml",
"item": "② 값 축 주 눈금선"
},
"2-47": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]/descendant::SIZE/@Width",
"path2": null,
"searchValue": null,
"value": 22677,
"points": 2,
"category": "차트",
"item": "③ 크기-너비 (80mm)"
},
"2-48": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]/descendant::SIZE/@Height",
"path2": null,
"searchValue": null,
"value": 25511,
"points": 2,
"category": "차트",
"item": "④ 크기-높이 (90mm)"
},
"2-49": {
"path": "//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계'])",
"path2": null,
"searchValue": null,
"value": true,
"points": 2,
"category": "chart_xml",
"item": "⑤ 차트 데이터(표에서 블록계산식을 제외한 나머지 값만 이용)"
},
"2-50": {
"path": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"path2": null,
"searchValue": "자동차 증가 추이",
"value": "바탕체",
"points": 1,
"category": "chart_xml",
"item": "제목 문구 (자동차 증가 추이) : 제목 문구 불일치는 오타감점에서 반영/① 글씨체 (바탕체)"
},
"2-51": {
"path": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"path2": null,
"searchValue": "자동차 증가 추이",
"value": 1300,
"points": 1,
"category": "chart_xml",
"item": "제목 문구 (자동차 증가 추이) : 제목 문구 불일치는 오타감점에서 반영/② 크기 (13pt)"
},
"2-52": {
"path": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@b",
"path2": null,
"searchValue": "자동차 증가 추이",
"value": 1,
"points": 1,
"category": "chart_xml",
"item": "제목 문구 (자동차 증가 추이) : 제목 문구 불일치는 오타감점에서 반영/③ 진하게"
},
"2-53": {
"path": "//c:catAx//a:ea/@typeface",
"path2": null,
"searchValue": null,
"value": "굴림",
"points": 1,
"category": "chart_xml",
"item": "X축/① 글꼴 (굴림)"
},
"2-54": {
"path": "//c:catAx//a:defRPr/@sz",
"path2": null,
"searchValue": null,
"value": 900,
"points": 1,
"category": "chart_xml",
"item": "X축/② 크기 (9pt)"
},
"2-55": {
"path": "//c:catAx//a:defRPr/@i",
"path2": null,
"searchValue": null,
"value": 1,
"points": 1,
"category": "chart_xml",
"item": "X축/③ 기울임"
},
"2-56": {
"path": "//c:valAx//a:ea/@typeface",
"path2": null,
"searchValue": null,
"value": "굴림",
"points": 1,
"category": "chart_xml",
"item": "Y축/① 글꼴 (굴림)"
},
"2-57": {
"path": "//c:valAx//a:defRPr/@sz",
"path2": null,
"searchValue": null,
"value": 900,
"points": 1,
"category": "chart_xml",
"item": "Y축/② 크기 (9pt)"
},
"2-58": {
"path": "//c:valAx//a:defRPr/@i",
"path2": null,
"searchValue": null,
"value": 1,
"points": 1,
"category": "chart_xml",
"item": "Y축/③ 기울임"
},
"2-59": {
"path": "//c:legend//a:ea/@typeface",
"path2": null,
"searchValue": null,
"value": "굴림",
"points": 1,
"category": "chart_xml",
"item": "범례/① 글꼴 (굴림)"
},
"2-60": {
"path": "//c:legend//a:defRPr/@sz",
"path2": null,
"searchValue": null,
"value": 900,
"points": 1,
"category": "chart_xml",
"item": "범례/② 크기 (9pt)"
},
"2-61": {
"path": "//c:legend//a:defRPr/@i",
"path2": null,
"searchValue": null,
"value": 1,
"points": 1,
"category": "chart_xml",
"item": "범례/③ 기울임"
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

567
diwScoring.py Normal file
View File

@@ -0,0 +1,567 @@
import tkinter as tk
from tkinter import filedialog, messagebox
from datetime import datetime
import difflib
import json
from pathlib import Path
import os
from lxml import etree as ET
import re
from difflib import SequenceMatcher
import pandas as pd
import base64
# from xpathSearch import XMLPathHandler
class XMLScorer:
# 채점 기준 경로 초기화
def __init__(self, scoring_criteria_path):
# 채점 기준 로드
self.scoring_criteria = self._load_scoring_criteria(scoring_criteria_path)
def set_typo_score(self, score):
self.typo_score = score
def get_typo_score(self):
return self.typo_score
# 채점 기준파일 로드(JSON 파일)
def _load_scoring_criteria(self, file_path):
with open(file_path, 'r', encoding='utf-8') as f:
return json.load(f)
# XML 파일에서 element의 값을 찾아 반환
def query_xml(self, root, *args):
first_xpath = args[0]
second_xpath = args[1]
points = args[2]
category = args[3]
if ("특수문자" in category) and (second_xpath is not None):
try:
result = root.xpath(first_xpath)
# 결과값이 리스트형인데 내부에 정보가 없는경우
# 결과값이 없음
if type(result) is list and len(result) == 0:
return None
elif result < points:
result = root.xpath(second_xpath)
return result
else:
return result
except ET.XPathEvalError as e:
return None
elif second_xpath is not None:
try:
result1 = root.xpath(first_xpath)
result2 = root.xpath(second_xpath)
if (type(result1) is list and len(result1) == 0) and (type(result2) is list and len(result2) == 0):
return None
return result1 if result1 else result2
except ET.XPathEvalError as e:
return None
else:
try:
result = root.xpath(first_xpath)
if type(result) is list and len(result) == 0:
return None
return result
except ET.XPathEvalError as e:
return None
def chart_query_xml(self, tree, xpath, namespaces):
result = tree.xpath(xpath, namespaces=namespaces)
if type(result) is list and len(result) == 0:
return None
return result
# 유사한 텍스트 찾기
def find_similar_text(self, root, target_text, threshold=0.7):
"""
전체 문서에서 유사한 텍스트를 찾아 반환
Args:
root (_type_): xml root element 객체
target_text (_type_): 찾을 텍스트
threshold (float, optional): 유사도 설정 Defaults to 0.3.
Returns:
str: 유사도 기준을 만족하는 텍스트
"""
# 전체 텍스트 추출
# all_text = root.xpath(f"//CHAR/text()")
# all_text.append(root.xpath(f"//TEXTART/@text"))
namespaces = {
'a': 'http://schemas.openxmlformats.org/drawingml/2006/main',
'c': 'http://schemas.openxmlformats.org/drawingml/2006/chart'
}
all_text = root.xpath(f"//BODY//text() | //TEXTART/@Text | //c:chart//text()", namespaces=namespaces)
# 유사도 비교
max_score = 0
similar_text = ''
for text in all_text:
score = SequenceMatcher(None, target_text, text).ratio()
if score > max_score:
max_score = score
similar_text = text
if max_score >= threshold:
return similar_text
else:
return None
# 하나의 XML 파일 채점
def _score_xml_file(self, xml_file, chart_xml):
try:
tree = ET.parse(xml_file)
root = tree.getroot()
# 네임스페이스 정의
namespaces = {
'a': 'http://schemas.openxmlformats.org/drawingml/2006/main',
'c': 'http://schemas.openxmlformats.org/drawingml/2006/chart'
}
# 차트 XML 파일이 없는 경우 0점 채점을 위헤 빈 XML 생성
if chart_xml is None:
chart_tree = ET.fromstring('<xml></xml>')
else:
chart_tree = ET.fromstring(chart_xml)
# 결과값을 Dictionary로 저장
results = {
'filename': os.path.basename(xml_file),
'score_results': [],
'total_score': 0,
'partial_scores': []
}
print(f"File name: {results['filename']}")
total_score = 0
for section_id, section in self.scoring_criteria.items():
partial_score = 0
for criterion_id, criterion in section.items():
id = criterion_id
xpath = criterion['path'] if 'path' in criterion else None
xpath2 = criterion['path2'] if 'path2' in criterion else None
search_value = criterion['searchValue'] if 'searchValue' in criterion else None
right_answer = criterion['value'] if 'value' in criterion else None
points = criterion['points'] if 'points' in criterion else None
category = criterion['category']
item = criterion['item']
similar_text = None
# chart xml 파일에서 채점하는 경우
if "chart_xml" in category:
if search_value is not None:
similar_text = self.find_similar_text(chart_tree, search_value)
if similar_text is None:
xpath = xpath.replace('{searchValue}', search_value)
else:
xpath = xpath.replace('{searchValue}', similar_text)
result = self.chart_query_xml(chart_tree, xpath, namespaces)
# 그 외의 hml 파일에서 채점하는 경우
else:
if search_value is not None:
similar_text = self.find_similar_text(root, search_value)
if similar_text is None:
xpath = xpath.replace('{searchValue}', search_value)
else:
xpath = xpath.replace('{searchValue}', similar_text)
result = self.query_xml(root, xpath, xpath2, points, category)
# [ boolean 타입 ]
# 1. 이텔릭체, 굵게, 밑줄 등 효과가 적용 여부에 따라
# [ITALIC] [BOLD] [UNDERLINE] 태그가 있거나 없을 수 있으므로
# 존재 유무에 따라 True, False로 판단
# 2. 두 가지 이상의 조건을 모두 만족해야 하는 경우 and 연산자로 연결되어
# 반환값 True/False로 판단
# [ float 타입 ]
# 1. 부분점수의 합산으로 반환되는 경우 float 타입으로 반환
if type(result) is not list:
if type(result) is float and (result > points):
actual_answer = float(points)
else:
actual_answer = result
else:
if type(right_answer) is int:
actual_answer = int(result[0])
else:
actual_answer = result[0]
if "오타감점" in category:
points = self.get_typo_score()
scoring = {
'section': section_id,
'id': id,
'category': category, # 채점 분류
'item': item, # 채점 항목
'right_answer': right_answer, # 정답
'actual_answer': actual_answer, # 실제 작성 답안
'points': points,
'deductions': [] # 각 기준별 감점 내역
}
# 점수 차감 조건
# 1. 정답이 실수형으로 반환받은 경우는 채점항목의 부분점수 합산 결과이므로
# 반환받은 값 그대로를 점수로 사용
# 2. 정답이 정수형(사이즈 비교)의 경우 오차범위를 넘는다면 감점
# 3. 그 외의 경우 정답과 실제 작성 답안이 다른 경우 점수 차감
if type(actual_answer) is float:
scoring['points'] = actual_answer
elif type(actual_answer) is int:
# 오차범위 3 이상이면 감점
if abs(actual_answer - right_answer) > 3:
scoring['points'] -= points
else:
# right_answer(JSON파일 내 valuer값) null일 경우 점수감점 없이 진행
if right_answer != actual_answer:
scoring['points'] -= points
results['score_results'].append(scoring)
total_score += scoring['points']
partial_score += scoring['points']
print(f'scoring: {scoring}')
results['partial_scores'].append({
'section': section_id,
'score': partial_score
})
results['total_score'] = total_score
return results
except ET.ParseError as e:
return {
'filename': os.path.basename(xml_file),
'error': f"XML 파싱 오류: {str(e)}",
'total_score': 0
}
def binary_to_chartxml(self, xml_path):
tree = ET.parse(xml_path)
root = tree.getroot()
binary_data = root.xpath('//BINDATA[@Id=//BINITEM[@Format="OLE"]/@BinData]/text()')
if not binary_data:
return None
binary_data = binary_data[0].encode('utf-8')
# <BINDATA ...> 태그와 그 내부 내용을 삭제합니다.
encoded_data = re.sub(b'<BINDATA.*?>', b'', binary_data)
encoded_data = encoded_data.replace(b'</BINDATA>', b'')
encoded_data = encoded_data.replace(b'\r\n', b'')
# base64 디코딩을 수행합니다.
decoded_data = base64.b64decode(encoded_data+b'==')
# 디코딩된 데이터 내용 중 xml 형식만 추출할 때 <c:chartSpace>, </c:chartSpace> 사이의 데이터만 추출.
start = decoded_data.find(b'<?xml')
print(start)
end = decoded_data.find(b'</c:chartSpace>')
print(end)
xml_data = decoded_data[start:end+len(b'</c:chartSpace>')]
# xml 데이터가 없는 경우 None을 반환합니다.
if -1 in [start, end]:
return None
# 디코딩된 데이터를 파일로 저장합니다.
base_filename = os.path.splitext(xml_path)[0]
new_filename = f'{base_filename}.xml'
with open(new_filename, 'wb') as file:
file.write(xml_data)
return xml_data
def typo_check(self, correct_answer_file, user_answer_file):
user_answer_tree = ET.parse(user_answer_file)
user_answer_root = user_answer_tree.getroot()
correct_answer_tree = ET.parse(correct_answer_file)
correct_answer_root = correct_answer_tree.getroot()
# xpath로 바이너리 부분추출
user_input_text = user_answer_root.xpath('//CHAR//text()[not(ancestor::HEADER) and not(ancestor::TABLE)]')
user_table_text = user_answer_root.xpath('//TABLE//CHAR//text()')
user_input_text += user_table_text
correct_input_text = correct_answer_root.xpath('//CHAR//text()[not(ancestor::HEADER) and not(ancestor::TABLE)]')
correct_table_text = correct_answer_root.xpath('//TABLE//CHAR//text()')
correct_input_text += correct_table_text
# 각 요소에서 공백 제거
user_input_text = [text.replace(' ', '') for text in user_input_text]
correct_input_text = [text.replace(' ', '') for text in correct_input_text]
# 숫자와 특정 형식 제거 (예: 1., 2., 3., -)
user_input_text = [re.sub(r'\d+\.\s*|-', '', text) for text in user_input_text]
correct_input_text = [re.sub(r'\d+\.\s*|-', '', text) for text in correct_input_text]
try :
xpath = self.scoring_criteria["2-29"]['path'].split("'")[1]
ignore_word = xpath.split("'")[1]
# 특정 단어 제거
# 오타와 누락의 경우만 판단하면 정상작동하지만
# 추가 된 단어의 경우를 채점기준에 추가하면 정확하게 채점 되지 않을 수 있음
# [정답] Hybrid [실제작성]
user_input_text = [text.replace(ignore_word, '') for text in user_input_text]
correct_input_text = [text.replace(ignore_word, '') for text in correct_input_text]
except (KeyError, IndexError, AttributeError):
ignore_word = None
print(f"ignore_word: {ignore_word}")
# 리스트를 하나의 문자열로 변경
user_input_text_str = ''.join(user_input_text)
currect_input_text_str = ''.join(correct_input_text)
print("user_input_text as string:")
print(user_input_text_str)
print("\ncurrect_input_text_answer as string:")
print(currect_input_text_str)
# 문자열의 차이를 비교
diff = difflib.ndiff(currect_input_text_str, user_input_text_str)
diff_list = list(diff)
# 차이점을 정리하여 result_diff에 저장
result_diff = []
# 누락 된 단어만 따로 리스트로 저장
missing_list = []
# 오타와 누락된 단어 리스트 저장
error_missing_list = []
skip_next = False
for i, line in enumerate(diff_list):
if skip_next:
skip_next = False
continue
# diff_list의 line 시작이 '-'이면서 다음 line이 '+'이면 두 line을 붙여서 맞춤법이 틀린 단어로 판단
if line.startswith('- '):
# 오타
if i + 1 < len(diff_list) and diff_list[i + 1].startswith('+ '):
line = line.replace('- ', '-')
next = diff_list[i + 1].replace('+ ', '')
result_diff.append(line+'=>'+next)
error_missing_list.append(line+'=>'+next)
skip_next = True
# 누락
else:
line = line.replace('- ', '-')
result_diff.append(line)
missing_list.append(line)
error_missing_list.append(line)
# 없어도 되는 글자가 있는 경우 (추가)
elif line.startswith('+ '):
line = line.replace('+ ', '+')
result_diff.append(line)
# result_diff 출력
# print("\nResult Differences:")
# for diff in result_diff:
# print(diff)
# result_diff 배열의 길이를 맨 앞에 저장
# 모든 차이를 계산해 점수 차감
# temp = 40 - min(len(result_diff)*2, 40)
# 누락된 텍스트만 계산해 점수 차감
# temp = 40 - min(len(missing_list)*2, 40)
# 2503회 기준 오타 1개당 [2점]->[1점] 차감
temp = 40 - min(len(error_missing_list)*1, 40)
self.set_typo_score(temp)
result_diff.insert(0, temp)
return result_diff
# XML 파일 채점
def score_directory(self, xml_directory, correct_answer_file):
# xml 파일 불러오기
xml_files = Path(xml_directory).glob('*.hml')
# 결과 저장할 리스트
results = []
for user_answer_file in xml_files:
result = {}
chart_xml = self.binary_to_chartxml(user_answer_file)
result['typo'] = self.typo_check(correct_answer_file, user_answer_file)
result['score'] = self._score_xml_file(user_answer_file, chart_xml)
# result['score']['score_results'][2]['points'] = result['typo'][0]
results.append(result)
return results
def parse_filename(self, filename):
if isinstance(filename, dict):
filename = filename.get('파일명', '')
match = re.match(r'.*-(\d+)-(.+)\.hml', filename)
if match:
number = match.group(1)
name = match.group(2)
return number, name
return None, None
def export_to_excel(self, results, output_path=None):
if output_path is None:
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") #연월일_시분초
# timestamp = datetime.now().strftime("%Y%m%d") #연월일
output_path = f"scoring_results_{timestamp}.xlsx"
summary_data = []
detail_data = []
typo_data = []
for temp in results:
# 요약 정보
result = temp['score']
summary_row = {
'파일명': result['filename'],
'총점': result.get('total_score', 0)
}
if 'error' in result:
summary_row['오류'] = result['error']
summary_data.append(summary_row)
# 상세 정보
if 'score_results' in result:
filename = {'파일명': result['filename']}
number, name = self.parse_filename(filename)
if (number or name) is None:
detail_row = {'채점항목': result['filename'] }
else:
detail_row = {'채점항목':f"{number}-{name}"}
section_num = None
row_index = []
for i, score_result in enumerate(result['score_results']):
current_section = score_result['section']
if section_num is None:
section_num = current_section
# 다음 섹션(문제0 => 문제1)로 넘어갔을 경우 or 마지막 문제일 경우
if current_section != section_num:
# 이전 섹션의 부분합을 출력
detail_row[f'문제{section_num}'] = result['partial_scores'][int(section_num)]['score']
row_index.append(f'문제{section_num}')
section_num = current_section
detail_row[f'{i+1}'] = score_result['points']
row_index.append(score_result['id'])
# 마지막 섹션(문제2)부분합 점수를 출력
if i == len(result['score_results']) - 1:
detail_row[f'문제{current_section}'] = result['partial_scores'][int(current_section)]['score']
row_index.append(f'문제{current_section}')
detail_row['총점'] = result.get('total_score', 0)
row_index.append('총점')
detail_data.append(detail_row)
summary_df = pd.DataFrame(summary_data)
detail_df = pd.DataFrame(detail_data).transpose()
detail_df.columns = detail_df.iloc[0]
detail_df = detail_df[1:]
detail_df.index = row_index
# detail_df = pd.DataFrame(detail_data)
for temp in results:
result = temp['typo']
typo_data.append(result)
typo_df = pd.DataFrame(typo_data).transpose()
# detail_df = pd.DataFrame(detail_data)
# ExcelWriter 객체 생성
with pd.ExcelWriter(output_path, engine='openpyxl') as writer:
summary_df.to_excel(writer, sheet_name='채점결과요약', index=False)
detail_df.to_excel(writer, sheet_name='채점상세내역', index=True)
typo_df.to_excel(writer, sheet_name='오타내역', index=False)
# 열 너비 자동 조정
# for sheet_name in writer.sheets:
# worksheet = writer.sheets[sheet_name]
# for column_cells in worksheet.columns:
# max_length = 0
# column = column_cells[0].column_letter # 열의 문자
# for cell in column_cells:
# try:
# if cell.value:
# max_length = max(max_length, len(str(cell.value)))
# except:
# pass
# adjusted_width = (max_length + 2)
# worksheet.column_dimensions[column].width = adjusted_width
return output_path
def main():
# 시험회차 및 유형
exam_round = '2503'
exam_types = [
'A',
'B',
'C',
]
# test_mode = False
test_mode = True
output_excel_paths = []
for exam_type in exam_types:
scoring_criteria_path = f'./DIW_{exam_round}{exam_type}.json'
# xml(hml)파일 디렉토리 경로
xml_directory = f'./output/{exam_type}/{"TEST" if test_mode else "DIW"}'
# 오탈자 체크를 위한 정답 파일 경로 (형식:DIW_2503A.hml)
correct_answer_file = f'./output/{exam_type}/DIW/DIW_{exam_round}{exam_type}.hml'
# 엑셀 파일명 (비어있으면 자동생성)
timestamp = datetime.now().strftime("%y%m%d")
output_path = f'{timestamp}_DIW_{exam_round}{exam_type}_{"TEST" if test_mode else "채점결과"}.xlsx'
# 채점 클래스 초기화
scorer = XMLScorer(scoring_criteria_path)
# 폴더 내 모든 xml 파일 채점
results = scorer.score_directory(xml_directory, correct_answer_file)
# 채점 결과 엑셀로 저장
output_excel_paths.append(scorer.export_to_excel(results, output_path))
print(f"채점 결과 엑셀 파일: {output_excel_paths}")
if __name__ == '__main__':
main()

Binary file not shown.

Binary file not shown.

View File

@@ -139,7 +139,7 @@ class XMLScorer:
else:
chart_tree = ET.fromstring(chart_xml)
total_score = 0
total_score = 0
partial_score = 0
previous_first_digit = None
@@ -308,29 +308,29 @@ class XMLScorer:
return xml_data
def typo_check(self, xml_path_origin, xml_path):
tree = ET.parse(xml_path)
root = tree.getroot()
tree_origin = ET.parse(xml_path_origin)
root_origin = tree_origin.getroot()
def typo_check(self, correct_answer_file, user_answer_file):
user_answer_tree = ET.parse(user_answer_file)
user_answer_root = user_answer_tree.getroot()
correct_answer_tree = ET.parse(correct_answer_file)
correct_answer_root = correct_answer_tree.getroot()
# xpath로 바이너리 부분추출
input_text = root.xpath('//CHAR//text()[not(ancestor::HEADER) and not(ancestor::TABLE)]')
table_text = root.xpath('//TABLE//CHAR//text()')
input_text += table_text
user_input_text = user_answer_root.xpath('//CHAR//text()[not(ancestor::HEADER) and not(ancestor::TABLE)]')
user_table_text = user_answer_root.xpath('//TABLE//CHAR//text()')
user_input_text += user_table_text
input_text_origin = root_origin.xpath('//CHAR//text()[not(ancestor::HEADER) and not(ancestor::TABLE)]')
table_text_origin = root_origin.xpath('//TABLE//CHAR//text()')
input_text_origin += table_text_origin
correct_input_text = correct_answer_root.xpath('//CHAR//text()[not(ancestor::HEADER) and not(ancestor::TABLE)]')
correct_table_text = correct_answer_root.xpath('//TABLE//CHAR//text()')
correct_input_text += correct_table_text
# 각 요소에서 공백 제거
input_text = [text.replace(' ', '') for text in input_text]
input_text_origin = [text.replace(' ', '') for text in input_text_origin]
user_input_text = [text.replace(' ', '') for text in user_input_text]
correct_input_text = [text.replace(' ', '') for text in correct_input_text]
# 숫자와 특정 형식 제거 (예: 1., 2., 3., -)
input_text = [re.sub(r'\d+\.\s*|-', '', text) for text in input_text]
input_text_origin = [re.sub(r'\d+\.\s*|-', '', text) for text in input_text_origin]
user_input_text = [re.sub(r'\d+\.\s*|-', '', text) for text in user_input_text]
correct_input_text = [re.sub(r'\d+\.\s*|-', '', text) for text in correct_input_text]
ignore_word = self.scoring_criteria["2-29"]['path'].split("'")[1]
print(f"ignore_word: {ignore_word}")
@@ -338,21 +338,21 @@ class XMLScorer:
# 오타와 누락의 경우만 판단하면 정상작동하지만
# 추가 된 단어의 경우를 채점기준에 추가하면 정확하게 채점 되지 않을 수 있음
# [정답] Hybrid [실제작성]
input_text = [text.replace(ignore_word, '') for text in input_text]
input_text_origin = [text.replace(ignore_word, '') for text in input_text_origin]
user_input_text = [text.replace(ignore_word, '') for text in user_input_text]
correct_input_text = [text.replace(ignore_word, '') for text in correct_input_text]
# 리스트를 하나의 문자열로 변경
input_text_str = ''.join(input_text)
input_text_origin_str = ''.join(input_text_origin)
user_input_text_str = ''.join(user_input_text)
currect_input_text_str = ''.join(correct_input_text)
print("input_text as string:")
print(input_text_str)
print("\ninput_text_origin as string:")
print(input_text_origin_str)
print("user_input_text as string:")
print(user_input_text_str)
print("\ncurrect_input_text_answer as string:")
print(currect_input_text_str)
# 문자열의 차이를 비교
diff = difflib.ndiff(input_text_origin_str, input_text_str)
diff = difflib.ndiff(currect_input_text_str, user_input_text_str)
diff_list = list(diff)
# 차이점을 정리하여 result_diff에 저장
@@ -412,18 +412,18 @@ class XMLScorer:
return result_diff
# XML 파일 채점
def score_directory(self, xml_directory, answer_path):
def score_directory(self, xml_directory, correct_answer_file):
# xml 파일 불러오기
xml_files = Path(xml_directory).glob('*.hml')
# 결과 저장할 리스트
results = []
for xml_file in xml_files:
for user_answer_file in xml_files:
result = {}
chart_xml = self.binary_to_chartxml(xml_file)
result['typo'] = self.typo_check(answer_path, xml_file)
result['score'] = self._score_xml_file(xml_file, chart_xml)
chart_xml = self.binary_to_chartxml(user_answer_file)
result['typo'] = self.typo_check(correct_answer_file, user_answer_file)
result['score'] = self._score_xml_file(user_answer_file, chart_xml)
# result['score']['score_results'][2]['points'] = result['typo'][0]
results.append(result)
return results
@@ -559,7 +559,7 @@ def main():
# 오탈자 체크를 위한 정답 파일 경로 (형식:DIW_2503A.hml)
answer_path = f'./output/{exam_type}/DIW/DIW_{exam_round}{exam_type}.hml'
correct_answer_file = f'./output/{exam_type}/DIW/DIW_{exam_round}{exam_type}.hml'
# 엑셀 파일명 (비어있으면 자동생성)
timestamp = datetime.now().strftime("%y%m%d")
@@ -569,7 +569,7 @@ def main():
scorer = XMLScorer(scoring_criteria_path)
# 폴더 내 모든 xml 파일 채점
results = scorer.score_directory(xml_directory, answer_path)
results = scorer.score_directory(xml_directory, correct_answer_file)
# 채점 결과 엑셀로 저장
output_excel_paths.append(scorer.export_to_excel(results, output_path))

View File

@@ -0,0 +1,855 @@
{
"0-0": {
"path": "",
"path2": "",
"points": 0,
"category": "파일저장",
"item": "파일명 (수검번호.hwp/hwpx)"
},
"0-1": {
"path": "boolean(//PAGEMARGIN[(@Bottom='5668'or @Bottom='5669') and (@Footer='2834' or @Footer='2835') and @Gutter='0' and (@Header='2834' or @Header='2835') and (@Left='5668' or @Left='5669') and (@Right='5668' or @Right='5669') and (@Top='5668' or @Top='5669')])",
"path2": null,
"searchValue": null,
"value": true,
"points": 4,
"category": "용지설정",
"item": "A4용지, 왼쪽/오른쪽/위쪽/아래쪽 (각20mm), 머리말/꼬리말 (10mm), 제본(0mm)"
},
"0-2": {
"path": "boolean(//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE/FONTID/@Hangul]/@Name='바탕' and //CHARSHAPE/@Height='1000' and //PARASHAPE/PARAMARGIN/@LineSpacing='160' and //PARASHAPE/@Align='Justify')",
"path2": null,
"searchValue": null,
"value": true,
"points": 4,
"category": "기본설정",
"item": "글꼴 (바탕, 10pt), 양쪽정렬, 줄간격 (160%)"
},
"0-3": {
"path": "",
"path2": null,
"searchValue": null,
"value": null,
"points": 40,
"category": "오타감점",
"item": "오타 1개 -1점 / 2503회부터 오타 1개 -1점으로 변경"
},
"1-1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"path2": null,
"searchValue": "친환경이동수단컨퍼런스",
"value": "견고딕",
"points": 1,
"category": "글맵시",
"item": "문구 (친환경이동수단컨퍼런스)/① 글씨체 (견고딕)"
},
"1-2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"path2": null,
"searchValue": "친환경이동수단컨퍼런스",
"value": "9920305",
"points": 2,
"category": "글맵시",
"item": "문구 (친환경이동수단컨퍼런스)/② 채우기 : 색상(RGB:49,95,151)"
},
"1-3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"path2": null,
"searchValue": "친환경이동수단컨퍼런스",
"value": 28346,
"points": 2,
"category": "글맵시",
"item": "문구 (친환경이동수단컨퍼런스)/③ 크기-너비 (100mm)"
},
"1-4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"path2": null,
"searchValue": "친환경이동수단컨퍼런스",
"value": 5669,
"points": 2,
"category": "글맵시",
"item": "문구 (친환경이동수단컨퍼런스)/④ 크기-높이 (20mm)"
},
"1-5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"path2": null,
"searchValue": "친환경이동수단컨퍼런스",
"value": "true",
"points": 2,
"category": "글맵시",
"item": "문구 (친환경이동수단컨퍼런스)/⑤ 위치 (글자처럼 취급)"
},
"1-6": {
"path": "//PARASHAPE[@Id=//TEXTART[@Text='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"path2": null,
"searchValue": "친환경이동수단컨퍼런스",
"value": "Center",
"points": 2,
"category": "글맵시",
"item": "문구 (친환경이동수단컨퍼런스)/⑥ 정렬 (가운데 정렬)"
},
"1-7": {
"path": "boolean(//TEXTART[@Text='{searchValue}'])",
"path2": null,
"searchValue": "친환경이동수단컨퍼런스",
"value": true,
"points": 2,
"category": "글맵시",
"item": "문구 (친환경이동수단컨퍼런스)/⑦ 글맵시모양 (육안확인)"
},
"1-8": {
"path": "boolean(//RECTANGLE[.//CHAR[text()='지']][.//SIZE[(@Height >= 2600 and @Height <= 2800)and(@Width >= 2600 and @Width <= 2800)]])",
"path2": null,
"searchValue": null,
"value": true,
"points": 1,
"category": "문단첫글자장식",
"item": "지/① 모양 (2줄)"
},
"1-9": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TEXT[CHAR[text()='지']]/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": null,
"value": "궁서체",
"points": 1,
"category": "문단첫글자장식",
"item": "지/② 글씨체 (궁서체)"
},
"1-10": {
"path": "//RECTANGLE[.//CHAR[text()='지']]//WINDOWBRUSH/@FaceColor",
"path2": null,
"searchValue": null,
"value": "3644265",
"points": 2,
"category": "문단첫글자장식",
"item": "지/③ 면색 : 색상(RGB:105,155,55)"
},
"1-11": {
"path": "//RECTANGLE[.//CHAR[text()='지']]//OUTSIDEMARGIN/@Right",
"path2": null,
"searchValue": null,
"value": "850",
"points": 2,
"category": "문단첫글자장식",
"item": "지/④ 본문과의 간격 : 3.0mm"
},
"1-12": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[contains(text()[1],'{searchValue}')]/parent::TEXT/@CharShape][ITALIC])",
"path2": null,
"searchValue": "전 세계적으로 차량의 수는 약 13억 대가 있고 국내는 약 2,500만 대",
"value": true,
"points": 2,
"category": "글꼴 속성",
"item": "문구 (전 세계적으로 차량의 수는 약 13억 대가 있고 국내는 약 2,500만 대)/① 기울임"
},
"1-13": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[contains(text()[1],'{searchValue}')]/parent::TEXT/@CharShape][UNDERLINE])",
"path2": null,
"searchValue": "전 세계적으로 차량의 수는 약 13억 대가 있고 국내는 약 2,500만 대",
"value": true,
"points": 2,
"category": "글꼴 속성",
"item": "문구 (전 세계적으로 차량의 수는 약 13억 대가 있고 국내는 약 2,500만 대)/② 밑줄"
},
"1-14": {
"path": "count(//CHAR[contains(text(),'☆')]) + count(//CHAR[contains(text(),'※')])",
"path2": "string-length(//CHAR[contains(text(),'☆')]) - string-length(translate(//CHAR[contains(text(),'☆')], '☆', '')) + string-length(//CHAR[contains(text(),'※')]) - string-length(translate(//CHAR[contains(text(),'※')], '※', ''))",
"searchValue": null,
"value": 3,
"points": 3,
"category": "특수문자",
"item": "① ☆, ② ☆, ③ ※"
},
"1-15": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "☆ 행사안내 ☆",
"value": "궁서",
"points": 1,
"category": "글꼴 속성",
"item": "문구 (☆ 행사안내 ☆)/① 글씨체 (궁서)"
},
"1-16": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"path2": null,
"searchValue": "☆ 행사안내 ☆",
"value": "Center",
"points": 1,
"category": "글꼴 속성",
"item": "문구 (☆ 행사안내 ☆)/② 정렬 (가운데 정렬)"
},
"1-17": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape][BOLD])",
"path2": null,
"searchValue": "2025. 03. 27.(목) 24:00까지",
"value": true,
"points": 1,
"category": "글꼴 속성",
"item": "문구 (2025. 03. 27.(목) 24:00까지)/① 진하게"
},
"1-18": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape][UNDERLINE])",
"path2": null,
"searchValue": "2025. 03. 27.(목) 24:00까지",
"value": true,
"points": 1,
"category": "글꼴 속성",
"item": "문구 (2025. 03. 27.(목) 24:00까지)/② 밑줄"
},
"1-19": {
"path": "boolean(//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN/@Left=3000 and //PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN/@Indent=-2400)",
"path2": null,
"searchValue": "기타사항",
"value": true,
"points": 2,
"category": "문단모양",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (15pt), 내어쓰기 (12pt)"
},
"1-20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "2025. 03. 22.",
"value": 1300,
"points": 1,
"category": "글꼴 속성",
"item": "문구 (2025. 03. 22.)/① 크기 (13pt)"
},
"1-21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"path2": null,
"searchValue": "2025. 03. 22.",
"value": "Center",
"points": 1,
"category": "글꼴 속성",
"item": "문구 (2025. 03. 22.)/② 정렬 (가운데 정렬)"
},
"1-22": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "한국육상운송협회",
"value": "굴림체",
"points": 1,
"category": "글꼴 속성",
"item": "문구 (한국육상운송협회)/① 글씨체 (굴림체)"
},
"1-23": {
"path": "//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "한국육상운송협회",
"value": 2400,
"points": 1,
"category": "글꼴 속성",
"item": "문구 (한국육상운송협회)/② 크기 (24pt)"
},
"1-24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"path2": null,
"searchValue": "한국육상운송협회",
"value": "Center",
"points": 1,
"category": "글꼴 속성",
"item": "문구 (한국육상운송협회)/③ 정렬 (가운데 정렬)"
},
"1-25": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "DIAT",
"value": "돋움",
"points": 1,
"category": "머리말",
"item": "문구 (DIAT)/① 글꼴 (돋움)"
},
"1-26": {
"path": "//CHARSHAPE[@Id=//SECTION[1]//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "DIAT",
"value": 900,
"points": 1,
"category": "머리말",
"item": "문구 (DIAT)/② 크기 (9pt)"
},
"1-27": {
"path": "//PARASHAPE[@Id=//SECTION[1]//CHAR[text()='{searchValue}']/parent::TEXT/parent::P/@ParaShape]/@Align",
"path2": null,
"searchValue": "DIAT",
"value": "Right",
"points": 1,
"category": "머리말",
"item": "문구 (DIAT)/③ 정렬 (오른쪽 정렬)"
},
"1-28": {
"path": "//PAGENUM/@FormatType",
"path2": null,
"searchValue": null,
"value": "LatinCapital",
"points": 2,
"category": "쪽번호",
"item": "① 쪽 번호 매기기 (A,B,C 순으로)"
},
"1-29": {
"path": "//PAGENUM/@Pos",
"path2": null,
"searchValue": null,
"value": "BottomCenter",
"points": 2,
"category": "쪽번호",
"item": "② 가운데 아래"
},
"1-30": {
"path": "not(//PARASHAPE[@Id=//SECTION[1]/P/@ParaShape]/PARAMARGIN[@LineSpacing!='180'])",
"path2": null,
"searchValue": null,
"value": true,
"points": 2,
"category": "줄간격",
"item": "문제 1 줄간격 180% 설정"
},
"2-01": {
"path": "boolean(//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@HeaderInside='true' and //BORDERFILL[@Id=//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@BorferFill]/*[contains(local-name(), 'BORDER')]/@Type='DoubleSlim')",
"path2": null,
"searchValue": null,
"value": true,
"points": 4,
"category": "쪽 테두리",
"item": "문제2 쪽테두리(이중 실선, 머리말 포함) 설정"
},
"2-02": {
"path": "count(//SECTION)>1",
"path2": null,
"searchValue": null,
"value": true,
"points": 3,
"category": "다단",
"item": "① 구역나누기"
},
"2-03": {
"path": "//COLDEF/@Count>1",
"path2": null,
"searchValue": null,
"value": true,
"points": 3,
"category": "다단",
"item": "② 다단 2단"
},
"2-04": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"path2": null,
"searchValue": "친환경 이동수단",
"value": 19842,
"points": 2,
"category": "글상자",
"item": "문구 (친환경 이동수단)/① 크기-너비 (70mm)"
},
"2-05": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"path2": null,
"searchValue": "친환경 이동수단",
"value": 3401,
"points": 2,
"category": "글상자",
"item": "문구 (친환경 이동수단)/② 크기-높이 (12mm)"
},
"2-06": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/descendant::LINESHAPE/@Style",
"path2": null,
"searchValue": "친환경 이동수단",
"value": "DoubleSlim",
"points": 2,
"category": "글상자",
"item": "문구 (친환경 이동수단)/③ 테두리 (이중실선(1.00mm))"
},
"2-07": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/@Ratio",
"path2": null,
"searchValue": "친환경 이동수단",
"value": 50,
"points": 2,
"category": "글상자",
"item": "문구 (친환경 이동수단)/④ 글상자 모서리 (반원)"
},
"2-08": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/descendant::WINDOWBRUSH/@FaceColor",
"path2": null,
"searchValue": "친환경 이동수단",
"value": "9537333",
"points": 2,
"category": "글상자",
"item": "문구 (친환경 이동수단)/⑤ 채우기 : 색상(RGB:53,135,145)"
},
"2-09": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/POSITION/@TreatAsChar",
"path2": null,
"searchValue": "친환경 이동수단",
"value": "true",
"points": 1,
"category": "글상자",
"item": "문구 (친환경 이동수단)/⑥ 글상자 위치 (글자처럼 취급)"
},
"2-10": {
"path": "//PARASHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::P[last()]/@ParaShape]/@Align",
"path2": null,
"searchValue": "친환경 이동수단",
"value": "Center",
"points": 1,
"category": "글상자",
"item": "문구 (친환경 이동수단)/⑦ 글상자 정렬 (가운데 정렬)"
},
"2-11": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "친환경 이동수단",
"value": "맑은 고딕",
"points": 1,
"category": "글상자",
"item": "문구 (친환경 이동수단)/⑧ 글씨체 (맑은 고딕)"
},
"2-12": {
"path": "boolean(//CHARSHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/@Height='2400')",
"path2": null,
"searchValue": "친환경 이동수단",
"value": true,
"points": 1,
"category": "글상자",
"item": "문구 (친환경 이동수단)/⑨ 글씨크기 (24pt)"
},
"2-13": {
"path": "//PARASHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::P[1]/@ParaShape]/@Align",
"path2": null,
"searchValue": "친환경 이동수단",
"value": "Center",
"points": 1,
"category": "글상자",
"item": "문구 (친환경 이동수단)/⑩ 정렬 (가운데 정렬)"
},
"2-14": {
"path": "boolean(//PICTURE/descendant::SHAPECOMMENT[contains(text(),'{searchValue}')])",
"path2": null,
"searchValue": "원본 그림의 이름: 그림",
"value": true,
"points": 2,
"category": "그림삽입",
"item": "① 파일명 \"그림A.jpg\" 삽입"
},
"2-15": {
"path": "//IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]/preceding-sibling::SHAPEOBJECT/SIZE/@Width",
"path2": null,
"searchValue": null,
"value": 24094,
"points": 2,
"category": "그림삽입",
"item": "② 크기-너비 (85mm)"
},
"2-16": {
"path": "//IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]/preceding-sibling::SHAPEOBJECT/SIZE/@Height",
"path2": null,
"searchValue": null,
"value": 11338,
"points": 2,
"category": "그림삽입",
"item": "③ 크기-높이 (40mm)"
},
"2-17": {
"path": "//IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]/preceding-sibling::SHAPEOBJECT/POSITION/@HorzOffset",
"path2": null,
"searchValue": null,
"value": 0,
"points": 2,
"category": "그림삽입",
"item": "④ 위치 (어울림 : 가로-쪽의 왼쪽 0.0mm)"
},
"2-18": {
"path": "//IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]/preceding-sibling::SHAPEOBJECT/POSITION/@VertOffset",
"path2": null,
"searchValue": null,
"value": 6236,
"points": 2,
"category": "그림삽입",
"item": "⑤ 위치 (어울림 : 세로-쪽의 위 22mm)"
},
"2-19": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "1. 친환경 자동차",
"value": "궁서",
"points": 1,
"category": "속성",
"item": "문구① (1. 친환경 자동차)/① 글씨체 (궁서)"
},
"2-20": {
"path": "//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "1. 친환경 자동차",
"value": 1200,
"points": 1,
"category": "속성",
"item": "문구① (1. 친환경 자동차)/② 크기 (12pt)"
},
"2-21": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/BOLD)",
"path2": null,
"searchValue": "1. 친환경 자동차",
"value": true,
"points": 1,
"category": "속성",
"item": "문구① (1. 친환경 자동차)/③ 진하게"
},
"2-22": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "2. 친환경 자동차 보급 추이",
"value": "궁서",
"points": 1,
"category": "속성",
"item": "문구② (2. 친환경 자동차 보급 추이)/① 글씨체 (궁서)"
},
"2-23": {
"path": "//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "2. 친환경 자동차 보급 추이",
"value": 1200,
"points": 1,
"category": "속성",
"item": "문구② (2. 친환경 자동차 보급 추이)/② 크기 (12pt)"
},
"2-24": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/BOLD)",
"path2": null,
"searchValue": "2. 친환경 자동차 보급 추이",
"value": true,
"points": 1,
"category": "속성",
"item": "문구② (2. 친환경 자동차 보급 추이)/③ 진하게"
},
"2-25": {
"path":"boolean(//CHAR[contains(text(),'자동차 탄소발자국')]/ancestor::TEXT/FOOTNOTE/descendant::CHAR)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('자동차 탄소발자국') + 1) = '자동차 탄소발자국']/following-sibling::FOOTNOTE/descendant::CHAR)",
"searchValue": null,
"value": true,
"points": 2,
"category": "각주",
"item": "문구 (자동차 탄소발자국)/① 각주 설정 및 문구 입력"
},
"2-26": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "자동차 생애에서 배출하는 이산화탄소의 총량",
"value": "굴림",
"points": 1,
"category": "각주",
"item": "문구 (자동차 탄소발자국)/② 글씨체 (굴림)"
},
"2-27": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "자동차 생애에서 배출하는 이산화탄소의 총량",
"value": 900,
"points": 1,
"category": "각주",
"item": "문구 (자동차 탄소발자국)/③ 크기 (9pt)"
},
"2-28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"path2": null,
"searchValue": "자동차 생애에서 배출하는 이산화탄소의 총량",
"value": "CircledHangulSyllable",
"points": 2,
"category": "각주",
"item": "문구 (자동차 탄소발자국)/④ 각주 번호모양"
},
"2-29": {
"path": "boolean(//CHAR[contains(text(),'Hybrid')])",
"path2": null,
"searchValue": null,
"value": true,
"points": 3,
"category": "영단어",
"item": "Hybrid/영단어 미입력, 대소문자/오타 시 전체 감점"
},
"2-30": {
"path": "(count(//CHAR[contains(text(),'전지')][contains(text(),'電池')])+count(//CHAR[contains(text(),'유해')][contains(text(),'有害')])+count(//CHAR[contains(text(),'내연')][contains(text(),'內燃')])+count(//CHAR[contains(text(),'이륜차')][contains(text(),'二輪車')])+count(//CHAR[contains(text(),'기타')][contains(text(),'其他')]))*2",
"path2": null,
"searchValue": null,
"value": 10,
"points": 10,
"category": "한자",
"item": "① 전지(電池), ② 유해(有害), ③내연(內燃), ④ 이륜차(二輪車), ⑤ 기타(其他)"
},
"2-31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'터를독립')])",
"path2": null,
"searchValue": null,
"value": true,
"points": 3,
"category": "편집",
"item": "문구 (…내장된 전기모터이 독립적으로 또는 병행해서…)/\"이\" → \"를\" 글자바꿈"
},
"2-32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'면서환경')])",
"path2": null,
"searchValue": null,
"value": true,
"points": 3,
"category": "편집",
"item": "문구 (…주행하는 방식으로 환경에 주행하면서 유해(有害)한 물질을…)/\"환경에\" / \"주행하면서\" 순서바꿈"
},
"2-33": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "자동차 증가 추이",
"value": "돋움",
"points": 1,
"category": "표",
"item": "제목 문구 (자동차 증가 추이)/① 글씨체 (돋움)"
},
"2-34": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "자동차 증가 추이",
"value": 1200,
"points": 1,
"category": "표",
"item": "제목 문구 (자동차 증가 추이)/② 크기 (12pt)"
},
"2-35": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/BOLD)",
"path2": null,
"searchValue": "자동차 증가 추이",
"value": true,
"points": 1,
"category": "표",
"item": "제목 문구 (자동차 증가 추이)/③ 진하게"
},
"2-36": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"path2": null,
"searchValue": "자동차 증가 추이",
"value": "Center",
"points": 1,
"category": "표",
"item": "제목 문구 (자동차 증가 추이)/④ 정렬 (가운데 정렬)"
},
"2-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='2']/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"searchValue": null,
"value": "7034570",
"points": 2,
"category": "표",
"item": "위쪽 제목 셀/① 색상(RGB:202,86,107)"
},
"2-38": {
"path": "boolean(//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]/BOLD)",
"path2": null,
"searchValue": null,
"value": true,
"points": 1,
"category": "표",
"item": "위쪽 제목 셀/② 진하게"
},
"2-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='2']/@BorderFill]/BOTTOMBORDER/@Type",
"searchValue": null,
"value": "DoubleSlim",
"points": 2,
"category": "표",
"item": "제목 셀 아래선/① 이중실선"
},
"2-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='2']/@BorderFill]/BOTTOMBORDER/@Width",
"searchValue": null,
"value": "0.5mm",
"points": 2,
"category": "표",
"item": "제목 셀 아래선/② 0.5mm"
},
"2-41": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": null,
"value": "궁서체",
"points": 1,
"category": "표",
"item": "글자모양/① 글씨체 (궁서체)"
},
"2-42": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": null,
"value": 1000,
"points": 1,
"category": "표",
"item": "글자모양/② 크기 (10pt)"
},
"2-43": {
"path": "//PARASHAPE[@Id=//TABLE/ROW/descendant::P/@ParaShape]/@Align",
"path2": null,
"searchValue": null,
"value": "Center",
"points": 1,
"category": "표",
"item": "글자모양/③ 정렬 (가운데 정렬)"
},
"2-44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[last()-1]//FIELDBEGIN[starts-with(@Command, '=SUM') and substring(@Command, string-length(@Command) - 2) = '290'] and //TABLE[1]/ROW[last()]/CELL[last()]//FIELDBEGIN[starts-with(@Command, '=SUM') and substring(@Command, string-length(@Command) - 2) = '190'])",
"path2": null,
"searchValue": null,
"value": true,
"points": 4,
"category": "표",
"item": "블록계산식/합계"
},
"2-45": {
"path": "boolean(//c:barChart[c:barDir[@val='col'] and c:grouping[@val='clustered']])",
"path2": null,
"searchValue": null,
"value": true,
"points": 2,
"category": "chart_xml",
"item": "① 종류 (묶은세로막대형)"
},
"2-46": {
"path": "//c:valAx/c:majorTickMark/@val",
"path2": null,
"searchValue": null,
"value": "out",
"points": 2,
"category": "chart_xml",
"item": "② 값 축 주 눈금선"
},
"2-47": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]/descendant::SIZE/@Width",
"path2": null,
"searchValue": null,
"value": 22677,
"points": 2,
"category": "차트",
"item": "③ 크기-너비 (80mm)"
},
"2-48": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]/descendant::SIZE/@Height",
"path2": null,
"searchValue": null,
"value": 25511,
"points": 2,
"category": "차트",
"item": "④ 크기-높이 (90mm)"
},
"2-49": {
"path": "//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계'])",
"path2": null,
"searchValue": null,
"value": true,
"points": 2,
"category": "chart_xml",
"item": "⑤ 차트 데이터(표에서 블록계산식을 제외한 나머지 값만 이용)"
},
"2-50": {
"path": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"path2": null,
"searchValue": "자동차 증가 추이",
"value": "바탕체",
"points": 1,
"category": "chart_xml",
"item": "제목 문구 (자동차 증가 추이) : 제목 문구 불일치는 오타감점에서 반영/① 글씨체 (바탕체)"
},
"2-51": {
"path": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"path2": null,
"searchValue": "자동차 증가 추이",
"value": 1300,
"points": 1,
"category": "chart_xml",
"item": "제목 문구 (자동차 증가 추이) : 제목 문구 불일치는 오타감점에서 반영/② 크기 (13pt)"
},
"2-52": {
"path": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@b",
"path2": null,
"searchValue": "자동차 증가 추이",
"value": 1,
"points": 1,
"category": "chart_xml",
"item": "제목 문구 (자동차 증가 추이) : 제목 문구 불일치는 오타감점에서 반영/③ 진하게"
},
"2-53": {
"path": "//c:catAx//a:ea/@typeface",
"path2": null,
"searchValue": null,
"value": "굴림",
"points": 1,
"category": "chart_xml",
"item": "X축/① 글꼴 (굴림)"
},
"2-54": {
"path": "//c:catAx//a:defRPr/@sz",
"path2": null,
"searchValue": null,
"value": 900,
"points": 1,
"category": "chart_xml",
"item": "X축/② 크기 (9pt)"
},
"2-55": {
"path": "//c:catAx//a:defRPr/@i",
"path2": null,
"searchValue": null,
"value": 1,
"points": 1,
"category": "chart_xml",
"item": "X축/③ 기울임"
},
"2-56": {
"path": "//c:valAx//a:ea/@typeface",
"path2": null,
"searchValue": null,
"value": "굴림",
"points": 1,
"category": "chart_xml",
"item": "Y축/① 글꼴 (굴림)"
},
"2-57": {
"path": "//c:valAx//a:defRPr/@sz",
"path2": null,
"searchValue": null,
"value": 900,
"points": 1,
"category": "chart_xml",
"item": "Y축/② 크기 (9pt)"
},
"2-58": {
"path": "//c:valAx//a:defRPr/@i",
"path2": null,
"searchValue": null,
"value": 1,
"points": 1,
"category": "chart_xml",
"item": "Y축/③ 기울임"
},
"2-59": {
"path": "//c:legend//a:ea/@typeface",
"path2": null,
"searchValue": null,
"value": "굴림",
"points": 1,
"category": "chart_xml",
"item": "범례/① 글꼴 (굴림)"
},
"2-60": {
"path": "//c:legend//a:defRPr/@sz",
"path2": null,
"searchValue": null,
"value": 900,
"points": 1,
"category": "chart_xml",
"item": "범례/② 크기 (9pt)"
},
"2-61": {
"path": "//c:legend//a:defRPr/@i",
"path2": null,
"searchValue": null,
"value": 1,
"points": 1,
"category": "chart_xml",
"item": "범례/③ 기울임"
}
}

View File

@@ -0,0 +1,855 @@
{
"0-0": {
"path": "",
"path2": "",
"points": 0,
"category": "파일저장",
"item": "파일명 (수검번호.hwp/hwpx)"
},
"0-1": {
"path": "boolean(//PAGEMARGIN[(@Bottom='5668'or @Bottom='5669') and (@Footer='2834' or @Footer='2835') and @Gutter='0' and (@Header='2834' or @Header='2835') and (@Left='5668' or @Left='5669') and (@Right='5668' or @Right='5669') and (@Top='5668' or @Top='5669')])",
"path2": null,
"searchValue": null,
"value": true,
"points": 4,
"category": "용지설정",
"item": "A4용지, 왼쪽/오른쪽/위쪽/아래쪽 (각20mm), 머리말/꼬리말 (10mm), 제본(0mm)"
},
"0-2": {
"path": "boolean(//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE/FONTID/@Hangul]/@Name='바탕' and //CHARSHAPE/@Height='1000' and //PARASHAPE/PARAMARGIN/@LineSpacing='160' and //PARASHAPE/@Align='Justify')",
"path2": null,
"searchValue": null,
"value": true,
"points": 4,
"category": "기본설정",
"item": "글꼴 (바탕, 10pt), 양쪽정렬, 줄간격 (160%)"
},
"0-3": {
"path": "",
"path2": null,
"searchValue": null,
"value": null,
"points": 40,
"category": "오타감점",
"item": "오타 1개 -1점 / 2503회부터 오타 1개 -1점으로 변경"
},
"1-1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"path2": null,
"searchValue": "건강100세프로젝트행사",
"value": "궁서",
"points": 1,
"category": "글맵시",
"item": "문구 (건강100세프로젝트행사)/① 글씨체 (궁서)"
},
"1-2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"path2": null,
"searchValue": "건강100세프로젝트행사",
"value": "3644265",
"points": 2,
"category": "글맵시",
"item": "문구 (건강100세프로젝트행사)/② 채우기 : 색상(RGB:105,155,55)"
},
"1-3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"path2": null,
"searchValue": "건강100세프로젝트행사",
"value": 34015,
"points": 2,
"category": "글맵시",
"item": "문구 (건강100세프로젝트행사)/③ 크기-너비 (120mm)"
},
"1-4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"path2": null,
"searchValue": "건강100세프로젝트행사",
"value": 5669,
"points": 2,
"category": "글맵시",
"item": "문구 (건강100세프로젝트행사)/④ 크기-높이 (20mm)"
},
"1-5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"path2": null,
"searchValue": "건강100세프로젝트행사",
"value": "true",
"points": 2,
"category": "글맵시",
"item": "문구 (건강100세프로젝트행사)/⑤ 위치 (글자처럼 취급)"
},
"1-6": {
"path": "//PARASHAPE[@Id=//TEXTART[@Text='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"path2": null,
"searchValue": "건강100세프로젝트행사",
"value": "Center",
"points": 2,
"category": "글맵시",
"item": "문구 (건강100세프로젝트행사)/⑥ 정렬 (가운데 정렬)"
},
"1-7": {
"path": "boolean(//TEXTART[@Text='{searchValue}'])",
"path2": null,
"searchValue": "건강100세프로젝트행사",
"value": true,
"points": 2,
"category": "글맵시",
"item": "문구 (건강100세프로젝트행사)/⑦ 글맵시모양 (육안확인)"
},
"1-8": {
"path": "boolean(//RECTANGLE[.//CHAR[text()='인']][.//SIZE[(@Height >= 2600 and @Height <= 2800)and(@Width >= 2600 and @Width <= 2800)]])",
"path2": null,
"searchValue": null,
"value": true,
"points": 1,
"category": "문단첫글자장식",
"item": "인/① 모양 (2줄)"
},
"1-9": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TEXT[CHAR[text()='인']]/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": null,
"value": "돋움",
"points": 1,
"category": "문단첫글자장식",
"item": "인/② 글씨체 (돋움)"
},
"1-10": {
"path": "//RECTANGLE[.//CHAR[text()='인']]//WINDOWBRUSH/@FaceColor",
"path2": null,
"searchValue": null,
"value": "10966730",
"points": 2,
"category": "문단첫글자장식",
"item": "인/③ 면색 : 색상(RGB:202,86,167)"
},
"1-11": {
"path": "//RECTANGLE[.//CHAR[text()='인']]//OUTSIDEMARGIN/@Right",
"path2": null,
"searchValue": null,
"value": "850",
"points": 2,
"category": "문단첫글자장식",
"item": "인/④ 본문과의 간격 : 3.0mm"
},
"1-12": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[contains(text()[1],'{searchValue}')]/parent::TEXT/@CharShape][BOLD])",
"path2": null,
"searchValue": "2023년 경제협력개발기구 보건통계 기준 한국의 기대수명은 83.6년",
"value": true,
"points": 2,
"category": "글꼴 속성",
"item": "문구 (2023년 경제협력개발기구 보건통계 기준 한국의 기대수명은 83.6년)/① 진하게"
},
"1-13": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[contains(text()[1],'{searchValue}')]/parent::TEXT/@CharShape][UNDERLINE])",
"path2": null,
"searchValue": "2023년 경제협력개발기구 보건통계 기준 한국의 기대수명은 83.6년",
"value": true,
"points": 2,
"category": "글꼴 속성",
"item": "문구 (2023년 경제협력개발기구 보건통계 기준 한국의 기대수명은 83.6년)/② 밑줄"
},
"1-14": {
"path": "count(//CHAR[contains(text(),'■')]) + count(//CHAR[contains(text(),'※')])",
"path2": "string-length(//CHAR[contains(text(),'■')]) - string-length(translate(//CHAR[contains(text(),'■')], '■', '')) + string-length(//CHAR[contains(text(),'※')]) - string-length(translate(//CHAR[contains(text(),'※')], '※', ''))",
"searchValue": null,
"value": 3,
"points": 3,
"category": "특수문자",
"item": "① ■, ② ■, ③ ※"
},
"1-15": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "■ 행사개요 ■",
"value": "굴림",
"points": 1,
"category": "글꼴 속성",
"item": "문구 (■ 행사개요 ■)/① 글씨체 (굴림)"
},
"1-16": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"path2": null,
"searchValue": "■ 행사개요 ■",
"value": "Center",
"points": 1,
"category": "글꼴 속성",
"item": "문구 (■ 행사개요 ■)/② 정렬 (가운데 정렬)"
},
"1-17": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape][BOLD])",
"path2": null,
"searchValue": "2025. 03. 30.(일) 18:00까지 온라인으로 등록(http://www.ihd.or.kr)",
"value": true,
"points": 1,
"category": "글꼴 속성",
"item": "문구 (2025. 03. 30.(일) 18:00까지 온라인으로 등록(http://www.ihd.or.kr))/① 진하게"
},
"1-18": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape][ITALIC])",
"path2": null,
"searchValue": "2025. 03. 30.(일) 18:00까지 온라인으로 등록(http://www.ihd.or.kr)",
"value": true,
"points": 1,
"category": "글꼴 속성",
"item": "문구 (2025. 03. 30.(일) 18:00까지 온라인으로 등록(http://www.ihd.or.kr))/② 기울임"
},
"1-19": {
"path": "boolean(//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN/@Left=3000 and //PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN/@Indent=-2400)",
"path2": null,
"searchValue": "기타사항",
"value": true,
"points": 2,
"category": "문단모양",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (15pt), 내어쓰기 (12pt)"
},
"1-20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "2025. 03. 22.",
"value": 1300,
"points": 1,
"category": "글꼴 속성",
"item": "문구 (2025. 03. 22.)/① 크기 (13pt)"
},
"1-21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"path2": null,
"searchValue": "2025. 03. 22.",
"value": "Center",
"points": 1,
"category": "글꼴 속성",
"item": "문구 (2025. 03. 22.)/② 정렬 (가운데 정렬)"
},
"1-22": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "한국질병관리협회",
"value": "굴림",
"points": 1,
"category": "글꼴 속성",
"item": "문구 (한국질병관리협회)/① 글씨체 (굴림)"
},
"1-23": {
"path": "//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "한국질병관리협회",
"value": 2400,
"points": 1,
"category": "글꼴 속성",
"item": "문구 (한국질병관리협회)/② 크기 (24pt)"
},
"1-24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"path2": null,
"searchValue": "한국질병관리협회",
"value": "Center",
"points": 1,
"category": "글꼴 속성",
"item": "문구 (한국질병관리협회)/③ 정렬 (가운데 정렬)"
},
"1-25": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "DIAT",
"value": "굴림",
"points": 1,
"category": "머리말",
"item": "문구 (DIAT)/① 글꼴 (굴림)"
},
"1-26": {
"path": "//CHARSHAPE[@Id=//SECTION[1]//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "DIAT",
"value": 900,
"points": 1,
"category": "머리말",
"item": "문구 (DIAT)/② 크기 (9pt)"
},
"1-27": {
"path": "//PARASHAPE[@Id=//SECTION[1]//CHAR[text()='{searchValue}']/parent::TEXT/parent::P/@ParaShape]/@Align",
"path2": null,
"searchValue": "DIAT",
"value": "Right",
"points": 1,
"category": "머리말",
"item": "문구 (DIAT)/③ 정렬 (오른쪽 정렬)"
},
"1-28": {
"path": "//PAGENUM/@FormatType",
"path2": null,
"searchValue": null,
"value": "LatinCapital",
"points": 2,
"category": "쪽번호",
"item": "① 쪽 번호 매기기 (A,B,C 순으로)"
},
"1-29": {
"path": "//PAGENUM/@Pos",
"path2": null,
"searchValue": null,
"value": "BottomCenter",
"points": 2,
"category": "쪽번호",
"item": "② 가운데 아래"
},
"1-30": {
"path": "not(//PARASHAPE[@Id=//SECTION[1]/P/@ParaShape]/PARAMARGIN[@LineSpacing!=180])",
"path2": null,
"searchValue": null,
"value": true,
"points": 2,
"category": "줄간격",
"item": "문제 1 줄간격 180% 설정"
},
"2-01": {
"path": "boolean(//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@HeaderInside='true' and //BORDERFILL[@Id=//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@BorferFill]/*[contains(local-name(), 'BORDER')]/@Type='DoubleSlim')",
"path2": null,
"searchValue": null,
"value": true,
"points": 4,
"category": "쪽 테두리",
"item": "문제2 쪽테두리(이중 실선, 머리말 포함) 설정"
},
"2-02": {
"path": "count(//SECTION)>1",
"path2": null,
"searchValue": null,
"value": true,
"points": 3,
"category": "다단",
"item": "① 구역나누기"
},
"2-03": {
"path": "//COLDEF/@Count>1",
"path2": null,
"searchValue": null,
"value": true,
"points": 3,
"category": "다단",
"item": "② 다단 2단"
},
"2-04": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"path2": null,
"searchValue": "비만과 비만치료",
"value": 19842,
"points": 2,
"category": "글상자",
"item": "문구 (비만과 비만치료)/① 크기-너비 (70mm)"
},
"2-05": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"path2": null,
"searchValue": "비만과 비만치료",
"value": 3402,
"points": 2,
"category": "글상자",
"item": "문구 (비만과 비만치료)/② 크기-높이 (12mm)"
},
"2-06": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/descendant::LINESHAPE/@Style",
"path2": null,
"searchValue": "비만과 비만치료",
"value": "DoubleSlim",
"points": 2,
"category": "글상자",
"item": "문구 (비만과 비만치료)/③ 테두리 (이중실선(1.00mm))"
},
"2-07": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/@Ratio",
"path2": null,
"searchValue": "비만과 비만치료",
"value": 20,
"points": 2,
"category": "글상자",
"item": "문구 (비만과 비만치료)/④ 글상자 모서리 (둥근 모양)"
},
"2-08": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/descendant::WINDOWBRUSH/@FaceColor",
"path2": null,
"searchValue": "비만과 비만치료",
"value": "2862825",
"points": 2,
"category": "글상자",
"item": "문구 (비만과 비만치료)/⑤ 채우기 : 색상(RGB:233,174,43)"
},
"2-09": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/POSITION/@TreatAsChar",
"path2": null,
"searchValue": "비만과 비만치료",
"value": "true",
"points": 1,
"category": "글상자",
"item": "문구 (비만과 비만치료)/⑥ 글상자 위치 (글자처럼 취급)"
},
"2-10": {
"path": "//PARASHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::P[last()]/@ParaShape]/@Align",
"path2": null,
"searchValue": "비만과 비만치료",
"value": "Center",
"points": 1,
"category": "글상자",
"item": "문구 (비만과 비만치료)/⑦ 글상자 정렬 (가운데 정렬)"
},
"2-11": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "비만과 비만치료",
"value": "맑은 고딕",
"points": 1,
"category": "글상자",
"item": "문구 (비만과 비만치료)/⑧ 글씨체 (맑은 고딕)"
},
"2-12": {
"path": "boolean(//CHARSHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/@Height='2300')",
"path2": null,
"searchValue": "비만과 비만치료",
"value": true,
"points": 1,
"category": "글상자",
"item": "문구 (비만과 비만치료)/⑨ 글씨크기 (23pt)"
},
"2-13": {
"path": "//PARASHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::P[1]/@ParaShape]/@Align",
"path2": null,
"searchValue": "비만과 비만치료",
"value": "Center",
"points": 1,
"category": "글상자",
"item": "문구 (비만과 비만치료)/⑩ 정렬 (가운데 정렬)"
},
"2-14": {
"path": "boolean(//PICTURE/descendant::SHAPECOMMENT[contains(text(),'{searchValue}')])",
"path2": null,
"searchValue": "원본 그림의 이름: 그림",
"value": true,
"points": 2,
"category": "그림삽입",
"item": "① 파일명 \"그림B.jpg\" 삽입"
},
"2-15": {
"path": "//IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]/preceding-sibling::SHAPEOBJECT/SIZE/@Width",
"path2": null,
"searchValue": null,
"value": 24094,
"points": 2,
"category": "그림삽입",
"item": "② 크기-너비 (85mm)"
},
"2-16": {
"path": "//IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]/preceding-sibling::SHAPEOBJECT/SIZE/@Height",
"path2": null,
"searchValue": null,
"value": 11338,
"points": 2,
"category": "그림삽입",
"item": "③ 크기-높이 (40mm)"
},
"2-17": {
"path": "//IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]/preceding-sibling::SHAPEOBJECT/POSITION/@HorzOffset",
"path2": null,
"searchValue": null,
"value": 0,
"points": 2,
"category": "그림삽입",
"item": "④ 위치 (어울림 : 가로-쪽의 왼쪽 0.0mm)"
},
"2-18": {
"path": "//IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]/preceding-sibling::SHAPEOBJECT/POSITION/@VertOffset",
"path2": null,
"searchValue": null,
"value": 6520,
"points": 2,
"category": "그림삽입",
"item": "⑤ 위치 (어울림 : 세로-쪽의 위 23mm)"
},
"2-19": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "1. 비만",
"value": "바탕체",
"points": 1,
"category": "속성",
"item": "문구① (1. 비만)/① 글씨체 (바탕체)"
},
"2-20": {
"path": "//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "1. 비만",
"value": 1200,
"points": 1,
"category": "속성",
"item": "문구① (1. 비만)/② 크기 (12pt)"
},
"2-21": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/BOLD)",
"path2": null,
"searchValue": "1. 비만",
"value": true,
"points": 1,
"category": "속성",
"item": "문구① (1. 비만)/③ 진하게"
},
"2-22": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "2. 비만치료",
"value": "바탕체",
"points": 1,
"category": "속성",
"item": "문구② (2. 비만치료)/① 글씨체 (바탕체)"
},
"2-23": {
"path": "//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "2. 비만치료",
"value": 1200,
"points": 1,
"category": "속성",
"item": "문구② (2. 비만치료)/② 크기 (12pt)"
},
"2-24": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/BOLD)",
"path2": null,
"searchValue": "2. 비만치료",
"value": true,
"points": 1,
"category": "속성",
"item": "문구② (2. 비만치료)/③ 진하게"
},
"2-25": {
"path":"boolean(//CHAR[contains(text(),'비만 약물치료')]/ancestor::TEXT/FOOTNOTE/descendant::CHAR)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('비만 약물치료') + 1) = '비만 약물치료']/following-sibling::FOOTNOTE/descendant::CHAR)",
"searchValue": null,
"value": true,
"points": 2,
"category": "각주",
"item": "문구 (비만 약물치료)/① 각주 설정 및 문구 입력"
},
"2-26": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "비약물로 어려운 체질량지수 25 이상인 경우 시행",
"value": "돋움",
"points": 1,
"category": "각주",
"item": "문구 (비만 약물치료)/② 글씨체 (돋움)"
},
"2-27": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "비약물로 어려운 체질량지수 25 이상인 경우 시행",
"value": 900,
"points": 1,
"category": "각주",
"item": "문구 (비만 약물치료)/③ 크기 (9pt)"
},
"2-28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"path2": null,
"searchValue":"비약물로 어려운 체질량지수 25 이상인 경우 시행",
"value": "LatinSmall",
"points": 2,
"category": "각주",
"item": "문구 (비만 약물치료)/④ 각주 번호모양"
},
"2-29": {
"path": "boolean(//CHAR[contains(text(),'Obesity')])",
"path2": null,
"searchValue": null,
"value": true,
"points": 3,
"category": "영단어",
"item": "Obesity/영단어 미입력, 대소문자/오타 시 전체 감점"
},
"2-30": {
"path": "(count(//CHAR[contains(text(),'비만')][contains(text(),'肥滿')])+count(//CHAR[contains(text(),'복부')][contains(text(),'腹部')])+count(//CHAR[contains(text(),'대사')][contains(text(),'代謝')])+count(//CHAR[contains(text(),'특정')][contains(text(),'特定')])+count(//CHAR[contains(text(),'축적')][contains(text(),'特定')]))*2",
"path2": null,
"searchValue": null,
"value": 10,
"points": 10,
"category": "한자",
"item": "① 비만(肥滿), ② 복부(腹部), ③대사(代謝), ④ 특정(特定), ⑤ 축적(特定)"
},
"2-31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'정의다른')])",
"path2": null,
"searchValue": null,
"value": true,
"points": 3,
"category": "편집",
"item": "문구 (…비만 측정을 다른 방법으로는…)/\"을\" → \"의\" 글자바꿈"
},
"2-32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'거나복부')])",
"path2": null,
"searchValue": null,
"value": true,
"points": 3,
"category": "편집",
"item": "문구 (…허리둘레를 복부(腹部)지방 측정하거나 전산화…)/\"복부지방\" / \"측정하거나\" 순서바꿈"
},
"2-33": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "성별 비만 인구수",
"value": "궁서체",
"points": 1,
"category": "표",
"item": "제목 문구 (성별 비만 인구수)/① 글씨체 (궁서체)"
},
"2-34": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "성별 비만 인구수",
"value": 1200,
"points": 1,
"category": "표",
"item": "제목 문구 (성별 비만 인구수)/② 크기 (12pt)"
},
"2-35": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/BOLD)",
"path2": null,
"searchValue": "성별 비만 인구수",
"value": true,
"points": 1,
"category": "표",
"item": "제목 문구 (성별 비만 인구수)/③ 진하게"
},
"2-36": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"path2": null,
"searchValue": "성별 비만 인구수",
"value": "Center",
"points": 1,
"category": "표",
"item": "제목 문구 (성별 비만 인구수)/④ 정렬 (가운데 정렬)"
},
"2-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='2']/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"searchValue": null,
"value": "5395143",
"points": 2,
"category": "표",
"item": "위쪽 제목 셀/① 색상(RGB:199,82,82)"
},
"2-38": {
"path": "boolean(//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]/BOLD)",
"path2": null,
"searchValue": null,
"value": true,
"points": 1,
"category": "표",
"item": "위쪽 제목 셀/② 진하게"
},
"2-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='2']/@BorderFill]/BOTTOMBORDER/@Type",
"searchValue": null,
"value": "DoubleSlim",
"points": 2,
"category": "표",
"item": "제목 셀 아래선/① 이중실선"
},
"2-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='2']/@BorderFill]/BOTTOMBORDER/@Width",
"searchValue": null,
"value": "0.5mm",
"points": 2,
"category": "표",
"item": "제목 셀 아래선/② 0.5mm"
},
"2-41": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": null,
"value": "한양중고딕",
"points": 1,
"category": "표",
"item": "글자모양/① 글씨체 (한양중고딕)"
},
"2-42": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": null,
"value": 1000,
"points": 1,
"category": "표",
"item": "글자모양/② 크기 (10pt)"
},
"2-43": {
"path": "//PARASHAPE[@Id=//TABLE/ROW/descendant::P/@ParaShape]/@Align",
"path2": null,
"searchValue": null,
"value": "Center",
"points": 1,
"category": "표",
"item": "글자모양/③ 정렬 (가운데 정렬)"
},
"2-44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[last()-1]//FIELDBEGIN[starts-with(@Command, '=SUM') and substring(@Command, string-length(@Command) - 2) = '145'] and //TABLE[1]/ROW[last()]/CELL[last()]//FIELDBEGIN[starts-with(@Command, '=SUM') and substring(@Command, string-length(@Command) - 2) = '105'])",
"path2": null,
"searchValue": null,
"value": true,
"points": 4,
"category": "표",
"item": "블록계산식/합계"
},
"2-45": {
"path": "boolean(//c:barChart[c:barDir[@val='bar'] and c:grouping[@val='clustered']])",
"path2": null,
"searchValue": null,
"value": true,
"points": 2,
"category": "chart_xml",
"item": "① 종류 (묶은가로막대형)"
},
"2-46": {
"path": "//c:valAx/c:majorTickMark/@val",
"path2": null,
"searchValue": null,
"value": "out",
"points": 2,
"category": "chart_xml",
"item": "② 값 축 주 눈금선"
},
"2-47": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]/descendant::SIZE/@Width",
"path2": null,
"searchValue": null,
"value": 22677,
"points": 2,
"category": "차트",
"item": "③ 크기-너비 (80mm)"
},
"2-48": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]/descendant::SIZE/@Height",
"path2": null,
"searchValue": null,
"value": 25512,
"points": 2,
"category": "차트",
"item": "④ 크기-높이 (90mm)"
},
"2-49": {
"path": "//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계'])",
"path2": null,
"searchValue": null,
"value": true,
"points": 2,
"category": "chart_xml",
"item": "⑤ 차트 데이터(표에서 블록계산식을 제외한 나머지 값만 이용)"
},
"2-50": {
"path": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"path2": null,
"searchValue": "성별 비만 인구수",
"value": "궁서",
"points": 1,
"category": "chart_xml",
"item": "제목 문구 (성별 비만 인구수)/① 글씨체 (궁서)"
},
"2-51": {
"path": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"path2": null,
"searchValue": "성별 비만 인구수",
"value": 1300,
"points": 1,
"category": "chart_xml",
"item": "제목 문구 (성별 비만 인구수)/② 크기 (13pt)"
},
"2-52": {
"path": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@b",
"path2": null,
"searchValue": "성별 비만 인구수",
"value": 1,
"points": 1,
"category": "chart_xml",
"item": "제목 문구 (성별 비만 인구수)/③ 진하게"
},
"2-53": {
"path": "//c:catAx//a:ea/@typeface",
"path2": null,
"searchValue": null,
"value": "굴림",
"points": 1,
"category": "chart_xml",
"item": "X축/① 글꼴 (굴림)"
},
"2-54": {
"path": "//c:catAx//a:defRPr/@sz",
"path2": null,
"searchValue": null,
"value": 900,
"points": 1,
"category": "chart_xml",
"item": "X축/② 크기 (9pt)"
},
"2-55": {
"path": "//c:catAx//a:defRPr/@i",
"path2": null,
"searchValue": null,
"value": 1,
"points": 1,
"category": "chart_xml",
"item": "X축/③ 기울임"
},
"2-56": {
"path": "//c:valAx//a:ea/@typeface",
"path2": null,
"searchValue": null,
"value": "굴림",
"points": 1,
"category": "chart_xml",
"item": "Y축/① 글꼴 (굴림)"
},
"2-57": {
"path": "//c:valAx//a:defRPr/@sz",
"path2": null,
"searchValue": null,
"value": 900,
"points": 1,
"category": "chart_xml",
"item": "Y축/② 크기 (9pt)"
},
"2-58": {
"path": "//c:valAx//a:defRPr/@i",
"path2": null,
"searchValue": null,
"value": 1,
"points": 1,
"category": "chart_xml",
"item": "Y축/③ 기울임"
},
"2-59": {
"path": "//c:legend//a:ea/@typeface",
"path2": null,
"searchValue": null,
"value": "굴림",
"points": 1,
"category": "chart_xml",
"item": "범례/① 글꼴 (굴림)"
},
"2-60": {
"path": "//c:legend//a:defRPr/@sz",
"path2": null,
"searchValue": null,
"value": 900,
"points": 1,
"category": "chart_xml",
"item": "범례/② 크기 (9pt)"
},
"2-61": {
"path": "//c:legend//a:defRPr/@i",
"path2": null,
"searchValue": null,
"value": 1,
"points": 1,
"category": "chart_xml",
"item": "범례/③ 기울임"
}
}

View File

@@ -0,0 +1,855 @@
{
"0-0": {
"path": "",
"path2": "",
"points": 0,
"category": "파일저장",
"item": "파일명 (수검번호.hwp/hwpx)"
},
"0-1": {
"path": "boolean(//PAGEMARGIN[(@Bottom='5668'or @Bottom='5669') and (@Footer='2834' or @Footer='2835') and @Gutter='0' and (@Header='2834' or @Header='2835') and (@Left='5668' or @Left='5669') and (@Right='5668' or @Right='5669') and (@Top='5668' or @Top='5669')])",
"path2": null,
"searchValue": null,
"value": true,
"points": 4,
"category": "용지설정",
"item": "A4용지, 왼쪽/오른쪽/위쪽/아래쪽 (각20mm), 머리말/꼬리말 (10mm), 제본(0mm)"
},
"0-2": {
"path": "boolean(//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE/FONTID/@Hangul]/@Name='바탕' and //CHARSHAPE/@Height='1000' and //PARASHAPE/PARAMARGIN/@LineSpacing='160' and //PARASHAPE/@Align='Justify')",
"path2": null,
"searchValue": null,
"value": true,
"points": 4,
"category": "기본설정",
"item": "글꼴 (바탕, 10pt), 양쪽정렬, 줄간격 (160%)"
},
"0-3": {
"path": "",
"path2": null,
"searchValue": null,
"value": null,
"points": 40,
"category": "오타감점",
"item": "오타 1개 -1점 / 2503회부터 오타 1개 -1점으로 변경"
},
"1-1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"path2": null,
"searchValue": "한옥마을사생대회안내",
"value": "궁서",
"points": 1,
"category": "글맵시",
"item": "문구 (한옥마을사생대회안내)/① 글씨체 (궁서)"
},
"1-2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"path2": null,
"searchValue": "한옥마을사생대회안내",
"value": "6072932",
"points": 2,
"category": "글맵시",
"item": "문구 (한옥마을사생대회안내)/② 채우기 : 색상(RGB:100,170,92)"
},
"1-3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"path2": null,
"searchValue": "한옥마을사생대회안내",
"value": 28346,
"points": 2,
"category": "글맵시",
"item": "문구 (한옥마을사생대회안내)/③ 크기-너비 (100mm)"
},
"1-4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"path2": null,
"searchValue": "한옥마을사생대회안내",
"value": 5669,
"points": 2,
"category": "글맵시",
"item": "문구 (한옥마을사생대회안내)/④ 크기-높이 (20mm)"
},
"1-5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"path2": null,
"searchValue": "한옥마을사생대회안내",
"value": "true",
"points": 2,
"category": "글맵시",
"item": "문구 (한옥마을사생대회안내)/⑤ 위치 (글자처럼 취급)"
},
"1-6": {
"path": "//PARASHAPE[@Id=//TEXTART[@Text='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"path2": null,
"searchValue": "한옥마을사생대회안내",
"value": "Center",
"points": 2,
"category": "글맵시",
"item": "문구 (한옥마을사생대회안내)/⑥ 정렬 (가운데 정렬)"
},
"1-7": {
"path": "boolean(//TEXTART[@Text='{searchValue}'])",
"path2": null,
"searchValue": "한옥마을사생대회안내",
"value": true,
"points": 2,
"category": "글맵시",
"item": "문구 (한옥마을사생대회안내)/⑦ 글맵시모양 (육안확인)"
},
"1-8": {
"path": "boolean(//RECTANGLE[.//CHAR[text()='자']][.//SIZE[(@Height >= 2600 and @Height <= 2800)and(@Width >= 2600 and @Width <= 2800)]])",
"path2": null,
"searchValue": null,
"value": true,
"points": 1,
"category": "문단첫글자장식",
"item": "자/① 모양 (2줄)"
},
"1-9": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TEXT[CHAR[text()='자']]/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": null,
"value": "맑은 고딕",
"points": 1,
"category": "문단첫글자장식",
"item": "자/② 글씨체 (맑은 고딕)"
},
"1-10": {
"path": "//RECTANGLE[.//CHAR[text()='자']]//WINDOWBRUSH/@FaceColor",
"path2": null,
"searchValue": null,
"value": "9537333",
"points": 2,
"category": "문단첫글자장식",
"item": "자/③ 면색 : 색상(RGB:53,135,145)"
},
"1-11": {
"path": "//RECTANGLE[.//CHAR[text()='자']]//OUTSIDEMARGIN/@Right",
"path2": null,
"searchValue": null,
"value": "850",
"points": 2,
"category": "문단첫글자장식",
"item": "자/④ 본문과의 간격 : 3.0mm"
},
"1-12": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[contains(text()[1],'{searchValue}')]/parent::TEXT/@CharShape][BOLD])",
"path2": null,
"searchValue": "한옥에 대한 체험과 교육이 준비된 사생대회",
"value": true,
"points": 2,
"category": "글꼴 속성",
"item": "문구 (한옥에 대한 체험과 교육이 준비된 사생대회)/① 진하게"
},
"1-13": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[contains(text()[1],'{searchValue}')]/parent::TEXT/@CharShape][UNDERLINE])",
"path2": null,
"searchValue": "한옥에 대한 체험과 교육이 준비된 사생대회",
"value": true,
"points": 2,
"category": "글꼴 속성",
"item": "문구 (한옥에 대한 체험과 교육이 준비된 사생대회)/② 밑줄"
},
"1-14": {
"path": "count(//CHAR[contains(text(),'■')]) + count(//CHAR[contains(text(),'※')])",
"path2": "string-length(//CHAR[contains(text(),'■')]) - string-length(translate(//CHAR[contains(text(),'■')], '■', '')) + string-length(//CHAR[contains(text(),'※')]) - string-length(translate(//CHAR[contains(text(),'※')], '※', ''))",
"searchValue": null,
"value": 3,
"points": 3,
"category": "특수문자",
"item": "① ■, ② ■, ③ ※"
},
"1-15": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "■ 행사안내 ■",
"value": "돋움",
"points": 1,
"category": "글꼴 속성",
"item": "문구 (■ 행사안내 ■)/① 글씨체 (돋움)"
},
"1-16": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"path2": null,
"searchValue": "■ 행사안내 ■",
"value": "Center",
"points": 1,
"category": "글꼴 속성",
"item": "문구 (■ 행사안내 ■)/② 정렬 (가운데 정렬)"
},
"1-17": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape][ITALIC])",
"path2": null,
"searchValue": "홈페이지(http://www.ihd.or.kr)에서 개별 신청, 선착순 접수",
"value": true,
"points": 1,
"category": "글꼴 속성",
"item": "문구 (홈페이지(http://www.ihd.or.kr)에서 개별 신청, 선착순 접수)/① 기울임"
},
"1-18": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape][UNDERLINE])",
"path2": null,
"searchValue": "홈페이지(http://www.ihd.or.kr)에서 개별 신청, 선착순 접수",
"value": true,
"points": 1,
"category": "글꼴 속성",
"item": "문구 (홈페이지(http://www.ihd.or.kr)에서 개별 신청, 선착순 접수)/② 밑줄"
},
"1-19": {
"path": "boolean(//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN/@Left=3000 and //PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN/@Indent=-2400)",
"path2": null,
"searchValue": "기타사항",
"value": true,
"points": 2,
"category": "문단모양",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (15pt), 내어쓰기 (12pt)"
},
"1-20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "2025. 03. 22.",
"value": 1300,
"points": 1,
"category": "글꼴 속성",
"item": "문구 (2025. 03. 22.)/① 크기 (13pt)"
},
"1-21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"path2": null,
"searchValue": "2025. 03. 22.",
"value": "Center",
"points": 1,
"category": "글꼴 속성",
"item": "문구 (2025. 03. 22.)/② 정렬 (가운데 정렬)"
},
"1-22": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "한국고건축협회",
"value": "궁서",
"points": 1,
"category": "글꼴 속성",
"item": "문구 (한국고건축협회)/① 글씨체 (궁서)"
},
"1-23": {
"path": "//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "한국고건축협회",
"value": 2400,
"points": 1,
"category": "글꼴 속성",
"item": "문구 (한국고건축협회)/② 크기 (24pt)"
},
"1-24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"path2": null,
"searchValue": "한국고건축협회",
"value": "Center",
"points": 1,
"category": "글꼴 속성",
"item": "문구 (한국고건축협회)/③ 정렬 (가운데 정렬)"
},
"1-25": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "DIAT",
"value": "굴림",
"points": 1,
"category": "머리말",
"item": "문구 (DIAT)/① 글꼴 (굴림)"
},
"1-26": {
"path": "//CHARSHAPE[@Id=//SECTION[1]//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "DIAT",
"value": 900,
"points": 1,
"category": "머리말",
"item": "문구 (DIAT)/② 크기 (9pt)"
},
"1-27": {
"path": "//PARASHAPE[@Id=//SECTION[1]//CHAR[text()='{searchValue}']/parent::TEXT/parent::P/@ParaShape]/@Align",
"path2": null,
"searchValue": "DIAT",
"value": "Right",
"points": 1,
"category": "머리말",
"item": "문구 (DIAT)/③ 정렬 (오른쪽 정렬)"
},
"1-28": {
"path": "//PAGENUM/@FormatType",
"path2": null,
"searchValue": null,
"value": "HangulSyllable",
"points": 2,
"category": "쪽번호",
"item": "① 쪽 번호 매기기 (가,나,다 순으로)"
},
"1-29": {
"path": "//PAGENUM/@Pos",
"path2": null,
"searchValue": null,
"value": "BottomCenter",
"points": 2,
"category": "쪽번호",
"item": "② 가운데 아래"
},
"1-30": {
"path": "not(//PARASHAPE[@Id=//SECTION[1]/P/@ParaShape]/PARAMARGIN[@LineSpacing!='180'])",
"path2": null,
"searchValue": null,
"value": true,
"points": 2,
"category": "줄간격",
"item": "문제 1 줄간격 180% 설정"
},
"2-01": {
"path": "boolean(//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@HeaderInside='true' and //BORDERFILL[@Id=//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@BorferFill]/*[contains(local-name(), 'BORDER')]/@Type='DoubleSlim')",
"path2": null,
"searchValue": null,
"value": true,
"points": 4,
"category": "쪽 테두리",
"item": "문제2 쪽테두리(이중 실선, 머리말 포함) 설정"
},
"2-02": {
"path": "count(//SECTION)>1",
"path2": null,
"searchValue": null,
"value": true,
"points": 3,
"category": "다단",
"item": "① 구역나누기"
},
"2-03": {
"path": "//COLDEF/@Count>1",
"path2": null,
"searchValue": null,
"value": true,
"points": 3,
"category": "다단",
"item": "② 다단 2단"
},
"2-04": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"path2": null,
"searchValue": "한옥의 형태와 구조",
"value": 19842,
"points": 2,
"category": "글상자",
"item": "문구 (한옥의 형태와 구조)/① 크기-너비 (70mm)"
},
"2-05": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"path2": null,
"searchValue": "한옥의 형태와 구조",
"value": 3401,
"points": 2,
"category": "글상자",
"item": "문구 (한옥의 형태와 구조)/② 크기-높이 (12mm)"
},
"2-06": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/descendant::LINESHAPE/@Style",
"path2": null,
"searchValue": "한옥의 형태와 구조",
"value": "DoubleSlim",
"points": 2,
"category": "글상자",
"item": "문구 (한옥의 형태와 구조)/③ 테두리 (이중실선(1.00mm))"
},
"2-07": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/@Ratio",
"path2": null,
"searchValue": "한옥의 형태와 구조",
"value": 20,
"points": 2,
"category": "글상자",
"item": "문구 (한옥의 형태와 구조)/④ 글상자 모서리 (둥근 모양)"
},
"2-08": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/descendant::WINDOWBRUSH/@FaceColor",
"path2": null,
"searchValue": "한옥의 형태와 구조",
"value": "12704995",
"points": 2,
"category": "글상자",
"item": "문구 (한옥의 형태와 구조)/⑤ 채우기 : 색상(RGB:227,220,193)"
},
"2-09": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/POSITION/@TreatAsChar",
"path2": null,
"searchValue": "한옥의 형태와 구조",
"value": "true",
"points": 1,
"category": "글상자",
"item": "문구 (한옥의 형태와 구조)/⑥ 글상자 위치 (글자처럼 취급)"
},
"2-10": {
"path": "//PARASHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::P[last()]/@ParaShape]/@Align",
"path2": null,
"searchValue": "한옥의 형태와 구조",
"value": "Center",
"points": 1,
"category": "글상자",
"item": "문구 (한옥의 형태와 구조)/⑦ 글상자 정렬 (가운데 정렬)"
},
"2-11": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "한옥의 형태와 구조",
"value": "한양견고딕",
"points": 1,
"category": "글상자",
"item": "문구 (한옥의 형태와 구조)/⑧ 글씨체 (견고딕)"
},
"2-12": {
"path": "boolean(//CHARSHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/@Height='2000')",
"path2": null,
"searchValue": "한옥의 형태와 구조",
"value": true,
"points": 1,
"category": "글상자",
"item": "문구 (한옥의 형태와 구조)/⑨ 글씨크기 (20pt)"
},
"2-13": {
"path": "//PARASHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::P[1]/@ParaShape]/@Align",
"path2": null,
"searchValue": "한옥의 형태와 구조",
"value": "Center",
"points": 1,
"category": "글상자",
"item": "문구 (한옥의 형태와 구조)/⑩ 정렬 (가운데 정렬)"
},
"2-14": {
"path": "boolean(//PICTURE/descendant::SHAPECOMMENT[contains(text(),'{searchValue}')])",
"path2": null,
"searchValue": "원본 그림의 이름: 그림",
"value": true,
"points": 2,
"category": "그림삽입",
"item": "① 파일명 \"그림C.jpg\" 삽입"
},
"2-15": {
"path": "//IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]/preceding-sibling::SHAPEOBJECT/SIZE/@Width",
"path2": null,
"searchValue": null,
"value": 24094,
"points": 2,
"category": "그림삽입",
"item": "② 크기-너비 (85mm)"
},
"2-16": {
"path": "//IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]/preceding-sibling::SHAPEOBJECT/SIZE/@Height",
"path2": null,
"searchValue": null,
"value": 11338,
"points": 2,
"category": "그림삽입",
"item": "③ 크기-높이 (40mm)"
},
"2-17": {
"path": "//IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]/preceding-sibling::SHAPEOBJECT/POSITION/@HorzOffset",
"path2": null,
"searchValue": null,
"value": 0,
"points": 2,
"category": "그림삽입",
"item": "④ 위치 (어울림 : 가로-쪽의 왼쪽 0.0mm)"
},
"2-18": {
"path": "//IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]/preceding-sibling::SHAPEOBJECT/POSITION/@VertOffset",
"path2": null,
"searchValue": null,
"value": 6236,
"points": 2,
"category": "그림삽입",
"item": "⑤ 위치 (어울림 : 세로-쪽의 위 22mm)"
},
"2-19": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "1. 한옥",
"value": "돋움",
"points": 1,
"category": "속성",
"item": "문구① (1. 한옥)/① 글씨체 (돋움)"
},
"2-20": {
"path": "//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "1. 한옥",
"value": 1200,
"points": 1,
"category": "속성",
"item": "문구① (1. 한옥)/② 크기 (12pt)"
},
"2-21": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/BOLD)",
"path2": null,
"searchValue": "1. 한옥",
"value": true,
"points": 1,
"category": "속성",
"item": "문구① (1. 한옥)/③ 진하게"
},
"2-22": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "2. 한옥의 형태와 구조",
"value": "돋움",
"points": 1,
"category": "속성",
"item": "문구② (2. 한옥의 형태와 구조)/① 글씨체 (돋움)"
},
"2-23": {
"path": "//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "2. 한옥의 형태와 구조",
"value": 1200,
"points": 1,
"category": "속성",
"item": "문구② (2. 한옥의 형태와 구조)/② 크기 (12pt)"
},
"2-24": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/BOLD)",
"path2": null,
"searchValue": "2. 한옥의 형태와 구조",
"value": true,
"points": 1,
"category": "속성",
"item": "문구② (2. 한옥의 형태와 구조)/③ 진하게"
},
"2-25": {
"path":"boolean(//CHAR[contains(text(),'기초')]/ancestor::TEXT/FOOTNOTE/descendant::CHAR)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('기초') + 1) = '기초']/following-sibling::FOOTNOTE/descendant::CHAR)",
"searchValue": null,
"value": true,
"points": 2,
"category": "각주",
"item": "문구 (기초)/① 각주 설정 및 문구 입력"
},
"2-26": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "기둥의 침하를 방지하기 위한 지반의 보강 및 개량",
"value": "한양중고딕",
"points": 1,
"category": "각주",
"item": "문구 (기초)/② 글씨체 (중고딕)"
},
"2-27": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "기둥의 침하를 방지하기 위한 지반의 보강 및 개량",
"value": 900,
"points": 1,
"category": "각주",
"item": "문구 (기초)/③ 크기 (9pt)"
},
"2-28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"path2": null,
"searchValue": " 기둥의 침하를 방지하기 위한 지반의 보강 및 개량",
"value": "CircledDigit",
"points": 2,
"category": "각주",
"item": "문구 (기초)/④ 각주 번호모양"
},
"2-29": {
"path": "boolean(//CHAR[contains(text(),'cornerstone')])",
"path2": null,
"searchValue": null,
"value": true,
"points": 3,
"category": "",
"item": "cornerstone/영단어 미입력, 대소문자/오타 시 전체 감점"
},
"2-30": {
"path": "(count(//CHAR[contains(text(),'한옥')][contains(text(),'韓屋')])+count(//CHAR[contains(text(),'사계절')][contains(text(),'四季節')])+count(//CHAR[contains(text(),'거주')][contains(text(),'居住')])+count(//CHAR[contains(text(),'구조')][contains(text(),'構造')])+count(//CHAR[contains(text(),'골격')][contains(text(),'骨格')]))*2",
"path2": null,
"searchValue": null,
"value": 10,
"points": 10,
"category": "한자",
"item": "① 한옥(韓屋), ② 사계절(四季節), ③거주(居住), ④ 구조(構造), ⑤ 골격(骨格)"
},
"2-31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'철의추운')])",
"path2": null,
"searchValue": null,
"value": true,
"points": 3,
"category": "편집",
"item": "문구 (…더운 날씨와 겨울철이 추운…)/\"이\" → \"의\" 글자바꿈"
},
"2-32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'돌과마루')])",
"path2": null,
"searchValue": null,
"value": true,
"points": 3,
"category": "편집",
"item": "문구 (…대비해 마루를 온돌과 갖고…)/\"마루를\" / \"온돌과\" 순서바꿈"
},
"2-33": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": "교육기관별 참가인원",
"value": "궁서",
"points": 1,
"category": "표",
"item": "제목 문구 (교육기관별 참가인원)/① 글씨체 (궁서)"
},
"2-34": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": "교육기관별 참가인원",
"value": 1200,
"points": 1,
"category": "표",
"item": "제목 문구 (교육기관별 참가인원)/② 크기 (12pt)"
},
"2-35": {
"path": "boolean(//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/BOLD)",
"path2": null,
"searchValue": "교육기관별 참가인원",
"value": true,
"points": 1,
"category": "표",
"item": "제목 문구 (교육기관별 참가인원)/③ 진하게"
},
"2-36": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"path2": null,
"searchValue": "교육기관별 참가인원",
"value": "Center",
"points": 1,
"category": "표",
"item": "제목 문구 (교육기관별 참가인원)/④ 정렬 (가운데 정렬)"
},
"2-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='2']/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"searchValue": null,
"value": "15616893",
"points": 2,
"category": "표",
"item": "위쪽 제목 셀/① 색상(RGB:125,75,238)"
},
"2-38": {
"path": "boolean(//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]/BOLD)",
"path2": null,
"searchValue": null,
"value": true,
"points": 1,
"category": "표",
"item": "위쪽 제목 셀/② 진하게"
},
"2-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='2']/@BorderFill]/BOTTOMBORDER/@Type",
"searchValue": null,
"value": "DoubleSlim",
"points": 2,
"category": "표",
"item": "제목 셀 아래선/① 이중실선"
},
"2-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='2']/@BorderFill]/BOTTOMBORDER/@Width",
"searchValue": null,
"value": "0.5mm",
"points": 2,
"category": "표",
"item": "제목 셀 아래선/② 0.5mm"
},
"2-41": {
"path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"path2": null,
"searchValue": null,
"value": "굴림",
"points": 1,
"category": "표",
"item": "글자모양/① 글씨체 (굴림)"
},
"2-42": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/@Height",
"path2": null,
"searchValue": null,
"value": 1000,
"points": 1,
"category": "표",
"item": "글자모양/② 크기 (10pt)"
},
"2-43": {
"path": "//PARASHAPE[@Id=//TABLE/ROW/descendant::P/@ParaShape]/@Align",
"path2": null,
"searchValue": null,
"value": "Center",
"points": 1,
"category": "표",
"item": "글자모양/③ 정렬 (가운데 정렬)"
},
"2-44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[last()-1]//FIELDBEGIN[starts-with(@Command, '=SUM') and substring(@Command, string-length(@Command) - 2) = '110'] and //TABLE[1]/ROW[last()]/CELL[last()]//FIELDBEGIN[starts-with(@Command, '=SUM') and substring(@Command, string-length(@Command) - 2) = '220'])",
"path2": null,
"searchValue": null,
"value": true,
"points": 4,
"category": "표",
"item": "블록계산식/합계"
},
"2-45": {
"path": "//c:lineChart/c:grouping/@val='standard'",
"path2": null,
"searchValue": null,
"value": true,
"points": 2,
"category": "chart_xml",
"item": "① 종류 (꺾은선형)"
},
"2-46": {
"path": "//c:valAx/c:majorTickMark/@val",
"path2": null,
"searchValue": null,
"value": "out",
"points": 2,
"category": "chart_xml",
"item": "② 값 축 주 눈금선"
},
"2-47": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]/descendant::SIZE/@Width",
"path2": null,
"searchValue": null,
"value": 22677,
"points": 2,
"category": "차트",
"item": "③ 크기-너비 (80mm)"
},
"2-48": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]/descendant::SIZE/@Height",
"path2": null,
"searchValue": null,
"value": 25511,
"points": 2,
"category": "차트",
"item": "④ 크기-높이 (90mm)"
},
"2-49": {
"path": "//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계'])",
"path2": null,
"searchValue": null,
"value": true,
"points": 2,
"category": "chart_xml",
"item": "⑤ 차트 데이터(표에서 블록계산식을 제외한 나머지 값만 이용)"
},
"2-50": {
"path": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"path2": null,
"searchValue": "교육기관별 참가인원",
"value": "굴림체",
"points": 1,
"category": "chart_xml",
"item": "제목 문구 (교육기관별 참가인원)/① 글씨체 (굴림체)"
},
"2-51": {
"path": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"path2": null,
"searchValue": "교육기관별 참가인원",
"value": 1300,
"points": 1,
"category": "chart_xml",
"item": "제목 문구 (교육기관별 참가인원)/② 크기 (13pt)"
},
"2-52": {
"path": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@b",
"path2": null,
"searchValue": "교육기관별 참가인원",
"value": 1,
"points": 1,
"category": "chart_xml",
"item": "제목 문구 (교육기관별 참가인원)/③ 진하게"
},
"2-53": {
"path": "//c:catAx//a:ea/@typeface",
"path2": null,
"searchValue": null,
"value": "굴림",
"points": 1,
"category": "chart_xml",
"item": "X축/① 글꼴 (굴림)"
},
"2-54": {
"path": "//c:catAx//a:defRPr/@sz",
"path2": null,
"searchValue": null,
"value": 900,
"points": 1,
"category": "chart_xml",
"item": "X축/② 크기 (9pt)"
},
"2-55": {
"path": "//c:catAx//a:defRPr/@i",
"path2": null,
"searchValue": null,
"value": 1,
"points": 1,
"category": "chart_xml",
"item": "X축/③ 기울임"
},
"2-56": {
"path": "//c:valAx//a:ea/@typeface",
"path2": null,
"searchValue": null,
"value": "굴림",
"points": 1,
"category": "chart_xml",
"item": "Y축/① 글꼴 (굴림)"
},
"2-57": {
"path": "//c:valAx//a:defRPr/@sz",
"path2": null,
"searchValue": null,
"value": 900,
"points": 1,
"category": "chart_xml",
"item": "Y축/② 크기 (9pt)"
},
"2-58": {
"path": "//c:valAx//a:defRPr/@i",
"path2": null,
"searchValue": null,
"value": 1,
"points": 1,
"category": "chart_xml",
"item": "Y축/③ 기울임"
},
"2-59": {
"path": "//c:legend//a:ea/@typeface",
"path2": null,
"searchValue": null,
"value": "굴림",
"points": 1,
"category": "chart_xml",
"item": "범례/① 글꼴 (굴림)"
},
"2-60": {
"path": "//c:legend//a:defRPr/@sz",
"path2": null,
"searchValue": null,
"value": 900,
"points": 1,
"category": "chart_xml",
"item": "범례/② 크기 (9pt)"
},
"2-61": {
"path": "//c:legend//a:defRPr/@i",
"path2": null,
"searchValue": null,
"value": 1,
"points": 1,
"category": "chart_xml",
"item": "범례/③ 기울임"
}
}