diff --git a/DIW_2505A.json b/DIW_2505A.json index 3a2a951..d064530 100644 --- a/DIW_2505A.json +++ b/DIW_2505A.json @@ -340,10 +340,10 @@ "desc": "섹션이 1개 이상이면 점수부여" }, "3": { - "path": "//P[@PageBreak='true']//COLDEF/@Count", + "path": "//COLDEF/@Count", "value": "2", "points": 3, - "category": "OneAnswer", + "category": "TwoColumn", "item": "② 다단 2단" }, "4": { diff --git a/diwScoring2.py b/diwScoring2.py index c440ad2..84691ee 100644 --- a/diwScoring2.py +++ b/diwScoring2.py @@ -770,7 +770,74 @@ class XMLScorer: break self.evaluate_answer(scoring, user_answer, right_answer, points, method="equal") - + + # 다단 확인 [2-3]문항 + elif (category or "") == "TwoColumn": + + has_section2 = root.xpath('//SECTION[2]') + if not has_section2: + # //P//COLDEF/@Count 속성이 시작하는 P태그 부터 + # @Count 속성이 변한 P태그 이전인덱스 까지가 페이지 단수가 적용되어있는 구간 + + # 모든

요소 가져오기 + p_elements = root.xpath('//P') + + # 구간 결과를 저장할 리스트 + sections = [] + + current_count = None + start_index = None + + for i, p in enumerate(p_elements): + xml_index = i + 1 # XML 기준 1-based index + coldef = p.xpath('.//COLDEF') + + if coldef: + # 다단 수(2단) + column_count = coldef[0].get('Count') + + # 첫 번째 Count 발견 시 시작점 설정 + if current_count is None: + current_count = column_count + start_index = i + + # Count 값이 변경되었을 때 이전 구간을 저장 + elif column_count != current_count: + sections.append((start_index, i - 1, current_count)) + # 새 구간 시작 + current_count = column_count + start_index = i + + # 마지막 구간 저장 + if current_count is not None and start_index is not None: + sections.append((start_index, len(p_elements) - 1, current_count)) + + # 결과 출력 + for start, end, count in sections: + xml_start = start + 1 # XML 기준 1-based index + xml_end = end + 1 + print(f"📄 {count}단 구간: P[{xml_start}] ~ P[{xml_end}]") + + # PageBreak='true' 속성을 가진 P태그 인덱스 + pagebreak_index = None + for i, p in enumerate(p_elements): + xml_index = i + 1 + if p.get("PageBreak") == "true": + pagebreak_index = xml_index + break + + print(f"📜PageBreak 인덱스 : P[{pagebreak_index}]", ) + + # 다단 2단 구간이 PageBreak='true'이후에도 속하는지 확인 + # 다단 2단 속성이 2페이지 이후에도 속하는지 확인 + for start, end, count in sections: + xml_start = start + 1 + xml_end = end + 1 + if count == '2' and xml_start <= pagebreak_index : + print("ㅇㅇ") + + + break # 한자 elif (category or "") == "Hanja": # 점수 계산 @@ -1135,8 +1202,8 @@ def main(): # 채점하고자 하는 유형은 주석 해제 exam_types = [ - # 'A', - 'B', + 'A', + # 'B', # 'C', # 'D', ] diff --git a/zzz.xbook b/zzz.xbook index 4c0d068..d61bd2d 100644 --- a/zzz.xbook +++ b/zzz.xbook @@ -1 +1 @@ -[{"kind":2,"language":"xpath","value":"//a:t[text()='클라우드 보안투자']/ancestor::a:r//a:ea/@typeface"},{"kind":2,"language":"xpath","value":"boolean(//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE/FONTID/@Hangul]/@Name='바탕' and //CHARSHAPE/@Height='1000' and //PARASHAPE/PARAMARGIN/@LineSpacing='160' and //PARASHAPE/@Align='Justify')"},{"kind":2,"language":"xpath","value":"//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE/FONTID/@Hangul]/@Name='바탕'"},{"kind":2,"language":"xpath","value":"//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE/FONTID/@Hangul]/@Name='바탕' and //CHARSHAPE/@Height='1000' and //PARASHAPE/PARAMARGIN/@LineSpacing='160' and //PARASHAPE/@Align='Justify')"},{"kind":2,"language":"xpath","value":"//SECTION[1]//TEXT[CHAR[text()='DIAT']]/@CharShape"},{"kind":2,"language":"xpath","value":"//CHARSHAPE[@Id=//SECTION[1]//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height"},{"kind":2,"language":"xpath","value":"//P[.//FIELDBEGIN[@Type='Hyperlink'] and .//CHAR[contains(., 'http')]]"},{"kind":2,"language":"xpath","value":"//P[.//FIELDBEGIN[@Type='Hyperlink'] and .//CHAR[contains(., 'http')]]"},{"kind":2,"language":"xpath","value":"//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/POSITION[not(@TreatAsChar='true')]/@HorzOffset"},{"kind":2,"language":"xpath","value":"//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Width"}] \ No newline at end of file +[{"kind":2,"language":"xpath","value":"//a:t[text()='클라우드 보안투자']/ancestor::a:r//a:ea/@typeface"},{"kind":2,"language":"xpath","value":"boolean(//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE/FONTID/@Hangul]/@Name='바탕' and //CHARSHAPE/@Height='1000' and //PARASHAPE/PARAMARGIN/@LineSpacing='160' and //PARASHAPE/@Align='Justify')"},{"kind":2,"language":"xpath","value":"//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE/FONTID/@Hangul]/@Name='바탕'"},{"kind":2,"language":"xpath","value":"//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE/FONTID/@Hangul]/@Name='바탕' and //CHARSHAPE/@Height='1000' and //PARASHAPE/PARAMARGIN/@LineSpacing='160' and //PARASHAPE/@Align='Justify')"},{"kind":2,"language":"xpath","value":"//SECTION[1]//TEXT[CHAR[text()='DIAT']]/@CharShape"},{"kind":2,"language":"xpath","value":"//CHARSHAPE[@Id=//SECTION[1]//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height"},{"kind":2,"language":"xpath","value":"//P"},{"kind":2,"language":"xpath","value":"//P[.//FIELDBEGIN[@Type='Hyperlink'] and .//CHAR[contains(., 'http')]]"},{"kind":2,"language":"xpath","value":"//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/POSITION[not(@TreatAsChar='true')]/@HorzOffset"},{"kind":2,"language":"xpath","value":"//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Width"}] \ No newline at end of file diff --git a/회차별채점자료/2505/2505확인필요.xlsx b/회차별채점자료/2505/2505확인필요.xlsx index a42c6ca..d1c4bc3 100644 Binary files a/회차별채점자료/2505/2505확인필요.xlsx and b/회차별채점자료/2505/2505확인필요.xlsx differ