diff --git a/.gitignore b/.gitignore index 4d9a581..39a8442 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +_old_excel_files/ output/ input/ *.xlsx diff --git a/hwp_conversion.log b/hwp_conversion.log index 6ef4591..f21066d 100644 --- a/hwp_conversion.log +++ b/hwp_conversion.log @@ -1532,3 +1532,11 @@ 2025-01-18 17:33:15,690 - INFO - 변환 성공: 워드(한글)-005686-홍유하.hwp -> 워드(한글)-005686-홍유하.hml 2025-01-18 17:33:15,916 - INFO - 변환 성공: 워드(한글)-005687-강태원.hwp -> 워드(한글)-005687-강태원.hml 2025-01-18 17:33:16,364 - INFO - 변환 성공: 워드(한글)-005688-정지예.hwp -> 워드(한글)-005688-정지예.hml +2025-01-20 14:32:03,574 - INFO - 변환 성공: 워드(한글)-005172-김서인.hwp -> 워드(한글)-005172-김서인.hml +2025-01-20 14:32:03,980 - INFO - 변환 성공: 워드(한글)-005174-지율.hwp -> 워드(한글)-005174-지율.hml +2025-01-20 14:32:04,227 - INFO - 변환 성공: 워드(한글)-005175-문지환.hwp -> 워드(한글)-005175-문지환.hml +2025-01-20 14:32:04,561 - INFO - 변환 성공: 워드(한글)-005176-이세영.hwp -> 워드(한글)-005176-이세영.hml +2025-01-20 14:32:04,881 - INFO - 변환 성공: 워드(한글)-005177-김은유.hwp -> 워드(한글)-005177-김은유.hml +2025-01-20 14:32:05,103 - INFO - 변환 성공: 워드(한글)-005179-손민준.hwp -> 워드(한글)-005179-손민준.hml +2025-01-20 14:32:05,346 - INFO - 변환 성공: 워드(한글)-005180-도정원.hwp -> 워드(한글)-005180-도정원.hml +2025-01-20 14:32:07,797 - INFO - 변환 성공: 정답.hwp -> 정답.hml diff --git a/score5.py b/score5.py index 8411eaf..14b0e88 100644 --- a/score5.py +++ b/score5.py @@ -15,6 +15,12 @@ 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): @@ -37,9 +43,7 @@ class XMLScorer: return result else: return result - # result = root.xpath(second_xpath) - # print(f'result : {result}') - # return result + except ET.XPathEvalError as e: return None else: @@ -141,6 +145,7 @@ class XMLScorer: previous_first_digit = first_digit + id = criterion_id xpath = criterion['path'] xpath2 = criterion['path2'] search_value = criterion['searchValue'] @@ -190,16 +195,19 @@ class XMLScorer: actual_answer = int(result[0]) else: actual_answer = result[0] - + + if "오타감점" in category: + points = self.get_typo_score() + scoring = { + 'id': id, 'category': category, # 채점 분류 'item': item, # 채점 항목 'right_answer': right_answer, # 정답 'actual_answer': actual_answer, # 실제 작성 답안 - 'points': 0, + 'points': points, 'deductions': [] # 각 기준별 감점 내역 } - scoring['points'] = points # 점수 차감 조건 # 1. 정답이 실수형으로 반환받은 경우는 채점항목의 부분점수 합산 결과이므로 @@ -210,8 +218,8 @@ class XMLScorer: scoring['points'] = actual_answer elif type(actual_answer) is int: - # 오차범위 5 이상이면 감점 - if abs(actual_answer - right_answer) > 5: + # 오차범위 3 이상이면 감점 + if abs(actual_answer - right_answer) > 3: scoring['points'] -= points else: # right_answer(JSON파일 내 valuer값) null일 경우 점수감점 없이 진행 @@ -244,8 +252,6 @@ class XMLScorer: } def binary_to_chartxml(self, xml_path): - - print(f'binary_to_chartxml {xml_path}') tree = ET.parse(xml_path) root = tree.getroot() @@ -344,24 +350,25 @@ class XMLScorer: # result_diff 배열의 길이를 맨 앞에 저장 temp = 40 - min(len(result_diff)*2, 40) + self.set_typo_score(temp) + result_diff.insert(0, temp) return result_diff # XML 파일 채점 def score_directory(self, xml_directory, answer_path): - # xml 파일 불러오기 xml_files = Path(xml_directory).glob('*.hml') # 결과 저장할 리스트 results = [] - for xml_file in xml_files: result = {} chart_xml = self.binary_to_chartxml(xml_file) - result['score'] = self._score_xml_file(xml_file, chart_xml) result['typo'] = self.typo_check(answer_path, xml_file) + result['score'] = self._score_xml_file(xml_file, chart_xml) + # result['score']['score_results'][2]['points'] = result['typo'][0] results.append(result) return results @@ -373,6 +380,7 @@ class XMLScorer: number = match.group(1) name = match.group(2) return number, name + return None, None def export_to_excel(self, results, output_path=None): @@ -405,29 +413,46 @@ class XMLScorer: else: detail_row = {'채점항목':f"{number}-{name}"} - for i, scoring in enumerate(result['score_results']): - # detail_row[scoring['item']] = scoring['points'] - detail_row[f'{i+1}'] = scoring['points'] + section_num = None + partial_idx = 0 + for i, score_result in enumerate(result['score_results']): + current_section = int(score_result['id'].split('-')[0]) + if section_num is None: + section_num = current_section + + if current_section != section_num: + # 이전 섹션의 부분합을 출력 + detail_row[f'[{section_num}]합계'] = result['partial_scores'][partial_idx]['score'] + partial_idx += 1 + section_num = current_section + + detail_row[f'{i+1}'] = score_result['points'] + + # 마지막 섹션의 부분합을 출력 + if section_num is not None and partial_idx < len(result['partial_scores']): + detail_row[f'[{section_num}]합계'] = result['partial_scores'][partial_idx]['score'] detail_row['총점'] = result.get('total_score', 0) detail_data.append(detail_row) summary_df = pd.DataFrame(summary_data) detail_df = pd.DataFrame(detail_data).transpose() - + # detail_df = pd.DataFrame(detail_data) for temp in results: result = temp['typo'] typo_data.append(result) - type_df = pd.DataFrame(typo_data).transpose() + typo_df = pd.DataFrame(typo_data).transpose() # detail_df = pd.DataFrame(detail_data) + # detail_df.iloc[3] = typo_df.iloc[0] + # 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=False) - type_df.to_excel(writer, sheet_name='오타내역', index=False) + typo_df.to_excel(writer, sheet_name='오타내역', index=False) # 열 너비 자동 조정 # for sheet_name in writer.sheets: diff --git a/scoring_criteria_2501.json b/scoring_criteria_2501.json new file mode 100644 index 0000000..b5f72cb --- /dev/null +++ b/scoring_criteria_2501.json @@ -0,0 +1,749 @@ +{ + "0-01":{ + "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-02":{ + "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-03":{ + "path":"", + "path2": null, + "searchValue": null, + "value":null, + "points": 40, + "category": "오타감점", + "item": "오타 1개 -2점" + }, + "1-01":{ + "path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName", + "path2": null, + "searchValue": "전통주페어링특강안내", + "value": "휴먼옛체", + "points": 2, + "category": "글맵시", + "item":"문구 (전통주페어링특강안내)/① 글씨체 : 휴먼옛체" + }, + "1-02": { + "path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor", + "path2": null, + "searchValue": "전통주페어링특강안내", + "value": "7246108", + "points": 2, + "category": "글맵시", + "item":"문구 (전통주페어링특강안내)/② 채우기 : 색상(RGB:28,145,110)" + }, + "1-03": { + "path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width", + "path2": null, + "searchValue": "전통주페어링특강안내", + "value": 22677, + "points": 2, + "category": "글맵시", + "item":"문구 (전통주페어링특강안내)/③ 크기 : 너비(80mm)" + }, + "1-04": { + "path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height", + "path2": null, + "searchValue": "전통주페어링특강안내", + "value": 5669, + "points": 2, + "category": "글맵시", + "item":"문구 (전통주페어링특강안내)/④ 크기 : 높이(20mm)" + }, + "1-05": { + "path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar", + "path2": null, + "searchValue": "전통주페어링특강안내", + "value": "true", + "points": 2, + "category": "글맵시", + "item":"문구 (전통주페어링특강안내)/⑤ 위치 (글자처럼 취급)" + }, + "1-06": { + "path": "//PARASHAPE[@Id=//TEXTART[@Text='{searchValue}']/ancestor::P/@ParaShape]/@Align", + "path2": null, + "searchValue": "전통주페어링특강안내", + "value": "Center", + "points": 2, + "category": "글맵시", + "item":"문구 (전통주페어링특강안내)/⑥ 정렬 (가운데 정렬)" + }, + "1-07":{ + "path": "", + "path2": null, + "searchValue": "전통주페어링특강안내", + "value": null, + "points": 2, + "category": "글맵시", + "item":"문구 (전통주페어링특강안내)/⑦ 글맵시모양 (육안확인)" + }, + "1-08": { + "path": "boolean(//CHARSHAPE[@Id=//CHAR[contains(text()[1],'{searchValue}')]/parent::TEXT/@CharShape][BOLD])", + "path2": null, + "searchValue": "혼술, 홈술, 집술", + "value": true, + "points": 2, + "category": "글꼴속성", + "item":"문구 (혼술, 홈술, 집술)/진하게" + }, + "1-09": { + "path": "boolean(//CHARSHAPE[@Id=//CHAR[contains(text()[1],'{searchValue}')]/parent::TEXT/@CharShape][UNDERLINE])", + "path2": null, + "searchValue": "혼술, 홈술, 집술", + "value": true, + "points": 2, + "category": "글꼴속성", + "item":"문구 (혼술, 홈술, 집술)/밑줄" + }, + "1-10": { + "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.0, + "points": 3, + "category": "특수문자", + "item":"① ★, ② ★, ③ ※" + }, + "1-11": { + "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-12": { + "path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align", + "path2": null, + "searchValue": "행사안내", + "value": "Center", + "points": 1, + "category": "글꼴 속성", + "item":"문구 (행사안내)/② 정렬 (가운데 정렬)" + }, + "1-13": { + "path": "boolean(//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape][BOLD])", + "path2": null, + "searchValue": "2025년 2월 2일(일) 18:00까지 온라인으로 등록", + "value": true, + "points": 1, + "category": "글꼴 속성", + "item":"문구 (2025년 2월 2일(일) 18:00까지 온라인으로 등록)/① 진하게" + }, + "1-14": { + "path": "boolean(//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape][ITALIC])", + "path2": null, + "searchValue": "2025년 2월 2일(일) 18:00까지 온라인으로 등록", + "value": true, + "points": 1, + "category": "글꼴 속성", + "item":"문구 (2025년 2월 2일(일) 18:00까지 온라인으로 등록)/② 기울임" + }, + "1-15": { + "path": "boolean(//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN/@Left=2000 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":"문구 (※ 기타… 이하 문단)/왼쪽여백 (10pt), 내어쓰기 (12pt)" + }, + "1-16": { + "path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height", + "path2": null, + "searchValue": "2025. 1. 15.", + "value": 1300, + "points": 2, + "category": "글꼴 속성", + "item":"문구 (2025. 1. 15.)/① 크기 (13pt)" + }, + "1-17": { + "path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align", + "path2": null, + "searchValue": "2025. 1. 15.", + "value": "Center", + "points": 1, + "category": "글꼴 속성", + "item":"문구 (2025. 1. 15.)/② 정렬 (가운데 정렬)" + }, + "1-18": { + "path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name", + "path2": null, + "searchValue": "대한민국전통주살리기협회", + "value": "궁서체", + "points": 2, + "category": "글꼴 속성", + "item":"문구 (대한민국전통주살리기협회)/① 글씨체 (궁서체)" + }, + "1-19": { + "path": "//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/@Height", + "path2": null, + "searchValue": "대한민국전통주살리기협회", + "value": 2700, + "points": 2, + "category": "글꼴 속성", + "item":"문구 (대한민국전통주살리기협회)/② 크기 (27pt)" + }, + "1-20": { + "path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align", + "path2": null, + "searchValue": "대한민국전통주살리기협회", + "value": "Center", + "points": 2, + "category": "글꼴 속성", + "item":"문구 (대한민국전통주살리기협회)/정렬 (가운데 정렬)" + }, + "1-21": { + "path": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name", + "path2": null, + "searchValue": "DIAT", + "value": "굴림", + "points": 2, + "category": "머리말", + "item":"문구 (DIAT)/① 글꼴 (굴림)" + }, + "1-22": { + "path": "//CHARSHAPE[@Id=//SECTION[1]//CHAR[text()='{searchValue}']/parent::TEXT/@CharShape]/@Height", + "path2": null, + "searchValue": "DIAT", + "value": 900, + "points": 2, + "category": "머리말", + "item":"문구 (DIAT)/② 크기 (9pt)" + }, + "1-23": { + "path": "//PARASHAPE[@Id=//SECTION[1]//CHAR[text()='{searchValue}']/parent::TEXT/parent::P/@ParaShape]/@Align", + "path2": null, + "searchValue": "DIAT", + "value": "Right", + "points": 2, + "category": "머리말", + "item":"문구 (DIAT)/③ 정렬 (오른쪽 정렬)" + }, + "1-24": { + "path": "//SECTION[1]//PAGENUM/@FormatType", + "path2": null, + "searchValue": null, + "value": "HangulSyllable", + "points": 2, + "category": "쪽번호", + "item":"① 쪽 번호 매기기 (가,나,다 순으로)" + }, + "1-25": { + "path": "//SECTION[1]//PAGENUM/@Pos", + "path2": null, + "searchValue": null, + "value": "BottomCenter", + "points": 2, + "category": "쪽번호", + "item":"② 가운데 아래" + }, + "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-02":{ + "path":"count(//SECTION)>1 or (//P/@PageBreak='true')", + "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":14173, + "points": 1, + "category": "글상자", + "item": "문구 (한국의 전통주)/① 크기-너비 (50mm)" + }, + "2-05":{ + "path":"//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Height", + "path2": null, + "searchValue": "한국의 전통주", + "value":3402, + "points": 1, + "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>0", + "path2": null, + "searchValue": "한국의 전통주", + "value":true, + "points": 1, + "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='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": "① 파일명 \"그림B.jpg\" 삽입" + }, + "2-15":{ + "path":"//IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]/preceding-sibling::SHAPEOBJECT/SIZE/@Width", + "path2": null, + "searchValue": null, + "value":8503, + "points": 2, + "category": "그림삽입", + "item": "② 크기-너비 (30mm)" + }, + "2-16":{ + "path":"//IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]/preceding-sibling::SHAPEOBJECT/SIZE/@Height", + "path2": null, + "searchValue": null, + "value":8503, + "points": 2, + "category": "그림삽입", + "item": "③ 크기-높이 (30mm)" + }, + "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":6800, + "points": 2, + "category": "그림삽입", + "item": "⑤ 위치 (어울림 : 세로-쪽의 위 24mm)" + }, + "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(),'MZ세대')]/following-sibling::FOOTNOTE/descendant::CHAR[contains(text(),'밀레니얼 세대와 Z세대를 통틀어 지칭하는 신조어')])", + "path2": null, + "searchValue": null, + "value":true, + "points": 3, + "category": "각주", + "item": "문구 (MZ세대)/① 문구입력" + }, + "2-26":{ + "path":"//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/FONTID/@Hangul]/@Name", + "path2": null, + "searchValue": "밀레니얼 세대와 Z세대를 통틀어 지칭하는 신조어", + "value": "굴림", + "points": 2, + "category": "", + "item": "문구 (MZ세대)/② 글씨체 (굴림)" + }, + "2-27":{ + "path":"//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height", + "path2": null, + "searchValue": "밀레니얼 세대와 Z세대를 통틀어 지칭하는 신조어", + "value":900, + "points": 2, + "category": "", + "item": "문구 (MZ세대)/③ 크기 (9pt)" + }, + "2-28":{ + "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-29":{ + "path":"boolean(//CHAR[contains(text(),'도 막')])", + "path2": null, + "searchValue": null, + "value":true, + "points": 2, + "category": "편집", + "item": "문구 (…문인(文人)들의 문집에토 막걸리로…)/\"토\" → \"도\" 글자바꿈" + }, + "2-30":{ + "path":"boolean(//CHAR[contains(text(),'하는 문')])", + "path2": null, + "searchValue": null, + "value":true, + "points": 2, + "category": "편집", + "item": "문구 (…마시고 문화에서 취하는 술의 맛과…)/\"문화에서\" / \"취하는\" 순서바꿈" + }, + "2-31":{ + "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-32":{ + "path":"//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height", + "path2": null, + "searchValue": "월평균 주종별 음주(단위:%)", + "value": 1200, + "points": 1, + "category": "표", + "item": "제목 문구 (월평균 주종별 음주(단위:%))/② 크기 (12pt)" + }, + "2-33":{ + "path":"boolean(//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/BOLD)", + "path2": null, + "searchValue": "월평균 주종별 음주(단위:%)", + "value":true, + "points": 1, + "category": "표", + "item": "제목 문구 (월평균 주종별 음주(단위:%))/③ 진하게" + }, + "2-34":{ + "path":"//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align", + "path2": null, + "searchValue": "월평균 주종별 음주(단위:%)", + "value": "Center", + "points": 1, + "category": "표", + "item": "제목 문구 (월평균 주종별 음주(단위:%))/④ 정렬 (가운데 정렬)" + }, + "2-35":{ + "path":"//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor", + "path2": null, + "searchValue": null, + "value": "10966730", + "points": 2, + "category": "표", + "item": "위쪽 제목 셀/① 색상(RGB:202,86,167)" + }, + "2-36":{ + "path":"boolean(//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]/BOLD)", + "path2": null, + "searchValue": null, + "value":true, + "points": 2, + "category": "표", + "item": "위쪽 제목 셀/② 진하게" + }, + "2-37":{ + "path":"boolean(//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER[@Type='DoubleSlim' and @Width='0.5mm'])", + "path2": null, + "searchValue": null, + "value":true, + "points": 2, + "category": "표", + "item": "제목 셀 아래선/이중실선 (0.5mm)" + }, + "2-38":{ + "path":"//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name", + "path2": null, + "searchValue": null, + "value":"한양중고딕", + "points": 2, + "category": "표", + "item": "글자모양/① 글씨체 (중고딕)" + }, + "2-39":{ + "path":"//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/@Height", + "path2": null, + "searchValue": null, + "value":1000, + "points": 2, + "category": "표", + "item": "글자모양/② 크기 (10pt)" + }, + "2-40":{ + "path":"//PARASHAPE[@Id=//TABLE/ROW/descendant::P/@ParaShape]/@Align", + "path2": null, + "searchValue": null, + "value":"Center", + "points": 2, + "category": "표", + "item": "글자모양/③ 정렬 (가운데 정렬)" + }, + "2-41":{ + "path":"//c:lineChart/c:grouping/@val", + "path2": null, + "searchValue": null, + "value": "standard", + "points": 3, + "category": "chart_xml", + "item": "① 종류 (꺾은선형)" + }, + "2-42":{ + "path":"//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]/descendant::SIZE/@Width", + "path2": null, + "searchValue": null, + "value":22677, + "points": 2, + "category": "차트", + "item": "② 크기-너비 (80mm)" + }, + "2-43":{ + "path":"//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]/descendant::SIZE/@Height", + "path2": null, + "searchValue": null, + "value":22677, + "points": 2, + "category": "차트", + "item": "③ 크기-높이 (80mm)" + }, + "2-44":{ + "path":"//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface", + "path2": null, + "searchValue": "월평균 주종별 음주", + "value": "궁서체", + "points": 2, + "category": "chart_xml", + "item": "제목 문구 (\"월평균 주종별 음주\")/① 글씨체 (궁서체)" + }, + "2-45":{ + "path":"//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz", + "path2": null, + "searchValue": "월평균 주종별 음주", + "value": 1300, + "points": 2, + "category": "chart_xml", + "item": "제목 문구 (\"월평균 주종별 음주\")/② 크기 (13pt)" + }, + "2-46":{ + "path":"//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@b", + "path2": null, + "searchValue": "월평균 주종별 음주", + "value": 1, + "points": 2, + "category": "chart_xml", + "item": "제목 문구 (\"월평균 주종별 음주\")/③ 진하게" + }, + "2-47":{ + "path":"//c:catAx//a:ea/@typeface", + "path2": null, + "searchValue": null, + "value": "맑은 고딕", + "points": 2, + "category": "chart_xml", + "item": "X축/① 글꼴 (맑은 고딕)" + }, + "2-48":{ + "path":"//c:catAx//a:defRPr/@sz", + "path2": null, + "searchValue": null, + "value": 900, + "points": 2, + "category": "chart_xml", + "item": "X축/② 크기 (9pt)" + }, + "2-49":{ + "path":"//c:catAx//a:defRPr/@i", + "path2": null, + "searchValue": null, + "value": 1, + "points": 2, + "category": "chart_xml", + "item": "X축/③ 기울임" + }, + "2-50":{ + "path":"//c:valAx//a:ea/@typeface", + "path2": null, + "searchValue": null, + "value": "맑은 고딕", + "points": 2, + "category": "chart_xml", + "item": "Y축/① 글꼴 (맑은 고딕)" + }, + "2-51":{ + "path":"//c:valAx//a:defRPr/@sz", + "path2": null, + "searchValue": null, + "value": 900, + "points": 2, + "category": "chart_xml", + "item": "Y축/② 크기 (9pt)" + }, + "2-52":{ + "path":"//c:valAx//a:defRPr/@i", + "path2": null, + "searchValue": null, + "value": 1, + "points": 2, + "category": "chart_xml", + "item": "Y축/③ 기울임" + }, + "2-53":{ + "path":"//c:legend//a:ea/@typeface", + "path2": null, + "searchValue": null, + "value":"맑은 고딕", + "points": 2, + "category": "chart_xml", + "item": "범례/① 글꼴 (맑은 고딕)" + }, + "2-54":{ + "path":"//c:legend//a:defRPr/@sz", + "path2": null, + "searchValue": null, + "value": 900, + "points": 2, + "category": "chart_xml", + "item": "범례/② 크기 (9pt)" + }, + "2-55":{ + "path":"//c:legend//a:defRPr/@i", + "path2": null, + "searchValue": null, + "value": 1, + "points": 2, + "category": "chart_xml", + "item": "범례/③ 기울임" + } +} \ No newline at end of file