2505회 JSON채점기준표 및 채점자료 업데이트

This commit is contained in:
2025-05-26 17:46:45 +09:00
parent 828752e05a
commit 58ffdac74c
51 changed files with 24015 additions and 1987 deletions

View File

@@ -5,7 +5,7 @@ import unicodedata
def copy_dic_subdirs(source_root, target_root_a, target_root_b, target_root_c, target_root_d, target_root_e): def copy_dic_subdirs(source_root, target_root_a, target_root_b, target_root_c, target_root_d, target_root_e):
for root, dirs, files in os.walk(source_root): for root, dirs, files in os.walk(source_root):
for dir_name in dirs: for dir_name in dirs:
if dir_name.lower() == 'diw': # DIC 디렉토리 탐색 if dir_name.lower() == 'diw': # DIW 디렉토리 탐색
parent_dir = os.path.basename(os.path.dirname(os.path.join(root, dir_name))) parent_dir = os.path.basename(os.path.dirname(os.path.join(root, dir_name)))
target_root = None target_root = None
parent_dir = unicodedata.normalize('NFC', parent_dir) parent_dir = unicodedata.normalize('NFC', parent_dir)
@@ -33,18 +33,16 @@ def copy_dic_subdirs(source_root, target_root_a, target_root_b, target_root_c, t
test_folder_path = os.path.join(target_root, "TEST") test_folder_path = os.path.join(target_root, "TEST")
os.makedirs(test_folder_path, exist_ok=True) os.makedirs(test_folder_path, exist_ok=True)
test_folder_path = os.path.join(target_root, "TEST")
os.makedirs(test_folder_path, exist_ok=True)
else: else:
print(f"Skipping {dir_name} under {parent_dir}, as it doesn't match '2교시' or '3교시'.") print(f"Skipping {dir_name} under {parent_dir}, as it doesn't match '2교시' or '3교시'.")
# 사용법 # 사용법
# exam_round = "2504_2" # exam_round = "2504_2"
exam_round = "2504" exam_round = "2505"
# source_directory = r"C:\Users\dra\project\data\제2504회 수시2(제주)\답안파일" # 원본 디렉토리 경로 # source_directory = r"C:\Users\dra\project\data\제2504회 수시2(제주)\답안파일" # 원본 디렉토리 경로
source_directory = r"C:\Users\dra\project\data\제2504회 정기\답안파일" # 원본 디렉토리 경로 source_directory = r"C:\Users\dra\project\HWP\HWP-Scoring\회차별채점자료\2505\hwp_정답" # 원본 디렉토리 경로
target_directory_a = f".\\input\\{exam_round}\\A" # '1교시'의 타겟 경로 target_directory_a = f".\\input\\{exam_round}\\A" # '1교시'의 타겟 경로
target_directory_b = f".\\input\\{exam_round}\\B" # '2교시'의 타겟 경로 target_directory_b = f".\\input\\{exam_round}\\B" # '2교시'의 타겟 경로

View File

@@ -61,7 +61,10 @@ def convert_hwp_to_xml(input_folder, output_folder):
# 출력 폴더가 없으면 생성 # 출력 폴더가 없으면 생성
os.makedirs(output_folder, exist_ok=True) os.makedirs(output_folder, exist_ok=True)
parent_folder = os.path.dirname(output_folder)
test_folder_path = os.path.join(parent_folder, "TEST")
os.makedirs(test_folder_path, exist_ok=True)
# HWP 파일 검색 및 변환 # HWP 파일 검색 및 변환
input_path = Path(input_folder) input_path = Path(input_folder)
@@ -131,7 +134,7 @@ def delete_gen_py():
if __name__ == "__main__": if __name__ == "__main__":
exam_rounds = [ exam_rounds = [
"2504", "2505",
# "2504_3" # "2504_3"
] ]
@@ -147,7 +150,7 @@ if __name__ == "__main__":
(f"C:\\Users\\dra\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\A\\DIW",f"C:\\Users\\dra\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\A\\DIW"), (f"C:\\Users\\dra\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\A\\DIW",f"C:\\Users\\dra\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\A\\DIW"),
(f"C:\\Users\\dra\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\B\\DIW",f"C:\\Users\\dra\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\B\\DIW"), (f"C:\\Users\\dra\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\B\\DIW",f"C:\\Users\\dra\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\B\\DIW"),
(f"C:\\Users\\dra\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\C\\DIW",f"C:\\Users\\dra\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\C\\DIW"), (f"C:\\Users\\dra\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\C\\DIW",f"C:\\Users\\dra\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\C\\DIW"),
# (f"C:\\Users\\dra\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\D\\DIW",f"C:\\Users\\dra\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\D\\DIW"), (f"C:\\Users\\dra\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\D\\DIW",f"C:\\Users\\dra\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\D\\DIW"),
# (f"C:\\Users\\dra\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\E\\DIW",f"C:\\Users\\dra\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\E\\DIW"), # (f"C:\\Users\\dra\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\E\\DIW",f"C:\\Users\\dra\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\E\\DIW"),
] ]

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -46,61 +46,61 @@
"1": { "1": {
"1": { "1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName", "path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"searchValue": "클라우드컴퓨팅컨퍼런스", "searchValue": "천혜의비경철쭉",
"value": "맑은 고딕", "value": "맑은 고딕",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (클라우드컴퓨팅컨퍼런스)/① 글씨체 (맑은 고딕)" "item": "문구 (천혜의비경철쭉)/① 글씨체 (맑은 고딕)"
}, },
"2": { "2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor", "path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"searchValue": "클라우드컴퓨팅컨퍼런스", "searchValue": "천혜의비경철쭉",
"value": "28,61,98", "value": "28,61,98",
"points": 2, "points": 2,
"category": "Color", "category": "Color",
"item": "문구 (클라우드컴퓨팅컨퍼런스)/② 채우기 : 색상(RGB:100,170,92)" "item": "문구 (천혜의비경철쭉)/② 채우기 : 색상(RGB:100,170,92)"
}, },
"3": { "3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width", "path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"searchValue": "클라우드컴퓨팅컨퍼런스", "searchValue": "천혜의비경철쭉",
"value": "110", "value": "110",
"tolerance": 1, "tolerance": 1,
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "문구 (클라우드컴퓨팅컨퍼런스)/③ 크기-너비 (110mm)" "item": "문구 (천혜의비경철쭉)/③ 크기-너비 (110mm)"
}, },
"4": { "4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height", "path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"searchValue": "클라우드컴퓨팅컨퍼런스", "searchValue": "천혜의비경철쭉",
"value": "20", "value": "20",
"tolerance": 1, "tolerance": 1,
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "문구 (클라우드컴퓨팅컨퍼런스)/④ 크기-높이 (20mm)" "item": "문구 (천혜의비경철쭉)/④ 크기-높이 (20mm)"
}, },
"5": { "5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar", "path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "클라우드컴퓨팅컨퍼런스", "searchValue": "천혜의비경철쭉",
"value": "true", "value": "true",
"points": 2, "points": 2,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (클라우드컴퓨팅컨퍼런스)/⑤ 위치 (글자처럼 취급)" "item": "문구 (천혜의비경철쭉)/⑤ 위치 (글자처럼 취급)"
}, },
"6": { "6": {
"path":"//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align", "path":"//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "클라우드컴퓨팅컨퍼런스", "searchValue": "천혜의비경철쭉",
"value": "Center", "value": "Center",
"points": 2, "points": 2,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (클라우드컴퓨팅컨퍼런스)/⑥ 정렬 (가운데 정렬)" "item": "문구 (천혜의비경철쭉)/⑥ 정렬 (가운데 정렬)"
}, },
"7": { "7": {
"path": "//TEXTART[@Text='{searchValue}']", "path": "//TEXTART[@Text='{searchValue}']",
"searchValue": "클라우드컴퓨팅컨퍼런스", "searchValue": "천혜의비경철쭉",
"value": true, "value": true,
"points": 2, "points": 2,
"category": "Boolean", "category": "Boolean",
"item": "문구 (클라우드컴퓨팅컨퍼런스)/⑦ 글맵시모양 (육안확인)" "item": "문구 (천혜의비경철쭉)/⑦ 글맵시모양 (육안확인)"
}, },
"8": { "8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE", "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE",
@@ -141,19 +141,19 @@
}, },
"12": { "12": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]", "path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "글로벌 클라우드 컴퓨팅 컨퍼런스", "searchValue": "바래봉 해발 약 500m에서 시작해 점점 정상으로",
"value": "BOLD", "value": "BOLD",
"points": 2, "points": 2,
"category": "FontAttribute", "category": "FontAttribute",
"item": "문구 (글로벌 클라우드 컴퓨팅 컨퍼런스)/① 진하게" "item": "문구 (바래봉 해발 약 500m에서 시작해 점점 정상으로)/① 진하게"
}, },
"13": { "13": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]", "path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "글로벌 클라우드 컴퓨팅 컨퍼런스", "searchValue": "바래봉 해발 약 500m에서 시작해 점점 정상으로",
"value": "UNDERLINE", "value": "ITALIC",
"points": 2, "points": 2,
"category": "FontAttribute", "category": "FontAttribute",
"item": "문구 (글로벌 클라우드 컴퓨팅 컨퍼런스)/② 밑줄" "item": "문구 (바래봉 해발 약 500m에서 시작해 점점 정상으로)/② 기울임"
}, },
"14": { "14": {
"path": "//CHAR[contains(text(),'{char1}')]", "path": "//CHAR[contains(text(),'{char1}')]",
@@ -215,44 +215,44 @@
}, },
"20": { "20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height", "path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"searchValue": "2025. 04. 26.", "searchValue": "2025. 05. 24.",
"value": "1400", "value": "1400",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (2025. 04. 26.)/① 크기 (14pt)", "item": "문구 (2025. 05. 24.)/① 크기 (14pt)",
"desc": "1pt당 100" "desc": "1pt당 100"
}, },
"21": { "21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align", "path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "2025. 04. 26.", "searchValue": "2025. 05. 24.",
"value": "Center", "value": "Center",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (2025. 04. 26.)/② 정렬 (가운데 정렬)" "item": "문구 (2025. 05. 24.)/② 정렬 (가운데 정렬)"
}, },
"22": { "22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape", "path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "글로벌멀티클라우드협의회", "searchValue": "운봉바래봉철쭉제",
"value": "궁서체", "value": "궁서체",
"points": 1, "points": 1,
"category": "FontName", "category": "FontName",
"item": "문구 (글로벌멀티클라우드협의회)/① 글씨체 (궁서체)" "item": "문구 (운봉바래봉철쭉제)/① 글씨체 (궁서체)"
}, },
"23": { "23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "글로벌멀티클라우드협의회", "searchValue": "운봉바래봉철쭉제",
"value": "2600", "value": "2600",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (글로벌멀티클라우드협의회)/② 크기 (26pt)" "item": "문구 (운봉바래봉철쭉제)/② 크기 (26pt)"
}, },
"24": { "24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align", "path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"searchValue": "글로벌멀티클라우드협의회", "searchValue": "운봉바래봉철쭉제",
"value": "Center", "value": "Center",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (글로벌멀티클라우드협의회)/③ 정렬 (가운데 정렬)" "item": "문구 (운봉바래봉철쭉제)/③ 정렬 (가운데 정렬)"
}, },
"25": { "25": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape", "path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
@@ -349,87 +349,87 @@
}, },
"4": { "4": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Width", "path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"searchValue": "클라우드 컴퓨팅", "searchValue": "철쭉과 진달래",
"value": "60", "value": "50",
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "문구 (클라우드 컴퓨팅)/① 크기-너비 (60mm)" "item": "문구 (철쭉과 진달래)/① 크기-너비 (50 mm)"
}, },
"5": { "5": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Height", "path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"searchValue": "클라우드 컴퓨팅", "searchValue": "철쭉과 진달래",
"value": "12", "value": "12",
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "문구 (클라우드 컴퓨팅)/② 크기-높이 (12mm)" "item": "문구 (철쭉과 진달래)/② 크기-높이 (12 mm)"
}, },
"6": { "6": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//LINESHAPE/@Style", "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//LINESHAPE/@Style",
"path2": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//LINESHAPE/@Width", "path2": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//LINESHAPE/@Width",
"searchValue": "클라우드 컴퓨팅", "searchValue": "철쭉과 진달래",
"value": [ "DoubleSlim", "283" ], "value": [ "DoubleSlim", "283" ],
"points": 2, "points": 2,
"category": "DoubleAnswer", "category": "DoubleAnswer",
"item": "문구 (클라우드 컴퓨팅)/③ 테두리 : 이중 실선(1.00mm)", "item": "문구 (철쭉과 진달래)/③ 테두리 : 이중 실선(1.00mm)",
"desc": "1mm = 283pt" "desc": "1mm = 283pt"
}, },
"7": { "7": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/@Ratio", "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/@Ratio",
"searchValue": "클라우드 컴퓨팅", "searchValue": "철쭉과 진달래",
"value": "50", "value": "20",
"points": 2, "points": 2,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (클라우드 컴퓨팅)/④ 글상자 모서리 (반원)", "item": "문구 (철쭉과 진달래)/④ 글상자 모서리 (둥근모양)",
"desc": "모서리 비율 50이면 반원 / 20이면 둥근모양" "desc": "모서리 비율 50이면 반원 / 20이면 둥근모양"
}, },
"8": { "8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor", "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "클라우드 컴퓨팅", "searchValue": "철쭉과 진달래",
"value": "202,86,167", "value": "225,15,161",
"points": 2, "points": 2,
"category": "Color", "category": "Color",
"item": "문구 (클라우드 컴퓨팅)/⑤ 채우기 : 색상(RGB:202,86,167)" "item": "문구 (철쭉과 진달래)/⑤ 채우기 : 색상(RGB:225,15,161)"
}, },
"9": { "9": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/POSITION/@TreatAsChar", "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "클라우드 컴퓨팅", "searchValue": "철쭉과 진달래",
"value": "true", "value": "true",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (클라우드 컴퓨팅)/⑥ 글상자 위치 (글자처럼 취급)" "item": "문구 (철쭉과 진달래)/⑥ 글상자 위치 (글자처럼 취급)"
}, },
"10": { "10": {
"path": "//PARASHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::P[last()]/@ParaShape]/@Align", "path": "//PARASHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::P[last()]/@ParaShape]/@Align",
"searchValue": "클라우드 컴퓨팅", "searchValue": "철쭉과 진달래",
"value": "Center", "value": "Center",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (클라우드 컴퓨팅)/⑦ 글상자 정렬 (가운데 정렬)" "item": "문구 (철쭉과 진달래)/⑦ 글상자 정렬 (가운데 정렬)"
}, },
"11": { "11": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape", "path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "클라우드 컴퓨팅", "searchValue": "철쭉과 진달래",
"value": "고딕", "value": "맑은고딕",
"points": 1, "points": 1,
"category": "FontName", "category": "FontName",
"item": "문구 (클라우드 컴퓨팅)/⑧ 글씨체 (고딕)" "item": "문구 (철쭉과 진달래)/⑧ 글씨체 (맑은고딕)"
}, },
"12": { "12": {
"path": "//CHARSHAPE[@Id=//RECTANGLE//TEXT[./CHAR[text()='{searchValue}']]/@CharShape]/@Height", "path": "//CHARSHAPE[@Id=//RECTANGLE//TEXT[./CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "클라우드 컴퓨팅", "searchValue": "철쭉과 진달래",
"value": "2000", "value": "1800",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (클라우드 컴퓨팅)/⑨ 글씨크기 (20pt)", "item": "문구 (철쭉과 진달래)/⑨ 글씨크기 (18 pt)",
"desc":"1pt당 100" "desc":"1pt당 100"
}, },
"13": { "13": {
"path": "//PARASHAPE[@Id=//RECTANGLE//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align", "path": "//PARASHAPE[@Id=//RECTANGLE//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "클라우드 컴퓨팅", "searchValue": "철쭉과 진달래",
"value": "Center", "value": "Center",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (클라우드 컴퓨팅)/⑩ 정렬 (가운데 정렬)" "item": "문구 (철쭉과 진달래)/⑩ 정렬 (가운데 정렬)"
}, },
"14": { "14": {
"path": "boolean(//PICTURE//SHAPECOMMENT[contains(text(),'{searchValue}')])", "path": "boolean(//PICTURE//SHAPECOMMENT[contains(text(),'{searchValue}')])",
@@ -441,17 +441,17 @@
}, },
"15": { "15": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/SIZE/@Width", "path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/SIZE/@Width",
"value": "80", "value": "85",
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "② 크기-너비 (80 mm)" "item": "② 크기-너비 (85 mm)"
}, },
"16": { "16": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/SIZE/@Height", "path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/SIZE/@Height",
"value": "45", "value": "40",
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "③ 크기-높이 (45 mm)" "item": "③ 크기-높이 (40 mm)"
}, },
"17": { "17": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/POSITION/@HorzOffset", "path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/POSITION/@HorzOffset",
@@ -462,91 +462,91 @@
}, },
"18": { "18": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/POSITION/@VertOffset", "path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/POSITION/@VertOffset",
"value": "24", "value": "23",
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "⑤ 위치 (어울림 : 세로-쪽의 위 24mm)" "item": "⑤ 위치 (어울림 : 세로-쪽의 위 23 mm)"
}, },
"19": { "19": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape", "path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "1. 주목하는 최신 트렌드", "searchValue": "1. 철쭉의 특징",
"value": "굴림", "value": "굴림",
"points": 1, "points": 1,
"category": "FontName", "category": "FontName",
"item": "문구① (1. 주목하는 최신 트렌드)/① 글씨체 (굴림)" "item": "문구① (1. 철쭉의 특징)/① 글씨체 (굴림)"
}, },
"20": { "20": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "1. 주목하는 최신 트렌드", "searchValue": "1. 철쭉의 특징",
"value": "1200", "value": "1200",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구① (1. 주목하는 최신 트렌드)/② 크기 (12pt)" "item": "문구① (1. 철쭉의 특징)/② 크기 (12pt)"
}, },
"21": { "21": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "1. 주목하는 최신 트렌드", "searchValue": "1. 철쭉의 특징",
"value": "BOLD", "value": "BOLD",
"points": 1, "points": 1,
"category": "FontAttribute", "category": "FontAttribute",
"item": "문구① (1. 주목하는 최신 트렌드)/③ 진하게" "item": "문구① (1. 철쭉의 특징)/③ 진하게"
}, },
"22": { "22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape", "path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "2. 기술의 경제적 가치", "searchValue": "2. 봄의 전령 진달래",
"value": "굴림", "value": "굴림",
"points": 1, "points": 1,
"category": "FontName", "category": "FontName",
"item": "문구② (2. 기술의 경제적 가치)/① 글씨체 (굴림)" "item": "문구② (2. 봄의 전령 진달래)/① 글씨체 (굴림)"
}, },
"23": { "23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "2. 기술의 경제적 가치", "searchValue": "2. 봄의 전령 진달래",
"value": "1200", "value": "1200",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구② (2. 기술의 경제적 가치)/② 크기 (12pt)" "item": "문구② (2. 봄의 전령 진달래)/② 크기 (12pt)"
}, },
"24": { "24": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "2. 기술의 경제적 가치", "searchValue": "2. 봄의 전령 진달래",
"value": "BOLD", "value": "BOLD",
"points": 1, "points": 1,
"category": "FontAttribute", "category": "FontAttribute",
"item": "문구② (2. 기술의 경제적 가치)/③ 진하게" "item": "문구② (2. 봄의 전령 진달래)/③ 진하게"
}, },
"25": { "25": {
"path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)", "path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)", "path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)",
"option": "클라우드", "option": "거름",
"value": true, "value": true,
"points": 2, "points": 2,
"category": "Boolean", "category": "Boolean",
"item": "문구 (클라우드)/① 각주 설정 및 문구 입력" "item": "문구 (거름)/① 각주 설정 및 문구 입력"
}, },
"26": { "26": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape", "path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "인터넷을 통해 액세스할 수 있는 가상화된 서버에서 실행되는 프로그램과 데이터베이스를 제공하는 환경", "searchValue": "땅을 기름지게 하는데 사용되는 유기물질",
"value": "중고딕", "value": "궁서",
"points": 1, "points": 1,
"category": "FontName", "category": "FontName",
"item": "문구 (클라우드)/② 글씨체 (중고딕)" "item": "문구 (거름)/② 글씨체 (궁서)"
}, },
"27": { "27": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height",
"searchValue": "인터넷을 통해 액세스할 수 있는 가상화된 서버에서 실행되는 프로그램과 데이터베이스를 제공하는 환경", "searchValue": "땅을 기름지게 하는데 사용되는 유기물질",
"value": "900", "value": "900",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (클라우드)/③ 크기 (9pt)" "item": "문구 (거름)/③ 크기 (9pt)"
}, },
"28": { "28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type", "path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"searchValue": "인터넷을 통해 액세스할 수 있는 가상화된 서버에서 실행되는 프로그램과 데이터베이스를 제공하는 환경", "searchValue": "땅을 기름지게 하는데 사용되는 유기물질",
"value": "Ideograph", "value": "Ideograph",
"points": 2, "points": 2,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (클라우드)/④ 각주 번호모양", "item": "문구 (거름)/④ 각주 번호모양",
"desc": { "desc": {
"가,나,다":"HangulSyllable", "가,나,다":"HangulSyllable",
"1,2,3":"Digit", "1,2,3":"Digit",
@@ -561,81 +561,81 @@
} }
}, },
"29": { "29": {
"path": "boolean(//CHAR[contains(text(),'Digital')])", "path": "boolean(//CHAR[contains(text(),'Breeding')])",
"ignoreWord": "Digital", "ignoreWord": "Breeding",
"value": true, "value": true,
"points": 3, "points": 3,
"category": "Boolean", "category": "Boolean",
"item": "Digital/영단어 미입력, 대소문자/오타 시 전체 감점", "item": "Breeding/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": "유사도 검사를 진행하지 않고 영단어가 모두 일치해야 하므로 xpath구문 내 단어도 수정필요" "desc": "유사도 검사를 진행하지 않고 영단어가 모두 일치해야 하므로 xpath구문 내 단어도 수정필요"
}, },
"30": { "30": {
"path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]", "path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]",
"word":[ "word":[
["전환", "轉換"], ["생육", "生育"],
["핵심", "核心"], ["유년", "幼年"],
["확산", "擴散"], ["허기", "虛飢"],
["보안", "保安"], ["풍류", "風流"],
["도입", "導入"] ["식물", "植物"]
], ],
"value": 10, "value": 10,
"points": 10, "points": 10,
"category": "Hanja", "category": "Hanja",
"item": "① 전환(轉換), ② 핵심(核心), ③ 확산(擴散), ④ 보안(保安), ⑤ 도입(導入)" "item": "① 생육(生育), ② 유년(幼年), ③ 허기(虛飢), ④ 풍류(風流), ⑤ 식물(植物)"
}, },
"31": { "31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'션이발전')])", "path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'지를잘라')])",
"value": true, "value": true,
"points": 3, "points": 3,
"category": "Boolean", "category": "Boolean",
"item": "문구 (…보안(保安) 솔루션은 발전하면서…)/\"은\" → \"이\" 글자바꿈" "item": "문구 (…새로 나온 가지가 잘라…) 가 → 를 글자바꿈"
}, },
"32": { "32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'이터유출')])", "path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'보다참꽃')])",
"value": true, "value": true,
"points": 3, "points": 3,
"category": "Boolean", "category": "Boolean",
"item": "문구 (…유출과 데이터 사이버…)/\"유출과\" / \"데이터\" 순서바꿈" "item": "문구 (…참꽃나무란 진달래보다 이름에 더…) 참꽃나무란 / 진달래보다 순서바꿈"
}, },
"33": { "33": {
"path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape", "path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape",
"searchValue": "클라우드 보안(단위: 백만 달러)", "searchValue": "철쭉 관광객 현황(단위 : 천 명)",
"value": "돋움", "value": "돋움",
"points": 1, "points": 1,
"category": "FontName", "category": "FontName",
"item": "제목 문구 (클라우드 보안(단위: 백만 달러))/① 글씨체 (돋움)" "item": "제목 문구 (철쭉 관광객 현황(단위 : 천 명))/① 글씨체 (돋움)"
}, },
"34": { "34": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "클라우드 보안(단위: 백만 달러)", "searchValue": "철쭉 관광객 현황(단위 : 천 명)",
"value": "1200", "value": "1200",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "제목 문구 (클라우드 보안(단위: 백만 달러))/② 크기 (12pt)" "item": "제목 문구 (철쭉 관광객 현황(단위 : 천 명))/② 크기 (12pt)"
}, },
"35": { "35": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "클라우드 보안(단위: 백만 달러)", "searchValue": "철쭉 관광객 현황(단위 : 천 명)",
"value": "BOLD", "value": "BOLD",
"points": 1, "points": 1,
"category": "FontAttribute", "category": "FontAttribute",
"item": "제목 문구 (클라우드 보안(단위: 백만 달러))/③ 진하게" "item": "제목 문구 (철쭉 관광객 현황(단위 : 천 명))/③ 진하게"
}, },
"36": { "36": {
"path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align", "path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "클라우드 보안(단위: 백만 달러)", "searchValue": "철쭉 관광객 현황(단위 : 천 명)",
"value": "Center", "value": "Center",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "제목 문구 (클라우드 보안(단위: 백만 달러))/④ 정렬 (가운데 정렬)" "item": "제목 문구 (철쭉 관광객 현황(단위 : 천 명))/④ 정렬 (가운데 정렬)"
}, },
"37": { "37": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor", "path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor", "path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"value": "233,174,43", "value": "140,249,62",
"points": 2, "points": 2,
"category": "Color", "category": "Color",
"item": "위쪽 제목 셀/① 색상(RGB:233,174,43)" "item": "위쪽 제목 셀/① 색상(RGB:140,249,62)"
}, },
"38": { "38": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]", "path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]",
@@ -687,7 +687,7 @@
}, },
"44": { "44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) and boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])", "path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) and boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "SUM", "option": "AVG",
"value": true, "value": true,
"points": 4, "points": 4,
"category": "Boolean", "category": "Boolean",
@@ -696,11 +696,11 @@
}, },
"45": { "45": {
"chart_xpath": "", "chart_xpath": "",
"chart_type": "묶은세로막대형", "chart_type": "누적세로막대형",
"value": true, "value": true,
"points": 2, "points": 2,
"category": "ChartType", "category": "ChartType",
"item": "① 종류 (묶은 세로 막대형)", "item": "① 종류 (누적세로막대형)",
"desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)" "desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)"
}, },
"46": { "46": {
@@ -735,28 +735,28 @@
}, },
"50": { "50": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface", "chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"searchValue": "클라우드 보안 투자", "searchValue": "철쭉 관광객 현황",
"value": "굴림", "value": "굴림",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "제목 문구 (클라우드 보안 투자)/① 글씨체 (굴림)" "item": "제목 문구 (철쭉 관광객 현황)/① 글씨체 (굴림)"
}, },
"51": { "51": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz", "chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"searchValue": "클라우드 보안 투자", "searchValue": "철쭉 관광객 현황",
"value": "1300", "value": "1300",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "제목 문구 (클라우드 보안 투자)/② 크기 (13pt)" "item": "제목 문구 (철쭉 관광객 현황)/② 크기 (13pt)"
}, },
"52": { "52": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}", "chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}",
"option": "b", "option": "b",
"searchValue": "클라우드 보안 투자", "searchValue": "철쭉 관광객 현황",
"value": "1", "value": "1",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "제목 문구 (클라우드 보안 투자)/③ 진하게", "item": "제목 문구 (철쭉 관광객 현황)/③ 진하게",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b" "desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
}, },
"53": { "53": {

View File

@@ -46,65 +46,65 @@
"1": { "1": {
"1": { "1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName", "path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"searchValue": "친환경에너지박람회", "searchValue": "광양매실축제안내",
"value": "궁서체", "value": "맑은 고딕",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (친환경에너지박람회)/① 글씨체 (궁서체)" "item": "문구 (광양매실축제안내)/① 글씨체 (맑은 고딕)"
}, },
"2": { "2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor", "path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"searchValue": "친환경에너지박람회", "searchValue": "광양매실축제안내",
"value": "199,82,82", "value": "199,80,124",
"points": 2, "points": 2,
"category": "Color", "category": "Color",
"item": "문구 (친환경에너지박람회)/② 채우기 : 색상(RGB:199,82,82)" "item": "문구 (광양매실축제안내)/② 채우기 : 색상(RGB:199,82,82)"
}, },
"3": { "3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width", "path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"searchValue": "친환경에너지박람회", "searchValue": "광양매실축제안내",
"value": "110", "value": "100",
"tolerance": 1, "tolerance": 1,
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "문구 (친환경에너지박람회)/③ 크기-너비 (110mm)" "item": "문구 (광양매실축제안내)/③ 크기-너비 (100mm)"
}, },
"4": { "4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height", "path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"searchValue": "친환경에너지박람회", "searchValue": "광양매실축제안내",
"value": "20", "value": "20",
"tolerance": 1, "tolerance": 1,
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "문구 (친환경에너지박람회)/④ 크기-높이 (20mm)" "item": "문구 (광양매실축제안내)/④ 크기-높이 (20 mm)"
}, },
"5": { "5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar", "path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "친환경에너지박람회", "searchValue": "광양매실축제안내",
"value": "true", "value": "true",
"points": 2, "points": 2,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (친환경에너지박람회)/⑤ 위치 (글자처럼 취급)" "item": "문구 (광양매실축제안내)/⑤ 위치 (글자처럼 취급)"
}, },
"6": { "6": {
"path":"//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align", "path":"//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "친환경에너지박람회", "searchValue": "광양매실축제안내",
"value": "Center", "value": "Center",
"points": 2, "points": 2,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (친환경에너지박람회)/⑥ 정렬 (가운데 정렬)" "item": "문구 (광양매실축제안내)/⑥ 정렬 (가운데 정렬)"
}, },
"7": { "7": {
"path": "//TEXTART[@Text='{searchValue}']", "path": "//TEXTART[@Text='{searchValue}']",
"searchValue": "친환경에너지박람회", "searchValue": "광양매실축제안내",
"value": true, "value": true,
"points": 2, "points": 2,
"category": "Boolean", "category": "Boolean",
"item": "문구 (친환경에너지박람회)/⑦ 글맵시모양 (육안확인)" "item": "문구 (광양매실축제안내)/⑦ 글맵시모양 (육안확인)"
}, },
"8": { "8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE", "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE",
"searchValue": "", "searchValue": "",
"value": { "value": {
"Height": 2800, "Height": 2800,
"Width": 2800 "Width": 2800
@@ -112,147 +112,147 @@
"tolerance": 200, "tolerance": 200,
"points": 1, "points": 1,
"category": "TwoLineSize", "category": "TwoLineSize",
"item": "/① 모양 (2줄)" "item": "/① 모양 (2줄)"
}, },
"9": { "9": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape", "path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "", "searchValue": "",
"value": "궁서", "value": "궁서",
"points": 1, "points": 1,
"category": "FontName", "category": "FontName",
"item": "/② 글씨체 (궁서)" "item": "/② 글씨체 (궁서)"
}, },
"10": { "10": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor", "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "", "searchValue": "",
"value": "58,220,255", "value": "186,255,26",
"points": 2, "points": 2,
"category": "Color", "category": "Color",
"item": "/③ 면색 : 색상(RGB:58,220,255)" "item": "/③ 면색 : 색상(RGB:186,255,26)"
}, },
"11": { "11": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right", "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right",
"searchValue": "", "searchValue": "",
"value": "3.0", "value": "3.0",
"tolerance": 1, "tolerance": 1,
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "/④ 본문과의 간격 : 3.0mm" "item": "/④ 본문과의 간격 : 3.0mm"
}, },
"12": { "12": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]", "path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "태양광, 풍력, 수소에너지 등 신재생 에너지 기술", "searchValue": "봄 매화, 여름 매실로 우리 함께 힐링합시다!",
"value": "BOLD", "value": "ITALIC",
"points": 2, "points": 2,
"category": "FontAttribute", "category": "FontAttribute",
"item": "문구 (태양광, 풍력, 수소에너지 등 신재생 에너지 기술)/① 진하게" "item": "문구 (봄 매화, 여름 매실로 우리 함께 힐링합시다!)/① 기울임"
}, },
"13": { "13": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]", "path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "태양광, 풍력, 수소에너지 등 신재생 에너지 기술", "searchValue": "봄 매화, 여름 매실로 우리 함께 힐링합시다!",
"value": "UNDERLINE", "value": "ITALIC",
"points": 2, "points": 2,
"category": "FontAttribute", "category": "FontAttribute",
"item": "문구 (태양광, 풍력, 수소에너지 등 신재생 에너지 기술)/② 밑줄" "item": "문구 (봄 매화, 여름 매실로 우리 함께 힐링합시다!)/② 기울임"
}, },
"14": { "14": {
"path": "//CHAR[contains(text(),'{char1}')]", "path": "//CHAR[contains(text(),'{char1}')]",
"path2": "//CHAR[contains(text(),'{char2}')]", "path2": "//CHAR[contains(text(),'{char2}')]",
"path3": "//CHAR[contains(text(),'{char3}')]", "path3": "//CHAR[contains(text(),'{char3}')]",
"char1": "", "char1": "",
"char2": "", "char2": "",
"char3": "※", "char3": "※",
"value": 3, "value": 3,
"points": 3, "points": 3,
"category": "SpecialChar", "category": "SpecialChar",
"item": "① , ② , ③ ※" "item": "① , ② , ③ ※"
}, },
"15": { "15": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape", "path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "행사안내", "searchValue": "축제안내",
"value": "중고딕", "value": "굴림체",
"points": 1, "points": 1,
"category": "FontName", "category": "FontName",
"item": "문구 (▶ 행사안내 )/① 글씨체 (중고딕)" "item": "문구 (→ 축제안내 )/① 글씨체 (굴림체)"
}, },
"16": { "16": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align", "path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "행사안내", "searchValue": "축제안내",
"value": "Center", "value": "Center",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (▶ 행사안내 )/② 정렬 (가운데 정렬)" "item": "문구 (→ 축제안내 )/② 정렬 (가운데 정렬)"
}, },
"17": { "17": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]", "hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "블로그(http://www.ihd.or.kr) 참조하여 온라인으로 등록", "searchValue": "광양매실축제 홈페이지(http://www.ihd.or.kr)",
"value": "BOLD", "value": "BOLD",
"points": 1, "points": 1,
"category": "FontAttribute", "category": "FontAttribute",
"item": "문구 (블로그(http://www.ihd.or.kr) 참조하여 온라인으로 등록)/① 진하게" "item": "문구 (광양매실축제 홈페이지(http://www.ihd.or.kr))/① 진하게"
}, },
"18": { "18": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]", "hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "블로그(http://www.ihd.or.kr) 참조하여 온라인으로 등록", "searchValue": "광양매실축제 홈페이지(http://www.ihd.or.kr)",
"value": "ITALIC", "value": "ITALIC",
"points": 1, "points": 1,
"category": "FontAttribute", "category": "FontAttribute",
"item": "문구 (블로그(http://www.ihd.or.kr) 참조하여 온라인으로 등록)/② 기울임" "item": "문구 (광양매실축제 홈페이지(http://www.ihd.or.kr))/② 기울임"
}, },
"19": { "19": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN", "path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN",
"searchValue": "기타사항", "searchValue": "기타사항",
"value": { "value": {
"Left": 10, "Left": 15,
"Indent": 12 "Indent": 12
}, },
"points": 2, "points": 2,
"category": "ParaShape", "category": "ParaShape",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (10pt), 내어쓰기 (12pt)", "item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (15pt), 내어쓰기 (12pt)",
"desc": "내부적으로 내어쓰기는 음수값 / JSON value값은 양수로 입력" "desc": "내부적으로 내어쓰기는 음수값 / JSON value값은 양수로 입력"
}, },
"20": { "20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height", "path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"searchValue": "2025. 04. 26.", "searchValue": "2025. 05. 24.",
"value": "1300", "value": "1400",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (2025. 04. 26.)/① 크기 (14pt)", "item": "문구 (2025. 05. 24.)/① 크기 (14pt)",
"desc": "1pt당 100" "desc": "1pt당 100"
}, },
"21": { "21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align", "path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "2025. 04. 26.", "searchValue": "2025. 05. 24.",
"value": "Center", "value": "Center",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (2025. 04. 26.)/② 정렬 (가운데 정렬)" "item": "문구 (2025. 05. 24.)/② 정렬 (가운데 정렬)"
}, },
"22": { "22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape", "path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "친환경에너지발전협의회", "searchValue": "광양매실축제위원회",
"value": "돋움", "value": "견고딕",
"points": 1, "points": 1,
"category": "FontName", "category": "FontName",
"item": "문구 (친환경에너지발전협의회)/① 글씨체 (돋움)" "item": "문구 (광양매실축제위원회)/① 글씨체 (견고딕)"
}, },
"23": { "23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "친환경에너지발전협의회", "searchValue": "광양매실축제위원회",
"value": "2700", "value": "2600",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (친환경에너지발전협의회)/② 크기 (27pt)" "item": "문구 (광양매실축제위원회)/② 크기 (26pt)"
}, },
"24": { "24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align", "path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"searchValue": "친환경에너지발전협의회", "searchValue": "광양매실축제위원회",
"value": "Center", "value": "Center",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (친환경에너지발전협의회)/③ 정렬 (가운데 정렬)" "item": "문구 (광양매실축제위원회)/③ 정렬 (가운데 정렬)"
}, },
"25": { "25": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape", "path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
@@ -280,16 +280,18 @@
}, },
"28": { "28": {
"path": "//PAGENUM/@FormatType", "path": "//PAGENUM/@FormatType",
"value": "HangulSyllable", "value": "CircledDigit",
"points": 2, "points": 2,
"category": "PageNumber", "category": "PageNumber",
"item": "① 쪽 번호 매기기 (A,B,C 순으로)", "item": "① 쪽 번호 매기기 (A,B,C 순으로)",
"desc1": { "desc1": {
"가,나,다":"HangulSyllable",
"1,2,3":"Digit", "1,2,3":"Digit",
"갑,을,병":"DecagonCircle",
"A,B,C":"LatinCapital",
"①,②,③":"CircledDigit", "①,②,③":"CircledDigit",
"가,나,다":"HangulSyllable",
"㉮,㉯,㉰":"CircledHangulSyllable",
"A,B,C":"LatinCapital",
"Ⓐ,Ⓑ,Ⓒ":"CircledLatinCapital",
"갑,을,병":"DecagonCircle",
"一,二,三":"Ideograph", "一,二,三":"Ideograph",
"㉠,㉡,㉢":"CircledHangulJamo", "㉠,㉡,㉢":"CircledHangulJamo",
"ⓐ,ⓑ,ⓒ":"CircledLatinSmall", "ⓐ,ⓑ,ⓒ":"CircledLatinSmall",
@@ -349,87 +351,87 @@
}, },
"4": { "4": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Width", "path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"searchValue": "친환경 에너지", "searchValue": "매화와 매실",
"value": "50", "value": "55",
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "문구 (친환경 에너지)/① 크기-너비 (50mm)" "item": "문구 (매화와 매실)/① 크기-너비 (55 mm)"
}, },
"5": { "5": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Height", "path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"searchValue": "친환경 에너지", "searchValue": "매화와 매실",
"value": "12", "value": "12",
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "문구 (친환경 에너지)/② 크기-높이 (12mm)" "item": "문구 (매화와 매실)/② 크기-높이 (12 mm)"
}, },
"6": { "6": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//LINESHAPE/@Style", "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//LINESHAPE/@Style",
"path2": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//LINESHAPE/@Width", "path2": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//LINESHAPE/@Width",
"searchValue": "친환경 에너지", "searchValue": "매화와 매실",
"value": [ "DoubleSlim", "283" ], "value": [ "DoubleSlim", "283" ],
"points": 2, "points": 2,
"category": "DoubleAnswer", "category": "DoubleAnswer",
"item": "문구 (친환경 에너지)/③ 테두리 : 이중 실선(1.00mm)", "item": "문구 (매화와 매실)/③ 테두리 : 이중 실선(1.00mm)",
"desc": "1mm = 283pt" "desc": "1mm = 283pt"
}, },
"7": { "7": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/@Ratio", "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/@Ratio",
"searchValue": "친환경 에너지", "searchValue": "매화와 매실",
"value": "20", "value": "20",
"points": 2, "points": 2,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (친환경 에너지)/④ 글상자 모서리 (둥근모양)", "item": "문구 (매화와 매실)/④ 글상자 모서리 (둥근모양)",
"desc": "모서리 비율 50이면 반원 / 20이면 둥근모양" "desc": "모서리 비율 50이면 반원 / 20이면 둥근모양"
}, },
"8": { "8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor", "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "친환경 에너지", "searchValue": "매화와 매실",
"value": "53,135,145", "value": "122,179,64",
"points": 2, "points": 2,
"category": "Color", "category": "Color",
"item": "문구 (친환경 에너지)/⑤ 채우기 : 색상(RGB:53,135,145)" "item": "문구 (매화와 매실)/⑤ 채우기 : 색상(RGB:122,179,64)"
}, },
"9": { "9": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/POSITION/@TreatAsChar", "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "친환경 에너지", "searchValue": "매화와 매실",
"value": "true", "value": "true",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (친환경 에너지)/⑥ 글상자 위치 (글자처럼 취급)" "item": "문구 (매화와 매실)/⑥ 글상자 위치 (글자처럼 취급)"
}, },
"10": { "10": {
"path": "//PARASHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::P[last()]/@ParaShape]/@Align", "path": "//PARASHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::P[last()]/@ParaShape]/@Align",
"searchValue": "친환경 에너지", "searchValue": "매화와 매실",
"value": "Center", "value": "Center",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (친환경 에너지)/⑦ 글상자 정렬 (가운데 정렬)" "item": "문구 (매화와 매실)/⑦ 글상자 정렬 (가운데 정렬)"
}, },
"11": { "11": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape", "path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "친환경 에너지", "searchValue": "매화와 매실",
"value": "궁서체", "value": "중고딕",
"points": 1, "points": 1,
"category": "FontName", "category": "FontName",
"item": "문구 (친환경 에너지)/⑧ 글씨체 (궁서체)" "item": "문구 (매화와 매실)/⑧ 글씨체 (중고딕)"
}, },
"12": { "12": {
"path": "//CHARSHAPE[@Id=//RECTANGLE//TEXT[./CHAR[text()='{searchValue}']]/@CharShape]/@Height", "path": "//CHARSHAPE[@Id=//RECTANGLE//TEXT[./CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "친환경 에너지", "searchValue": "매화와 매실",
"value": "2000", "value": "2000",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (친환경 에너지)/⑨ 글씨크기 (20pt)", "item": "문구 (매화와 매실)/⑨ 글씨크기 (20 pt)",
"desc":"1pt당 100" "desc":"1pt당 100"
}, },
"13": { "13": {
"path": "//PARASHAPE[@Id=//RECTANGLE//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align", "path": "//PARASHAPE[@Id=//RECTANGLE//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "친환경 에너지", "searchValue": "매화와 매실",
"value": "Center", "value": "Center",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (친환경 에너지)/⑩ 정렬 (가운데 정렬)" "item": "문구 (매화와 매실)/⑩ 정렬 (가운데 정렬)"
}, },
"14": { "14": {
"path": "boolean(//PICTURE//SHAPECOMMENT[contains(text(),'{searchValue}')])", "path": "boolean(//PICTURE//SHAPECOMMENT[contains(text(),'{searchValue}')])",
@@ -467,92 +469,98 @@
"category": "mmSize", "category": "mmSize",
"item": "⑤ 위치 (어울림 : 세로-쪽의 위 24mm)" "item": "⑤ 위치 (어울림 : 세로-쪽의 위 24mm)"
}, },
"19": { "19": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape", "path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "1. 친환경 에너지 개요", "searchValue": "1. 매화의 특징",
"value": "돋움", "value": "돋움",
"points": 1, "points": 1,
"category": "FontName", "category": "FontName",
"item": "문구① (1. 친환경 에너지 개요)/① 글씨체 (돋움)" "item": "문구① (1. 매화의 특징)/① 글씨체 (돋움)"
}, },
"20": { "20": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "1. 친환경 에너지 개요", "searchValue": "1. 매화의 특징",
"value": "1200", "value": "1200",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구① (1. 친환경 에너지 개요)/② 크기 (12pt)" "item": "문구① (1. 매화의 특징)/② 크기 (12pt)"
}, },
"21": { "21": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "1. 친환경 에너지 개요", "searchValue": "1. 매화의 특징",
"value": "BOLD", "value": "BOLD",
"points": 1, "points": 1,
"category": "FontAttribute", "category": "FontAttribute",
"item": "문구① (1. 친환경 에너지 개요)/③ 진하게" "item": "문구① (1. 매화의 특징)/③ 진하게"
}, },
"22": { "22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape", "path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "2. 신재생 에너지", "searchValue": "2. 매실의 효능",
"value": "돋움", "value": "돋움",
"points": 1, "points": 1,
"category": "FontName", "category": "FontName",
"item": "문구② (2. 신재생 에너지)/① 글씨체 (돋움)" "item": "문구② (2. 매실의 효능)/① 글씨체 (돋움)"
}, },
"23": { "23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "2. 신재생 에너지", "searchValue": "2. 매실의 효능",
"value": "1200", "value": "1200",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구② (2. 신재생 에너지)/② 크기 (12pt)" "item": "문구② (2. 매실의 효능)/② 크기 (12pt)"
}, },
"24": { "24": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "2. 신재생 에너지", "searchValue": "2. 매실의 효능",
"value": "BOLD", "value": "BOLD",
"points": 1, "points": 1,
"category": "FontAttribute", "category": "FontAttribute",
"item": "문구② (2. 신재생 에너지)/③ 진하게" "item": "문구② (2. 매실의 효능)/③ 진하게"
}, },
"25": { "25": {
"path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)", "path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)", "path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)",
"option": "태양전지", "option": "문인화",
"value": true, "value": true,
"points": 2, "points": 2,
"category": "Boolean", "category": "Boolean",
"item": "문구 (태양전지)/① 각주 설정 및 문구 입력" "item": "문구 (문인화)/① 각주 설정 및 문구 입력"
}, },
"26": { "26": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape", "path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "태양의 빛에너지를 전기에너지로 변환시켜 전기를 발생하는 장치로 친환경 방식으로 알려져 있음", "searchValue": "그림을 직업으로 하지 않는 선비나 사대부들이 여흥으로 자신들의 심중을 표현하여 그린 그림",
"value": "굴림", "value": "돋움체",
"points": 1, "points": 1,
"category": "FontName", "category": "FontName",
"item": "문구 (태양전지)/② 글씨체 (굴림)" "item": "문구 (문인화)/② 글씨체 (돋움체)"
}, },
"27": { "27": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height",
"searchValue": "태양의 빛에너지를 전기에너지로 변환시켜 전기를 발생하는 장치로 친환경 방식으로 알려져 있음", "searchValue": "그림을 직업으로 하지 않는 선비나 사대부들이 여흥으로 자신들의 심중을 표현하여 그린 그림",
"value": "900", "value": "900",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (태양전지)/③ 크기 (9pt)" "item": "문구 (문인화)/③ 크기 (9pt)"
}, },
"28": { "28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type", "path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"searchValue": "태양의 빛에너지를 전기에너지로 변환시켜 전기를 발생하는 장치로 친환경 방식으로 알려져 있음", "searchValue": "그림을 직업으로 하지 않는 선비나 사대부들이 여흥으로 자신들의 심중을 표현하여 그린 그림",
"value": "CircledHangulJamo", "value": "CircledHangulSyllable",
"points": 2, "points": 2,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (태양전지)/④ 각주 번호모양", "item": "문구 (문인화)/④ 각주 번호모양",
"desc": { "desc": {
"가,나,다":"HangulSyllable",
"1,2,3":"Digit", "1,2,3":"Digit",
"갑,을,병":"DecagonCircle",
"A,B,C":"LatinCapital",
"①,②,③":"CircledDigit", "①,②,③":"CircledDigit",
"가,나,다":"HangulSyllable",
"㉮,㉯,㉰":"CircledHangulSyllable",
"A,B,C":"LatinCapital",
"Ⓐ,Ⓑ,Ⓒ":"CircledLatinCapital",
"갑,을,병":"DecagonCircle",
"一,二,三":"Ideograph", "一,二,三":"Ideograph",
"㉠,㉡,㉢":"CircledHangulJamo", "㉠,㉡,㉢":"CircledHangulJamo",
"ⓐ,ⓑ,ⓒ":"CircledLatinSmall", "ⓐ,ⓑ,ⓒ":"CircledLatinSmall",
@@ -560,82 +568,83 @@
"정답에 맞는 값 value에 입력":"" "정답에 맞는 값 value에 입력":""
} }
}, },
"29": { "29": {
"path": "boolean(//CHAR[contains(text(),'Campaign')])", "path": "boolean(//CHAR[contains(text(),'Vitamin')])",
"ignoreWord": "Campaign", "ignoreWord": "Vitamin",
"value": true, "value": true,
"points": 3, "points": 3,
"category": "Boolean", "category": "Boolean",
"item": "Campaign/영단어 미입력, 대소문자/오타 시 전체 감점", "item": "Vitamin/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": "유사도 검사를 진행하지 않고 영단어가 모두 일치해야 하므로 xpath구문 내 단어도 수정필요" "desc": "유사도 검사를 진행하지 않고 영단어가 모두 일치해야 하므로 xpath구문 내 단어도 수정필요"
}, },
"30": { "30": {
"path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]", "path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]",
"word":[ "word":[
["저감", "低減"], ["매향", "梅香"],
["화석", "化石"], ["불의", "不義"],
["투자", "投資"], ["국화", "菊花"],
["달성", "達成"], ["매실", "梅實"],
["세금", "稅金"] ["해독", "解讀"]
], ],
"value": 10, "value": 10,
"points": 10, "points": 10,
"category": "Hanja", "category": "Hanja",
"item": "① 저감(低減), ② 화석(化石), ③ 투자(投資), ④ 달성(達成), ⑤ 세금(稅金)" "item": "① 매향(梅香), ② 불의(不義), ③ 국화(菊花), ④ 매실(梅實), ⑤ 해독(解讀)"
}, },
"31": { "31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'택을제공')])", "path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'흰색,분홍')])",
"value": true, "value": true,
"points": 3, "points": 3,
"category": "Boolean", "category": "Boolean",
"item": "문구 (…세금 혜택이 제공하고 있으며…)/\"이\" → \"을\" 글자바꿈" "item": "문구 (청색, 분홍색, 붉은색 등 다양한 색을…)/청 → 흰 글자바꿈"
}, },
"32": { "32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'탄소배출')])", "path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'킨과폴리')])",
"value": true, "value": true,
"points": 3, "points": 3,
"category": "Boolean", "category": "Boolean",
"item": "문구 (…배출 탄소 규제가 강화되면서…)/\"배출\" / \"탄소\" 순서바꿈" "item": "문구 (항산화 성분인 폴리페놀은 카테킨과 해독(解讀)과…)/ 폴리페놀은 / 카테킨과 순서바꿈"
}, },
"33": { "33": {
"path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape", "path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape",
"searchValue": "친환경 에너지 성장률(단위: %)", "searchValue": "광양매실축제 만족도(단위 : %)",
"value": "돋움", "value": "굴림체",
"points": 1, "points": 1,
"category": "FontName", "category": "FontName",
"item": "제목 문구 (친환경 에너지 성장률(단위: %))/① 글씨체 (돋움)" "item": "제목 문구 (광양매실축제 만족도(단위 : %))/① 글씨체 (굴림체)"
}, },
"34": { "34": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "친환경 에너지 성장률(단위: %)", "searchValue": "광양매실축제 만족도(단위 : %)",
"value": "1200", "value": "1200",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "제목 문구 (친환경 에너지 성장률(단위: %))/② 크기 (12pt)" "item": "제목 문구 (광양매실축제 만족도(단위 : %))/② 크기 (12pt)"
}, },
"35": { "35": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "친환경 에너지 성장률(단위: %)", "searchValue": "광양매실축제 만족도(단위 : %)",
"value": "BOLD", "value": "BOLD",
"points": 1, "points": 1,
"category": "FontAttribute", "category": "FontAttribute",
"item": "제목 문구 (친환경 에너지 성장률(단위: %))/③ 진하게" "item": "제목 문구 (광양매실축제 만족도(단위 : %))/③ 진하게"
}, },
"36": { "36": {
"path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align", "path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "친환경 에너지 성장률(단위: %)", "searchValue": "광양매실축제 만족도(단위 : %)",
"value": "Center", "value": "Center",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "제목 문구 (친환경 에너지 성장률(단위: %))/④ 정렬 (가운데 정렬)" "item": "제목 문구 (광양매실축제 만족도(단위 : %))/④ 정렬 (가운데 정렬)"
}, },
"37": { "37": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor", "path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor", "path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"value": "202,86,167", "value": "233,174,43",
"points": 2, "points": 2,
"category": "Color", "category": "Color",
"item": "위쪽 제목 셀/① 색상(RGB:202,86,167)" "item": "위쪽 제목 셀/① 색상(RGB:233,174,43)"
}, },
"38": { "38": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]", "path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]",
@@ -664,11 +673,11 @@
"41": { "41": {
"path": "//TABLE//TEXT/@CharShape", "path": "//TABLE//TEXT/@CharShape",
"path2": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name", "path2": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"value": "중고딕", "value": "돋움",
"points": 1, "points": 1,
"category": "TableFontName", "category": "TableFontName",
"category_tmp": "FontName", "category_tmp": "FontName",
"item": "글자모양/① 글씨체 (중고딕)", "item": "글자모양/① 글씨체 (돋움)",
"desc": "테이블 폰트명 문항은 테이블의 모든 셀이 정답폰트와 일치해야 함, 하나만 일치해도 정답으로 채점할 경우 category값을 FontName으로 변경" "desc": "테이블 폰트명 문항은 테이블의 모든 셀이 정답폰트와 일치해야 함, 하나만 일치해도 정답으로 채점할 경우 category값을 FontName으로 변경"
}, },
"42": { "42": {
@@ -696,11 +705,11 @@
}, },
"45": { "45": {
"chart_xpath": "", "chart_xpath": "",
"chart_type": "꺾은선형", "chart_type": "묶은세로막대형",
"value": true, "value": true,
"points": 2, "points": 2,
"category": "ChartType", "category": "ChartType",
"item": "① 종류 (꺾은선형)", "item": "① 종류 (묶은세로막대형)",
"desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)" "desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)"
}, },
"46": { "46": {
@@ -720,10 +729,10 @@
}, },
"48": { "48": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Height", "path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Height",
"value": "80", "value": "90",
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "④ 크기-높이 (80 mm)" "item": "④ 크기-높이 (90 mm)"
}, },
"49": { "49": {
"chart_xpath": "boolean(//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계' or text()='평균']))", "chart_xpath": "boolean(//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계' or text()='평균']))",
@@ -735,42 +744,42 @@
}, },
"50": { "50": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface", "chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"searchValue": "친환경 에너지 성장률", "searchValue": "광양매실축제 만족도",
"value": "궁서체", "value": "궁서체",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "제목 문구 (친환경 에너지 성장률)/① 글씨체 (궁서체)" "item": "제목 문구 (광양매실축제 만족도)/① 글씨체 (궁서체)"
}, },
"51": { "51": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz", "chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"searchValue": "친환경 에너지 성장률", "searchValue": "광양매실축제 만족도",
"value": "1300", "value": "1300",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "제목 문구 (친환경 에너지 성장률)/② 크기 (13pt)" "item": "제목 문구 (광양매실축제 만족도)/② 크기 (13pt)"
}, },
"52": { "52": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}", "chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}",
"option": "b", "option": "b",
"searchValue": "친환경 에너지 성장률", "searchValue": "광양매실축제 만족도",
"value": "1", "value": "1",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "제목 문구 (친환경 에너지 성장률)/③ 진하게", "item": "제목 문구 (광양매실축제 만족도)/③ 진하게",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b" "desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
}, },
"53": { "53": {
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface", "chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface",
"value": "바탕", "value": "바탕",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "ChartOneAnswer",
"item": "X축/① 글꼴 (바탕)" "item": "X축/① 글꼴 (바탕)"
}, },
"54": { "54": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@sz", "chart_xpath": "//c:catAx/c:txPr//a:defRPr/@sz",
"value": "900", "value": "900",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "ChartOneAnswer",
"item": "X축/② 크기 (9pt)" "item": "X축/② 크기 (9pt)"
}, },
"55": { "55": {
@@ -778,7 +787,7 @@
"option": "i", "option": "i",
"value": "1", "value": "1",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "ChartOneAnswer",
"item": "X축/③ 기울임", "item": "X축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b" "desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
}, },
@@ -786,14 +795,14 @@
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface", "chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface",
"value": "바탕", "value": "바탕",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "ChartOneAnswer",
"item": "Y축/① 글꼴 (바탕)" "item": "Y축/① 글꼴 (바탕)"
}, },
"57": { "57": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@sz", "chart_xpath": "//c:valAx/c:txPr//a:defRPr/@sz",
"value": "900", "value": "900",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "ChartOneAnswer",
"item": "Y축/② 크기 (9pt)" "item": "Y축/② 크기 (9pt)"
}, },
"58": { "58": {
@@ -801,7 +810,7 @@
"option": "i", "option": "i",
"value": "1", "value": "1",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "ChartOneAnswer",
"item": "Y축/③ 기울임", "item": "Y축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b" "desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
}, },

View File

@@ -46,65 +46,65 @@
"1": { "1": {
"1": { "1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName", "path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"searchValue": "서울국제도서박람회", "searchValue": "별사랑천문대캠프안내",
"value": "돋움", "value": "궁서체",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (서울국제도서박람회)/① 글씨체 (돋움)" "item": "문구 (별사랑천문대캠프안내)/① 글씨체 (궁서체)"
}, },
"2": { "2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor", "path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"searchValue": "서울국제도서박람회", "searchValue": "별사랑천문대캠프안내",
"value": "28,61,98", "value": "53,164,78",
"points": 2, "points": 2,
"category": "Color", "category": "Color",
"item": "문구 (서울국제도서박람회)/② 채우기 : 색상(RGB:100,170,92)" "item": "문구 (별사랑천문대캠프안내)/② 채우기 : 색상(RGB:53,164,78)"
}, },
"3": { "3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width", "path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"searchValue": "서울국제도서박람회", "searchValue": "별사랑천문대캠프안내",
"value": "100", "value": "120",
"tolerance": 1, "tolerance": 1,
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "문구 (서울국제도서박람회)/③ 크기-너비 (100mm)" "item": "문구 (별사랑천문대캠프안내)/③ 크기-너비 (120 mm)"
}, },
"4": { "4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height", "path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"searchValue": "서울국제도서박람회", "searchValue": "별사랑천문대캠프안내",
"value": "20", "value": "20",
"tolerance": 1, "tolerance": 1,
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "문구 (서울국제도서박람회)/④ 크기-높이 (20mm)" "item": "문구 (별사랑천문대캠프안내)/④ 크기-높이 (20 mm)"
}, },
"5": { "5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar", "path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "서울국제도서박람회", "searchValue": "별사랑천문대캠프안내",
"value": "true", "value": "true",
"points": 2, "points": 2,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (서울국제도서박람회)/⑤ 위치 (글자처럼 취급)" "item": "문구 (별사랑천문대캠프안내)/⑤ 위치 (글자처럼 취급)"
}, },
"6": { "6": {
"path":"//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align", "path":"//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "서울국제도서박람회", "searchValue": "별사랑천문대캠프안내",
"value": "Center", "value": "Center",
"points": 2, "points": 2,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (서울국제도서박람회)/⑥ 정렬 (가운데 정렬)" "item": "문구 (별사랑천문대캠프안내)/⑥ 정렬 (가운데 정렬)"
}, },
"7": { "7": {
"path": "//TEXTART[@Text='{searchValue}']", "path": "//TEXTART[@Text='{searchValue}']",
"searchValue": "서울국제도서박람회", "searchValue": "별사랑천문대캠프안내",
"value": true, "value": true,
"points": 2, "points": 2,
"category": "Boolean", "category": "Boolean",
"item": "문구 (서울국제도서박람회)/⑦ 글맵시모양 (육안확인)" "item": "문구 (별사랑천문대캠프안내)/⑦ 글맵시모양 (육안확인)"
}, },
"8": { "8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE", "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE",
"searchValue": "", "searchValue": "",
"value": { "value": {
"Height": 2800, "Height": 2800,
"Width": 2800 "Width": 2800
@@ -112,155 +112,155 @@
"tolerance": 200, "tolerance": 200,
"points": 1, "points": 1,
"category": "TwoLineSize", "category": "TwoLineSize",
"item": "/① 모양 (2줄)" "item": "/① 모양 (2줄)"
}, },
"9": { "9": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape", "path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "", "searchValue": "",
"value": "돋움", "value": "굴림체",
"points": 1, "points": 1,
"category": "FontName", "category": "FontName",
"item": "/② 글씨체 (돋움)" "item": "/② 글씨체 (굴림체)"
}, },
"10": { "10": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor", "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "", "searchValue": "",
"value": "206,166,29", "value": "211,202,24",
"points": 2, "points": 2,
"category": "Color", "category": "Color",
"item": "/③ 면색 : 색상(RGB:206,166,29)" "item": "/③ 면색 : 색상(RGB:211,202,24)"
}, },
"11": { "11": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right", "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right",
"searchValue": "", "searchValue": "",
"value": "3.0", "value": "3.0",
"tolerance": 1, "tolerance": 1,
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "/④ 본문과의 간격 : 3.0mm" "item": "/④ 본문과의 간격 : 3.0mm"
}, },
"12": { "12": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]", "path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "문학, 인문학, 어린이/청소년 도서, 전자책, 독립 출판", "searchValue": "천문우주과학 체험학습",
"value": "BOLD", "value": "BOLD",
"points": 2, "points": 2,
"category": "FontAttribute", "category": "FontAttribute",
"item": "문구 (문학, 인문학, 어린이/청소년 도서, 전자책, 독립 출판)/① 진하게" "item": "문구 (천문우주과학 체험학습)/① 진하게"
}, },
"13": { "13": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]", "path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "문학, 인문학, 어린이/청소년 도서, 전자책, 독립 출판", "searchValue": "천문우주과학 체험학습",
"value": "ITALIC", "value": "UNDERLINE",
"points": 2, "points": 2,
"category": "FontAttribute", "category": "FontAttribute",
"item": "문구 (문학, 인문학, 어린이/청소년 도서, 전자책, 독립 출판)/② 기울임" "item": "문구 (천문우주과학 체험학습)/② 밑줄"
}, },
"14": { "14": {
"path": "//CHAR[contains(text(),'{char1}')]", "path": "//CHAR[contains(text(),'{char1}')]",
"path2": "//CHAR[contains(text(),'{char2}')]", "path2": "//CHAR[contains(text(),'{char2}')]",
"path3": "//CHAR[contains(text(),'{char3}')]", "path3": "//CHAR[contains(text(),'{char3}')]",
"char1": "", "char1": "",
"char2": "", "char2": "",
"char3": "※", "char3": "※",
"value": 3, "value": 3,
"points": 3, "points": 3,
"category": "SpecialChar", "category": "SpecialChar",
"item": "① , ② , ③ ※" "item": "① , ② , ③ ※"
}, },
"15": { "15": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape", "path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "행사안내", "searchValue": "참가안내",
"value": "궁서", "value": "굴림",
"points": 1, "points": 1,
"category": "FontName", "category": "FontName",
"item": "문구 (◆ 행사안내 )/① 글씨체 (궁서)" "item": "문구 (● 참가안내 )/① 글씨체 (굴림)"
}, },
"16": { "16": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align", "path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "행사안내", "searchValue": "참가안내",
"value": "Center", "value": "Center",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (◆ 행사안내 )/② 정렬 (가운데 정렬)" "item": "문구 (● 참가안내 )/② 정렬 (가운데 정렬)"
}, },
"17": { "17": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]", "hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "서울 국제 도서 박람회 홈페이지(http://www.ihd.or.kr) 참조", "searchValue": "그룹별 20명(선착순 마감)",
"value": "ITALIC", "value": "ITALIC",
"points": 1, "points": 1,
"category": "FontAttribute", "category": "FontAttribute",
"item": "문구 (서울 국제 도서 박람회 홈페이지(http://www.ihd.or.kr) 참조)/① 기울임" "item": "문구 (그룹별 20명(선착순 마감))/① 기울임"
}, },
"18": { "18": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]", "hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "서울 국제 도서 박람회 홈페이지(http://www.ihd.or.kr) 참조", "searchValue": "그룹별 20명(선착순 마감)",
"value": "UNDERLINE", "value": "UNDERLINE",
"points": 1, "points": 1,
"category": "FontAttribute", "category": "FontAttribute",
"item": "문구 (서울 국제 도서 박람회 홈페이지(http://www.ihd.or.kr) 참조)/② 밑줄" "item": "문구 (그룹별 20명(선착순 마감))/② 밑줄"
}, },
"19": { "19": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN", "path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN",
"searchValue": "기타사항", "searchValue": "기타사항",
"value": { "value": {
"Left": 15, "Left": 15,
"Indent": 12 "Indent": 14
}, },
"points": 2, "points": 2,
"category": "ParaShape", "category": "ParaShape",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (10pt), 내어쓰기 (12pt)", "item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (15pt), 내어쓰기 (14pt)",
"desc": "내부적으로 내어쓰기는 음수값 / JSON value값은 양수로 입력" "desc": "내부적으로 내어쓰기는 음수값 / JSON value값은 양수로 입력"
}, },
"20": { "20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height", "path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"searchValue": "2025. 04. 26.", "searchValue": "2025. 05. 24.",
"value": "1300", "value": "1400",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (2025. 04. 26.)/① 크기 (14pt)", "item": "문구 (2025. 05. 24.)/① 크기 (14pt)",
"desc": "1pt당 100" "desc": "1pt당 100"
}, },
"21": { "21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align", "path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "2025. 04. 26.", "searchValue": "2025. 05. 24.",
"value": "Center", "value": "Center",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (2025. 04. 26.)/② 정렬 (가운데 정렬)" "item": "문구 (2025. 05. 24.)/② 정렬 (가운데 정렬)"
}, },
"22": { "22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape", "path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "서울국제도서박람회", "searchValue": "별사랑천문대",
"value": "견고딕", "value": "견고딕",
"points": 1, "points": 1,
"category": "FontName", "category": "FontName",
"item": "문구 (서울국제도서박람회)/① 글씨체 (견고딕)" "item": "문구 (별사랑천문대)/① 글씨체 (견고딕)"
}, },
"23": { "23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "서울국제도서박람회", "searchValue": "별사랑천문대",
"value": "2500", "value": "2600",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (서울국제도서박람회)/② 크기 (25pt)" "item": "문구 (별사랑천문대)/② 크기 (26pt)"
}, },
"24": { "24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align", "path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"searchValue": "서울국제도서박람회", "searchValue": "별사랑천문대",
"value": "Center", "value": "Center",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (서울국제도서박람회)/③ 정렬 (가운데 정렬)" "item": "문구 (별사랑천문대)/③ 정렬 (가운데 정렬)"
}, },
"25": { "25": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape", "path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "DIAT", "searchValue": "DIAT",
"value": "중고딕", "value": "돋움",
"points": 1, "points": 1,
"category": "FontName", "category": "FontName",
"item": "문구 (DIAT)/① 글꼴 (중고딕)" "item": "문구 (DIAT)/① 글꼴 (돋움)"
}, },
"26": { "26": {
"path": "//CHARSHAPE[@Id=//SECTION[1]//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height", "path": "//CHARSHAPE[@Id=//SECTION[1]//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
@@ -280,16 +280,18 @@
}, },
"28": { "28": {
"path": "//PAGENUM/@FormatType", "path": "//PAGENUM/@FormatType",
"value": "RomanSmall", "value": "LatinCapital",
"points": 2, "points": 2,
"category": "PageNumber", "category": "PageNumber",
"item": "① 쪽 번호 매기기 (A,B,C 순으로)", "item": "① 쪽 번호 매기기 (A,B,C 순으로)",
"desc1": { "desc1": {
"가,나,다":"HangulSyllable",
"1,2,3":"Digit", "1,2,3":"Digit",
"갑,을,병":"DecagonCircle",
"A,B,C":"LatinCapital",
"①,②,③":"CircledDigit", "①,②,③":"CircledDigit",
"가,나,다":"HangulSyllable",
"㉮,㉯,㉰":"CircledHangulSyllable",
"A,B,C":"LatinCapital",
"Ⓐ,Ⓑ,Ⓒ":"CircledLatinCapital",
"갑,을,병":"DecagonCircle",
"一,二,三":"Ideograph", "一,二,三":"Ideograph",
"㉠,㉡,㉢":"CircledHangulJamo", "㉠,㉡,㉢":"CircledHangulJamo",
"ⓐ,ⓑ,ⓒ":"CircledLatinSmall", "ⓐ,ⓑ,ⓒ":"CircledLatinSmall",
@@ -300,7 +302,7 @@
}, },
"29": { "29": {
"path": "//PAGENUM/@Pos", "path": "//PAGENUM/@Pos",
"value": "BottomRight", "value": "BottomCenter",
"points": 2, "points": 2,
"category": "PageNumber", "category": "PageNumber",
"item": "가운데 아래", "item": "가운데 아래",
@@ -349,88 +351,87 @@
}, },
"4": { "4": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Width", "path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"searchValue": "출판 산업 트렌드", "searchValue": "별자리",
"value": "70", "value": "60",
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "문구 (출판 산업 트렌드)/① 크기-너비 (70mm)" "item": "문구 (별자리)/① 크기-너비 (60 mm)"
}, },
"5": { "5": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Height", "path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"searchValue": "출판 산업 트렌드", "searchValue": "별자리",
"value": "12", "value": "12",
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "문구 (출판 산업 트렌드)/② 크기-높이 (12mm)" "item": "문구 (별자리)/② 크기-높이 (12mm)"
}, },
"6": { "6": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//LINESHAPE/@Style", "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//LINESHAPE/@Style",
"path2": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//LINESHAPE/@Width", "path2": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//LINESHAPE/@Width",
"searchValue": "출판 산업 트렌드", "searchValue": "별자리",
"value": [ "DoubleSlim", "283" ], "value": [ "DoubleSlim", "283" ],
"points": 2, "points": 2,
"category": "DoubleAnswer", "category": "DoubleAnswer",
"item": "문구 (출판 산업 트렌드)/③ 테두리 : 이중 실선(1.00mm)", "item": "문구 (별자리)/③ 테두리 : 이중 실선(1.00mm)",
"desc": "1mm = 283pt" "desc": "1mm = 283pt"
}, },
"7": { "7": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/@Ratio", "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/@Ratio",
"searchValue": "출판 산업 트렌드", "searchValue": "별자리",
"value": "50", "value": "20",
"points": 2, "points": 2,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (출판 산업 트렌드)/④ 글상자 모서리 (반원)", "item": "문구 (별자리)/④ 글상자 모서리 (반원)",
"desc": "모서리 비율 50이면 반원 / 20이면 둥근모양" "desc": "모서리 비율 50이면 반원 / 20이면 둥근모양"
}, },
"8": { "8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor", "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "출판 산업 트렌드", "searchValue": "별자리",
"value": "106,82,82", "value": "191,179,233",
"points": 2, "points": 2,
"category": "Color", "category": "Color",
"item": "문구 (출판 산업 트렌드)/⑤ 채우기 : 색상(RGB:106,82,82)" "item": "문구 (별자리)/⑤ 채우기 : 색상(RGB:191,179,233)"
}, },
"9": { "9": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/POSITION/@TreatAsChar", "path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "출판 산업 트렌드", "searchValue": "별자리",
"value": "true", "value": "true",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (출판 산업 트렌드)/⑥ 글상자 위치 (글자처럼 취급)" "item": "문구 (별자리)/⑥ 글상자 위치 (글자처럼 취급)"
}, },
"10": { "10": {
"path": "//PARASHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::P[last()]/@ParaShape]/@Align", "path": "//PARASHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::P[last()]/@ParaShape]/@Align",
"searchValue": "출판 산업 트렌드", "searchValue": "별자리",
"value": "Center", "value": "Center",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (출판 산업 트렌드)/⑦ 글상자 정렬 (가운데 정렬)" "item": "문구 (별자리)/⑦ 글상자 정렬 (가운데 정렬)"
}, },
"11": { "11": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape", "path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "출판 산업 트렌드", "searchValue": "별자리",
"value": "휴먼옛체", "value": "중고딕",
"points": 1, "points": 1,
"category": "FontName", "category": "FontName",
"item": "문구 (출판 산업 트렌드)/⑧ 글씨체 (휴먼옛체)", "item": "문구 (별자리)/⑧ 글씨체 (중고딕)"
"desc": "폰트 '견고딕'과 '중고딕'은 한글프로그램 내부적으로 '한양견고딕', '한양중고딕'처리 되어서 프로그램 내부에서 수험자 답변에서 '한양'을 제거하는 과정을 거침"
}, },
"12": { "12": {
"path": "//CHARSHAPE[@Id=//RECTANGLE//TEXT[./CHAR[text()='{searchValue}']]/@CharShape]/@Height", "path": "//CHARSHAPE[@Id=//RECTANGLE//TEXT[./CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "출판 산업 트렌드", "searchValue": "별자리",
"value": "2000", "value": "1600",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (출판 산업 트렌드)/⑨ 글씨크기 (20pt)", "item": "문구 (별자리)/⑨ 글씨크기 (16pt)",
"desc":"1pt당 100" "desc":"1pt당 100"
}, },
"13": { "13": {
"path": "//PARASHAPE[@Id=//RECTANGLE//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align", "path": "//PARASHAPE[@Id=//RECTANGLE//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "출판 산업 트렌드", "searchValue": "별자리",
"value": "Center", "value": "Center",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (출판 산업 트렌드)/⑩ 정렬 (가운데 정렬)" "item": "문구 (별자리)/⑩ 정렬 (가운데 정렬)"
}, },
"14": { "14": {
"path": "boolean(//PICTURE//SHAPECOMMENT[contains(text(),'{searchValue}')])", "path": "boolean(//PICTURE//SHAPECOMMENT[contains(text(),'{searchValue}')])",
@@ -468,92 +469,98 @@
"category": "mmSize", "category": "mmSize",
"item": "⑤ 위치 (어울림 : 세로-쪽의 위 24mm)" "item": "⑤ 위치 (어울림 : 세로-쪽의 위 24mm)"
}, },
"19": { "19": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape", "path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "1. 출판 산업의 확장", "searchValue": "1. 별자리란",
"value": "굴림", "value": "돋움체",
"points": 1, "points": 1,
"category": "FontName", "category": "FontName",
"item": "문구① (1. 출판 산업의 확장)/① 글씨체 (굴림)" "item": "문구① (1. 별자리란)/① 글씨체 (돋움체)"
}, },
"20": { "20": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "1. 출판 산업의 확장", "searchValue": "1. 별자리란",
"value": "1200", "value": "1200",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구① (1. 출판 산업의 확장)/② 크기 (12pt)" "item": "문구① (1. 별자리란)/② 크기 (12pt)"
}, },
"21": { "21": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "1. 출판 산업의 확장", "searchValue": "1. 별자리란",
"value": "BOLD", "value": "BOLD",
"points": 1, "points": 1,
"category": "FontAttribute", "category": "FontAttribute",
"item": "문구① (1. 출판 산업의 확장)/③ 진하게" "item": "문구① (1. 별자리란)/③ 진하게"
}, },
"22": { "22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape", "path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "2. 도서 박람회의 가치", "searchValue": "2. 우리나라 계절별 별자리",
"value": "굴림", "value": "돋움체",
"points": 1, "points": 1,
"category": "FontName", "category": "FontName",
"item": "문구② (2. 도서 박람회의 가치)/① 글씨체 (굴림)" "item": "문구② (2. 우리나라 계절별 별자리)/① 글씨체 (돋움체)"
}, },
"23": { "23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "2. 도서 박람회의 가치", "searchValue": "2. 우리나라 계절별 별자리",
"value": "1200", "value": "1200",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구② (2. 도서 박람회의 가치)/② 크기 (12pt)" "item": "문구② (2. 우리나라 계절별 별자리)/② 크기 (12pt)"
}, },
"24": { "24": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "2. 도서 박람회의 가치", "searchValue": "2. 우리나라 계절별 별자리",
"value": "BOLD", "value": "BOLD",
"points": 1, "points": 1,
"category": "FontAttribute", "category": "FontAttribute",
"item": "문구② (2. 도서 박람회의 가치)/③ 진하게" "item": "문구② (2. 우리나라 계절별 별자리)/③ 진하게"
}, },
"25": { "25": {
"path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)", "path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)", "path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)",
"option": "오디오북", "option": "북두칠성",
"value": true, "value": true,
"points": 2, "points": 2,
"category": "Boolean", "category": "Boolean",
"item": "문구 (오디오북)/① 각주 설정 및 문구 입력" "item": "문구 (북두칠성)/① 각주 설정 및 문구 입력"
}, },
"26": { "26": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape", "path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "눈으로 읽는 대신 귀로 들을 수 있게 책의 내용(문자)을 음성으로 녹음하여 기록한 것을 의미함", "searchValue": "큰곰자리의 꼬리에 해당하는 7개의 별",
"value": "궁서", "value": "굴림",
"points": 1, "points": 1,
"category": "FontName", "category": "FontName",
"item": "문구 (오디오북)/② 글씨체 (궁서)" "item": "문구 (북두칠성)/② 글씨체 (굴림)"
}, },
"27": { "27": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height",
"searchValue": "눈으로 읽는 대신 귀로 들을 수 있게 책의 내용(문자)을 음성으로 녹음하여 기록한 것을 의미함", "searchValue": "큰곰자리의 꼬리에 해당하는 7개의 별",
"value": "900", "value": "900",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (오디오북)/③ 크기 (9pt)" "item": "문구 (북두칠성)/③ 크기 (9pt)"
}, },
"28": { "28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type", "path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"searchValue": "눈으로 읽는 대신 귀로 들을 수 있게 책의 내용(문자)을 음성으로 녹음하여 기록한 것을 의미함", "searchValue": "큰곰자리의 꼬리에 해당하는 7개의 별",
"value": "CircledLatinSmall", "value": "CircledLatinCapital",
"points": 2, "points": 2,
"category": "OneAnswer", "category": "OneAnswer",
"item": "문구 (오디오북)/④ 각주 번호모양", "item": "문구 (북두칠성)/④ 각주 번호모양",
"desc": { "desc": {
"가,나,다":"HangulSyllable",
"1,2,3":"Digit", "1,2,3":"Digit",
"갑,을,병":"DecagonCircle",
"A,B,C":"LatinCapital",
"①,②,③":"CircledDigit", "①,②,③":"CircledDigit",
"가,나,다":"HangulSyllable",
"㉮,㉯,㉰":"CircledHangulSyllable",
"A,B,C":"LatinCapital",
"Ⓐ,Ⓑ,Ⓒ":"CircledLatinCapital",
"갑,을,병":"DecagonCircle",
"一,二,三":"Ideograph", "一,二,三":"Ideograph",
"㉠,㉡,㉢":"CircledHangulJamo", "㉠,㉡,㉢":"CircledHangulJamo",
"ⓐ,ⓑ,ⓒ":"CircledLatinSmall", "ⓐ,ⓑ,ⓒ":"CircledLatinSmall",
@@ -561,82 +568,83 @@
"정답에 맞는 값 value에 입력":"" "정답에 맞는 값 value에 입력":""
} }
}, },
"29": { "29": {
"path": "boolean(//CHAR[contains(text(),'Platform')])", "path": "boolean(//CHAR[contains(text(),'Babylonia')])",
"ignoreWord": "Platform", "ignoreWord": "Babylonia",
"value": true, "value": true,
"points": 3, "points": 3,
"category": "Boolean", "category": "Boolean",
"item": "Platform/영단어 미입력, 대소문자/오타 시 전체 감점", "item": "Babylonia/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": "유사도 검사를 진행하지 않고 영단어가 모두 일치해야 하므로 xpath구문 내 단어도 수정필요" "desc": "유사도 검사를 진행하지 않고 영단어가 모두 일치해야 하므로 xpath구문 내 단어도 수정필요"
}, },
"30": { "30": {
"path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]", "path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]",
"word":[ "word":[
["출판", "出版"], ["성좌", "星座"],
["독자", "讀者"], ["유래", "由來"],
["박람회", "博覽會"], ["표석", "標石"],
["교류", "交流"], ["천구", "天球"],
["증가", "增加"] ["계절", "季節"]
], ],
"value": 10, "value": 10,
"points": 10, "points": 10,
"category": "Hanja", "category": "Hanja",
"item": "① 출판(出版), ② 독자(讀者), ③ 박람회(博覽會), ④ 교류(交流), ⑤ 증가(增加)" "item": "① 성좌(星座), ② 유래(由來), ③ 표석(標石), ④ 천구(天球), ⑤ 계절(季節)"
}, },
"31": { "31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'래도점점')])", "path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'역에해당')])",
"value": true, "value": true,
"points": 3, "points": 3,
"category": "Boolean", "category": "Boolean",
"item": "문구 (…콘텐츠 거래는 점점…)/\"는\" → \"도\" 글자바꿈" "item": "문구 (…지역이 해당하는 티그리스강과…)/이 → 에 글자바꿈"
}, },
"32": { "32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'양한산업')])", "path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'나는반드')])",
"value": true, "value": true,
"points": 3, "points": 3,
"category": "Boolean", "category": "Boolean",
"item": "문구 (…요식업 등의 산업과 다양한 연계되며…)/\"산업과\" / \"다양한\" 순서바꿈" "item": "문구 (…둘 중 반드시 하나는…)/반드시 / 하나는 순서바꿈"
}, },
"33": { "33": {
"path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape", "path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape",
"searchValue": "출판 산업 성장률(단위: %)", "searchValue": "지역별 천문대 수",
"value": "돋움", "value": "돋움",
"points": 1, "points": 1,
"category": "FontName", "category": "FontName",
"item": "제목 문구 (출판 산업 성장률(단위: %))/① 글씨체 (돋움)" "item": "제목 문구 (지역별 천문대 수)/① 글씨체 (돋움)"
}, },
"34": { "34": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "출판 산업 성장률(단위: %)", "searchValue": "지역별 천문대 수",
"value": "1200", "value": "1200",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "제목 문구 (출판 산업 성장률(단위: %))/② 크기 (12pt)" "item": "제목 문구 (지역별 천문대 수)/② 크기 (12pt)"
}, },
"35": { "35": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]", "path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "출판 산업 성장률(단위: %)", "searchValue": "지역별 천문대 수",
"value": "BOLD", "value": "BOLD",
"points": 1, "points": 1,
"category": "FontAttribute", "category": "FontAttribute",
"item": "제목 문구 (출판 산업 성장률(단위: %))/③ 진하게" "item": "제목 문구 (지역별 천문대 수)/③ 진하게"
}, },
"36": { "36": {
"path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align", "path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "출판 산업 성장률(단위: %)", "searchValue": "지역별 천문대 수",
"value": "Center", "value": "Center",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "제목 문구 (출판 산업 성장률(단위: %))/④ 정렬 (가운데 정렬)" "item": "제목 문구 (지역별 천문대 수)/④ 정렬 (가운데 정렬)"
}, },
"37": { "37": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor", "path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor", "path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"value": "233,174,212", "value": "255,164,95",
"points": 2, "points": 2,
"category": "Color", "category": "Color",
"item": "위쪽 제목 셀/① 색상(RGB:233,174,212)" "item": "위쪽 제목 셀/① 색상(RGB:255,164,95)"
}, },
"38": { "38": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]", "path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]",
@@ -665,11 +673,11 @@
"41": { "41": {
"path": "//TABLE//TEXT/@CharShape", "path": "//TABLE//TEXT/@CharShape",
"path2": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name", "path2": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"value": "중고딕", "value": "궁서",
"points": 1, "points": 1,
"category": "TableFontName", "category": "TableFontName",
"category_tmp": "FontName", "category_tmp": "FontName",
"item": "글자모양/① 글씨체 (중고딕)", "item": "글자모양/① 글씨체 (궁서)",
"desc": "테이블 폰트명 문항은 테이블의 모든 셀이 정답폰트와 일치해야 함, 하나만 일치해도 정답으로 채점할 경우 category값을 FontName으로 변경" "desc": "테이블 폰트명 문항은 테이블의 모든 셀이 정답폰트와 일치해야 함, 하나만 일치해도 정답으로 채점할 경우 category값을 FontName으로 변경"
}, },
"42": { "42": {
@@ -688,7 +696,7 @@
}, },
"44": { "44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) and boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])", "path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) and boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "AVG", "option": "SUM",
"value": true, "value": true,
"points": 4, "points": 4,
"category": "Boolean", "category": "Boolean",
@@ -721,10 +729,10 @@
}, },
"48": { "48": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Height", "path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Height",
"value": "80", "value": "90",
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "④ 크기-높이 (80 mm)" "item": "④ 크기-높이 (90 mm)"
}, },
"49": { "49": {
"chart_xpath": "boolean(//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계' or text()='평균']))", "chart_xpath": "boolean(//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계' or text()='평균']))",
@@ -736,36 +744,36 @@
}, },
"50": { "50": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface", "chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"searchValue": "출판 산업 성장률", "searchValue": "지역별 천문대 수",
"value": "바탕", "value": "맑은 고딕",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "제목 문구 (출판 산업 성장률)/① 글씨체 (바탕)" "item": "제목 문구 (지역별 천문대 수)/① 글씨체 (맑은 고딕)"
}, },
"51": { "51": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz", "chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"searchValue": "출판 산업 성장률", "searchValue": "지역별 천문대 수",
"value": "1200", "value": "1400",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "제목 문구 (출판 산업 성장률)/② 크기 (12pt)" "item": "제목 문구 (지역별 천문대 수)/② 크기 (14pt)"
}, },
"52": { "52": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}", "chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}",
"option": "b", "option": "b",
"searchValue": "출판 산업 성장률", "searchValue": "지역별 천문대 수",
"value": "1", "value": "1",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "제목 문구 (출판 산업 성장률)/③ 진하게", "item": "제목 문구 (지역별 천문대 수)/③ 진하게",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b" "desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
}, },
"53": { "53": {
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface", "chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface",
"value": "돋움", "value": "바탕",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "X축/① 글꼴 (돋움)" "item": "X축/① 글꼴 (바탕)"
}, },
"54": { "54": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@sz", "chart_xpath": "//c:catAx/c:txPr//a:defRPr/@sz",
@@ -785,10 +793,10 @@
}, },
"56": { "56": {
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface", "chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface",
"value": "돋움", "value": "바탕",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "Y축/① 글꼴 (돋움)" "item": "Y축/① 글꼴 (바탕)"
}, },
"57": { "57": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@sz", "chart_xpath": "//c:valAx/c:txPr//a:defRPr/@sz",
@@ -808,10 +816,10 @@
}, },
"59": { "59": {
"chart_xpath": "//c:legend//a:ea/@typeface", "chart_xpath": "//c:legend//a:ea/@typeface",
"value": "돋움", "value": "바탕",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "OneAnswer",
"item": "범례/① 글꼴 (돋움)" "item": "범례/① 글꼴 (바탕)"
}, },
"60": { "60": {
"chart_xpath": "//c:legend//a:defRPr/@sz", "chart_xpath": "//c:legend//a:defRPr/@sz",

841
DIW_2505D.json Normal file
View File

@@ -0,0 +1,841 @@
{
"0": {
"0": {
"path": "",
"path2": "",
"points": 0,
"category": "파일저장",
"item": "파일명 (수검번호.hwp/hwpx)"
},
"1": {
"path": "//PAGEMARGIN",
"value": {
"Top": 20,
"Bottom": 20,
"Left": 20,
"Right": 20,
"Header": 10,
"Footer": 10,
"Gutter": 0
},
"tolerance": 1,
"points": 4,
"category": "PageSetting",
"item": "A4용지, 왼쪽/오른쪽/위쪽/아래쪽 (각20mm), 머리말/꼬리말 (10mm), 제본(0mm)"
},
"2": {
"path": "",
"value": {
"FontName": "바탕",
"FontSize": "1000",
"Alignment": "Justify",
"LineSpacing": "160"
},
"points": 4,
"category": "BasicSetting",
"item": "글꼴 (바탕, 10pt), 양쪽정렬, 줄간격 (160%)"
},
"3": {
"path": "",
"value": null,
"points": 40,
"category": "오타감점",
"item": "오타 1개 -1점 / 2503회부터 오타 1개 -1점으로 변경"
}
},
"1": {
"1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"searchValue": "여름방학특집해양스포츠체험교실",
"value": "궁서체",
"points": 1,
"category": "OneAnswer",
"item": "문구 (여름방학특집해양스포츠체험교실)/① 글씨체 (궁서체)"
},
"2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"searchValue": "여름방학특집해양스포츠체험교실",
"value": "49,95,151",
"points": 2,
"category": "Color",
"item": "문구 (여름방학특집해양스포츠체험교실)/② 채우기 : 색상(RGB:49,95,151)"
},
"3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"searchValue": "여름방학특집해양스포츠체험교실",
"value": "120",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (여름방학특집해양스포츠체험교실)/③ 크기-너비 (120 mm)"
},
"4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"searchValue": "여름방학특집해양스포츠체험교실",
"value": "20",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (여름방학특집해양스포츠체험교실)/④ 크기-높이 (20 mm)"
},
"5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "여름방학특집해양스포츠체험교실",
"value": "true",
"points": 2,
"category": "OneAnswer",
"item": "문구 (여름방학특집해양스포츠체험교실)/⑤ 위치 (글자처럼 취급)"
},
"6": {
"path":"//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "여름방학특집해양스포츠체험교실",
"value": "Center",
"points": 2,
"category": "OneAnswer",
"item": "문구 (여름방학특집해양스포츠체험교실)/⑥ 정렬 (가운데 정렬)"
},
"7": {
"path": "//TEXTART[@Text='{searchValue}']",
"searchValue": "여름방학특집해양스포츠체험교실",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (여름방학특집해양스포츠체험교실)/⑦ 글맵시모양 (육안확인)"
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE",
"searchValue": "여",
"value": {
"Height": 2800,
"Width": 2800
},
"tolerance": 200,
"points": 1,
"category": "TwoLineSize",
"item": "여/① 모양 (2줄)"
},
"9": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "여",
"value": "굴림체",
"points": 1,
"category": "FontName",
"item": "여/② 글씨체 (굴림체)"
},
"10": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "여",
"value": "144,231,51",
"points": 2,
"category": "Color",
"item": "여/③ 면색 : 색상(RGB:144,231,51)"
},
"11": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right",
"searchValue": "여",
"value": "3.0",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "여/④ 본문과의 간격 : 3.0mm"
},
"12": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "시원한 바다와 함께하는 해양 스포츠 체험 교실",
"value": "BOLD",
"points": 2,
"category": "FontAttribute",
"item": "문구 (시원한 바다와 함께하는 해양 스포츠 체험 교실)/① 진하게"
},
"13": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "시원한 바다와 함께하는 해양 스포츠 체험 교실",
"value": "UNDERLINE",
"points": 2,
"category": "FontAttribute",
"item": "문구 (시원한 바다와 함께하는 해양 스포츠 체험 교실)/② 밑줄"
},
"14": {
"path": "//CHAR[contains(text(),'{char1}')]",
"path2": "//CHAR[contains(text(),'{char2}')]",
"path3": "//CHAR[contains(text(),'{char3}')]",
"char1": "◐",
"char2": "◑",
"char3": "※",
"value": 3,
"points": 3,
"category": "SpecialChar",
"item": "① ◐ , ② ◑ , ③ ※"
},
"15": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "참가안내",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "문구 (◐ 참가안내 ◑)/① 글씨체 (돋움)"
},
"16": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "참가안내",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (◐ 참가안내 ◑)/② 정렬 (가운데 정렬)"
},
"17": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "해양소년단 연맹 홈페이지(http://www.ihd.or.kr)",
"value": "ITALIC",
"points": 1,
"category": "FontAttribute",
"item": "문구 (해양소년단 연맹 홈페이지(http://www.ihd.or.kr))/① 기울임"
},
"18": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "해양소년단 연맹 홈페이지(http://www.ihd.or.kr)",
"value": "UNDERLINE",
"points": 1,
"category": "FontAttribute",
"item": "문구 (해양소년단 연맹 홈페이지(http://www.ihd.or.kr))/② 밑줄"
},
"19": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN",
"searchValue": "기타사항",
"value": {
"Left": 10,
"Indent": 12
},
"points": 2,
"category": "ParaShape",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (10pt), 내어쓰기 (12pt)",
"desc": "내부적으로 내어쓰기는 음수값 / JSON value값은 양수로 입력"
},
"20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"searchValue": "2025. 05. 24.",
"value": "1400",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2025. 05. 24.)/① 크기 (14pt)",
"desc": "1pt당 100"
},
"21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "2025. 05. 24.",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2025. 05. 24.)/② 정렬 (가운데 정렬)"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "해양스포츠홍보위원회",
"value": "견고딕",
"points": 1,
"category": "FontName",
"item": "문구 (해양스포츠홍보위원회)/① 글씨체 (견고딕)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "해양스포츠홍보위원회",
"value": "2600",
"points": 1,
"category": "OneAnswer",
"item": "문구 (해양스포츠홍보위원회)/② 크기 (26pt)"
},
"24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"searchValue": "해양스포츠홍보위원회",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (해양스포츠홍보위원회)/③ 정렬 (가운데 정렬)"
},
"25": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "DIAT",
"value": "굴림",
"points": 1,
"category": "FontName",
"item": "문구 (DIAT)/① 글꼴 (굴림)"
},
"26": {
"path": "//CHARSHAPE[@Id=//SECTION[1]//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "DIAT",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "문구 (DIAT)/② 크기 (9pt)"
},
"27": {
"path": "//PARASHAPE[@Id=//SECTION[1]//CHAR[text()='{searchValue}']/parent::TEXT/parent::P/@ParaShape]/@Align",
"searchValue": "DIAT",
"value": "Right",
"points": 1,
"category": "OneAnswer",
"item": "문구 (DIAT)/③ 정렬 (오른쪽 정렬)"
},
"28": {
"path": "//PAGENUM/@FormatType",
"value": "CircledDigit",
"points": 2,
"category": "PageNumber",
"item": "① 쪽 번호 매기기 (A,B,C 순으로)",
"desc1": {
"1,2,3":"Digit",
"①,②,③":"CircledDigit",
"가,나,다":"HangulSyllable",
"㉮,㉯,㉰":"CircledHangulSyllable",
"A,B,C":"LatinCapital",
"Ⓐ,Ⓑ,Ⓒ":"CircledLatinCapital",
"갑,을,병":"DecagonCircle",
"一,二,三":"Ideograph",
"㉠,㉡,㉢":"CircledHangulJamo",
"ⓐ,ⓑ,ⓒ":"CircledLatinSmall",
"i,ii,iii":"RomanSmall",
"정답에 맞는 값 value에 입력":""
},
"desc2": "1, 2페이지 모두 정답이어야 점수 부여"
},
"29": {
"path": "//PAGENUM/@Pos",
"value": "BottomRight",
"points": 2,
"category": "PageNumber",
"item": "가운데 아래",
"desc": "1, 2페이지 모두 정답이어야 점수 부여",
"desc2": {
"가운데 아래": "BottomCenter",
"오른쪽 아래": "BottomRight"
}
},
"30": {
"path": "not(//PARASHAPE[@Id=//SECTION[1]/P/@ParaShape]/PARAMARGIN[@LineSpacing!='{option}'])",
"option": "180",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문제 1 줄간격 180% 설정",
"desc": "1페이지 문단의 줄간격이 정답이 아닌 문단이 있으면 False(감점)"
}
},
"2": {
"1": {
"path": "//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@HeaderInside",
"path2": "//BORDERFILL[@Id=//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@BorferFill]",
"value": {
"header_inside": true,
"all_double_slim": true
},
"points": 4,
"category": "PageBorder",
"item": "문제2 쪽테두리(이중 실선, 머리말 포함) 설정"
},
"2": {
"path": "count(//SECTION)>1",
"value": true,
"points": 3,
"category": "Boolean",
"item": "① 구역나누기",
"desc": "섹션이 1개 이상이면 점수부여"
},
"3": {
"path": "//COLDEF/@Count",
"value": "2",
"points": 3,
"category": "OneAnswer",
"item": "② 다단 2단"
},
"4": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"searchValue": "해양 스포츠의 세계",
"value": "60",
"points": 2,
"category": "mmSize",
"item": "문구 (해양 스포츠의 세계)/① 크기-너비 (60 mm)"
},
"5": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"searchValue": "해양 스포츠의 세계",
"value": "12",
"points": 2,
"category": "mmSize",
"item": "문구 (해양 스포츠의 세계)/② 크기-높이 (12mm)"
},
"6": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//LINESHAPE/@Style",
"path2": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//LINESHAPE/@Width",
"searchValue": "해양 스포츠의 세계",
"value": [ "DoubleSlim", "283" ],
"points": 2,
"category": "DoubleAnswer",
"item": "문구 (해양 스포츠의 세계)/③ 테두리 : 이중 실선(1.00mm)",
"desc": "1mm = 283pt"
},
"7": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/@Ratio",
"searchValue": "해양 스포츠의 세계",
"value": "20",
"points": 2,
"category": "OneAnswer",
"item": "문구 (해양 스포츠의 세계)/④ 글상자 모서리 (반원)",
"desc": "모서리 비율 50이면 반원 / 20이면 둥근모양"
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "해양 스포츠의 세계",
"value": "248,231,130",
"points": 2,
"category": "Color",
"item": "문구 (해양 스포츠의 세계)/⑤ 채우기 : 색상(RGB:248,231,130)"
},
"9": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "해양 스포츠의 세계",
"value": "true",
"points": 1,
"category": "OneAnswer",
"item": "문구 (해양 스포츠의 세계)/⑥ 글상자 위치 (글자처럼 취급)"
},
"10": {
"path": "//PARASHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::P[last()]/@ParaShape]/@Align",
"searchValue": "해양 스포츠의 세계",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (해양 스포츠의 세계)/⑦ 글상자 정렬 (가운데 정렬)"
},
"11": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "해양 스포츠의 세계",
"value": "궁서",
"points": 1,
"category": "FontName",
"item": "문구 (해양 스포츠의 세계)/⑧ 글씨체 (궁서)"
},
"12": {
"path": "//CHARSHAPE[@Id=//RECTANGLE//TEXT[./CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "해양 스포츠의 세계",
"value": "1800",
"points": 1,
"category": "OneAnswer",
"item": "문구 (해양 스포츠의 세계)/⑨ 글씨크기 (18pt)",
"desc":"1pt당 100"
},
"13": {
"path": "//PARASHAPE[@Id=//RECTANGLE//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "해양 스포츠의 세계",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (해양 스포츠의 세계)/⑩ 정렬 (가운데 정렬)"
},
"14": {
"path": "boolean(//PICTURE//SHAPECOMMENT[contains(text(),'{searchValue}')])",
"searchValue": "원본 그림의 이름: 그림",
"value": true,
"points": 2,
"category": "Boolean",
"item": "① 파일명 \"그림D.jpg\" 삽입"
},
"15": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/SIZE/@Width",
"value": "80",
"points": 2,
"category": "mmSize",
"item": "② 크기-너비 (80 mm)"
},
"16": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/SIZE/@Height",
"value": "40",
"points": 2,
"category": "mmSize",
"item": "③ 크기-높이 (40 mm)"
},
"17": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/POSITION/@HorzOffset",
"value": "0",
"points": 2,
"category": "mmSize",
"item": "④ 위치 (어울림 : 가로-쪽의 왼쪽 0.0mm)"
},
"18": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/POSITION/@VertOffset",
"value": "24",
"points": 2,
"category": "mmSize",
"item": "⑤ 위치 (어울림 : 세로-쪽의 위 24mm)"
},
"19": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "1. 국립해양박물관",
"value": "돋움체",
"points": 1,
"category": "FontName",
"item": "문구① (1. 국립해양박물관)/① 글씨체 (돋움체)"
},
"20": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "1. 국립해양박물관",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구① (1. 국립해양박물관)/② 크기 (12pt)"
},
"21": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "1. 국립해양박물관",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구① (1. 국립해양박물관)/③ 진하게"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "2. 윈드 서핑",
"value": "돋움체",
"points": 1,
"category": "FontName",
"item": "문구② (2. 윈드 서핑)/① 글씨체 (돋움체)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "2. 윈드 서핑",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구② (2. 윈드 서핑)/② 크기 (12pt)"
},
"24": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "2. 윈드 서핑",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구② (2. 윈드 서핑)/③ 진하게"
},
"25": {
"path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)",
"option": "마스트",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (마스트)/① 각주 설정 및 문구 입력"
},
"26": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "선체의 갑판 위에 세워진 기둥",
"value": "바탕체",
"points": 1,
"category": "FontName",
"item": "문구 (마스트)/② 글씨체 (바탕체)"
},
"27": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height",
"searchValue": "선체의 갑판 위에 세워진 기둥",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "문구 (마스트)/③ 크기 (9pt)"
},
"28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"searchValue": "선체의 갑판 위에 세워진 기둥",
"value": "CircledDigit",
"points": 2,
"category": "OneAnswer",
"item": "문구 (마스트)/④ 각주 번호모양",
"desc": {
"1,2,3":"Digit",
"①,②,③":"CircledDigit",
"가,나,다":"HangulSyllable",
"㉮,㉯,㉰":"CircledHangulSyllable",
"A,B,C":"LatinCapital",
"Ⓐ,Ⓑ,Ⓒ":"CircledLatinCapital",
"갑,을,병":"DecagonCircle",
"一,二,三":"Ideograph",
"㉠,㉡,㉢":"CircledHangulJamo",
"ⓐ,ⓑ,ⓒ":"CircledLatinSmall",
"i,ii,iii":"RomanSmall",
"정답에 맞는 값 value에 입력":""
}
},
"29": {
"path": "boolean(//CHAR[contains(text(),'Display')])",
"ignoreWord": "Display",
"value": true,
"points": 3,
"category": "Boolean",
"item": "Display/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": "유사도 검사를 진행하지 않고 영단어가 모두 일치해야 하므로 xpath구문 내 단어도 수정필요"
},
"30": {
"path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]",
"word":[
["유물", "遺物"],
["상설", "常設"],
["체험", "體驗"],
["해양", "海洋"],
["기교", "技巧"]
],
"value": 10,
"points": 10,
"category": "Hanja",
"item": "① 유물(遺物), ② 상설(常設), ③ 체험(體驗), ④ 해양(海洋), ⑤ 기교(技巧)"
},
"31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'을헤치는')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…물살을 헤치은…)/ 은 → 는 글자바꿈"
},
"32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'연의바람')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…바람을 자연의 이용하여…)/바람을 / 자연의 순서바꿈"
},
"33": {
"path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape",
"searchValue": "종목별 해양 스포츠 참가자 수",
"value": "중고딕",
"points": 1,
"category": "FontName",
"item": "제목 문구 (종목별 해양 스포츠 참가자 수)/① 글씨체 (중고딕)"
},
"34": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "종목별 해양 스포츠 참가자 수",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (종목별 해양 스포츠 참가자 수)/② 크기 (12pt)"
},
"35": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "종목별 해양 스포츠 참가자 수",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "제목 문구 (종목별 해양 스포츠 참가자 수)/③ 진하게"
},
"36": {
"path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "종목별 해양 스포츠 참가자 수",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (종목별 해양 스포츠 참가자 수)/④ 정렬 (가운데 정렬)"
},
"37": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"value": "233,162,149",
"points": 2,
"category": "Color",
"item": "위쪽 제목 셀/① 색상(RGB:233,162,149)"
},
"38": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "위쪽 제목 셀/② 진하게",
"desc": "글자 속성이라 CELLZONE으로 적용 되지 않음"
},
"39": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Type",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Type",
"value": "DoubleSlim",
"points": 2,
"category": "TableAnswer",
"item": "제목 셀 아래선/① 이중실선"
},
"40": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Width",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Width",
"value": "0.5mm",
"points": 2,
"category": "TableAnswer",
"item": "제목 셀 아래선/② 0.5mm"
},
"41": {
"path": "//TABLE//TEXT/@CharShape",
"path2": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"value": "굴림체",
"points": 1,
"category": "TableFontName",
"category_tmp": "FontName",
"item": "글자모양/① 글씨체 (굴림체)",
"desc": "테이블 폰트명 문항은 테이블의 모든 셀이 정답폰트와 일치해야 함, 하나만 일치해도 정답으로 채점할 경우 category값을 FontName으로 변경"
},
"42": {
"path": "//CHARSHAPE[@Id=//TABLE//TEXT/@CharShape]/@Height",
"value": "1000",
"points": 1,
"category": "TableAnswer",
"item": "글자모양/② 크기 (10pt)"
},
"43": {
"path": "//PARASHAPE[@Id=//TABLE/ROW//P/@ParaShape]/@Align",
"value": "Center",
"points": 1,
"category": "TableAnswer",
"item": "글자모양/③ 정렬 (가운데 정렬)"
},
"44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) and boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "SUM",
"value": true,
"points": 4,
"category": "Boolean",
"item": "블록 계산식/합계",
"desc": "option값에 합계는 SUM / 평균은 AVG"
},
"45": {
"chart_xpath": "",
"chart_type": "묶은세로막대형",
"value": true,
"points": 2,
"category": "ChartType",
"item": "① 종류 (묶은세로막대형)",
"desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)"
},
"46": {
"chart_xpath": "//c:valAx/c:majorTickMark/@val",
"value": "out",
"points": 2,
"category": "OneAnswer",
"item": "② 값 축 주 눈금선",
"desc": "chart xml파일에서 답안을 가져오는 문항은 path키값 대신 chart_xpath키값을 이용해 xapth구문을 작성한다"
},
"47": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Width",
"value": "80",
"points": 2,
"category": "mmSize",
"item": "③ 크기-너비 (80 mm)"
},
"48": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Height",
"value": "90",
"points": 2,
"category": "mmSize",
"item": "④ 크기-높이 (90 mm)"
},
"49": {
"chart_xpath": "boolean(//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계' or text()='평균']))",
"value": true,
"points": 2,
"category": "Boolean",
"item": "⑤ 차트 데이터(표에서 블록계산식을 제외한 나머지 값만 이용)",
"desc": "차트가 존재하고 블록계산식(합계, 평균) 데이터가 없는 경우 정답 처리"
},
"50": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"searchValue": "종목별 해양 스포츠 참가자 수",
"value": "궁서체",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (종목별 해양 스포츠 참가자 수)/① 글씨체 (궁서체)"
},
"51": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"searchValue": "종목별 해양 스포츠 참가자 수",
"value": "1300",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (종목별 해양 스포츠 참가자 수)/② 크기 (13pt)"
},
"52": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}",
"option": "b",
"searchValue": "종목별 해양 스포츠 참가자 수",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (종목별 해양 스포츠 참가자 수)/③ 진하게",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"53": {
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface",
"value": "맑은 고딕",
"points": 1,
"category": "OneAnswer",
"item": "X축/① 글꼴 (맑은 고딕)"
},
"54": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "X축/② 크기 (9pt)"
},
"55": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "X축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"56": {
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface",
"value": "맑은 고딕",
"points": 1,
"category": "OneAnswer",
"item": "Y축/① 글꼴 (맑은 고딕)"
},
"57": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "Y축/② 크기 (9pt)"
},
"58": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "Y축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"59": {
"chart_xpath": "//c:legend//a:ea/@typeface",
"value": "맑은고딕",
"points": 1,
"category": "OneAnswer",
"item": "범례/① 글꼴 (맑은고딕)"
},
"60": {
"chart_xpath": "//c:legend//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "범례/② 크기 (9pt)"
},
"61": {
"chart_xpath": "//c:legend//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "범례/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
}
}
}

View File

@@ -339,16 +339,17 @@ class XMLScorer:
# 가로 차트일 경우에만 x축과 y축을 바꿔줌 # 가로 차트일 경우에만 x축과 y축을 바꿔줌
# 세로, 꺾은선, 원형 차트의 경우 그대로 사용 # 세로, 꺾은선, 원형 차트의 경우 그대로 사용
if "가로" in chart_type: if "가로" in chart_type:
chart_xpath = chart_xpath.replace("catAx", "valAx") if "catAx" in chart_xpath:
chart_xpath = chart_xpath.replace("valAx", "catAx") chart_xpath = chart_xpath.replace("catAx", "valAx")
if "valAx" in chart_xpath:
chart_xpath = chart_xpath.replace("valAx", "catAx")
chart_items = chart_tree.xpath(chart_xpath, namespaces=namespaces) if chart_xpath else [] chart_items = chart_tree.xpath(chart_xpath, namespaces=namespaces) if chart_xpath else []
for item in chain(items, items2, chart_items): for item in chain(items, items2, chart_items):
user_answer = item user_answer = item.replace(" ", "") if isinstance(item, str) else item
right_answer = right_answer.replace(" ", "")
self.evaluate_answer(scoring, user_answer, right_answer, points) self.evaluate_answer(scoring, user_answer, right_answer, points)
if scoring['points'] > 0: if scoring['points'] > 0:
@@ -475,11 +476,12 @@ class XMLScorer:
continue continue
font_name = root.xpath(f"//FONTFACE[@Lang='Hangul']/FONT[@Id='{font_id[0]}']/@Name") font_name = root.xpath(f"//FONTFACE[@Lang='Hangul']/FONT[@Id='{font_id[0]}']/@Name")
if not font_name: if not font_name:
all_match = False all_match = False
continue continue
user_answer = font_name[0] user_answer = font_name[0].replace(" ", "") # 공백 제거
# 접두어 제거 # 접두어 제거
if right_answer in ["견고딕", "중고딕"]: if right_answer in ["견고딕", "중고딕"]:
@@ -508,18 +510,22 @@ class XMLScorer:
# hyperlink가 아닌 경우(일반적인 텍스트 일 경우) # hyperlink가 아닌 경우(일반적인 텍스트 일 경우)
if not has_hyperlink_ptag: if not has_hyperlink_ptag:
charshape = root.xpath(xpath) charshape_list = root.xpath(xpath)
if not charshape: if not charshape_list:
charshape = None charshape = None
user_answer = None user_answer = None
else: else:
font_attribute = charshape[0].find(right_answer) for charshape in charshape_list:
if font_attribute is not None: font_attribute = charshape.find(right_answer)
user_answer = font_attribute.tag if font_attribute is not None:
else: user_answer = font_attribute.tag
user_answer = None else:
user_answer = None
self.evaluate_answer(scoring, user_answer, right_answer, points, method="equal") self.evaluate_answer(scoring, user_answer, right_answer, points, method="equal")
if scoring['points'] > 0:
break
# 하이퍼링크인 경우 # 하이퍼링크인 경우
elif has_hyperlink_ptag: elif has_hyperlink_ptag:
@@ -709,7 +715,9 @@ class XMLScorer:
chart_type_list = { chart_type_list = {
'꺾은선형': "//c:lineChart[c:grouping[@val='standard']]", '꺾은선형': "//c:lineChart[c:grouping[@val='standard']]",
'묶은가로막대형': "//c:barChart[c:barDir[@val='bar'] and c:grouping[@val='clustered']]", '묶은가로막대형': "//c:barChart[c:barDir[@val='bar'] and c:grouping[@val='clustered']]",
'누적가로막대형': "//c:barChart[c:barDir[@val='bar'] and c:grouping[@val='stacked']]",
'묶은세로막대형': "//c:barChart[c:barDir[@val='col'] and c:grouping[@val='clustered']]", '묶은세로막대형': "//c:barChart[c:barDir[@val='col'] and c:grouping[@val='clustered']]",
'누적세로막대형': "//c:barChart[c:barDir[@val='col'] and c:grouping[@val='stacked']]",
'원형': "//c:pieChart", '원형': "//c:pieChart",
'분산형': "//c:scatterChart" '분산형': "//c:scatterChart"
} }
@@ -1024,17 +1032,18 @@ class XMLScorer:
def main(): def main():
# 시험회차 및 유형 # 시험회차 및 유형
exam_round = '2504' exam_round = '2505'
# 채점하고자 하는 유형은 주석 해제 # 채점하고자 하는 유형은 주석 해제
exam_types = [ exam_types = [
'A', # 'A',
'B', # 'B',
'C', # 'C',
'D',
] ]
test_mode = False # test_mode = False
# test_mode = True #/TEST 폴더 채점시 test_mode = True #/TEST 폴더 채점시
output_excel_paths = [] output_excel_paths = []
for exam_type in exam_types: for exam_type in exam_types:

View File

@@ -1,25 +0,0 @@
import pandas as pd
# 엑셀 파일 경로
file_path = "./diff.xlsx"
# 엑셀 파일 읽기
df = pd.read_excel(file_path)
# 데이터 미리 보기
df.head()
# '총점' 컬럼 기준으로 점수가 다른 경우만 남기기
filtered_df = df.groupby("Unnamed: 0").filter(lambda x: x["총점"].nunique() > 1)
# 결과 확인
filtered_df.head()
# 점수가 다른 경우만 남기는 필터링
filtered_df = df.groupby("Unnamed: 0").filter(lambda x: x["총점"].nunique() > 1)
# 결과 저장
output_path = "./filtered_score_diff.xlsx"
filtered_df.to_excel(output_path, index=False)
output_path

Binary file not shown.

View File

@@ -14819,3 +14819,33 @@
2025-05-01 15:44:21,157 - INFO - 변환 성공: 워드(한글)-002494-윤요한.hwpx -> 워드(한글)-002494-윤요한.hml 2025-05-01 15:44:21,157 - INFO - 변환 성공: 워드(한글)-002494-윤요한.hwpx -> 워드(한글)-002494-윤요한.hml
2025-05-01 15:44:21,758 - INFO - 변환 성공: 워드(한글)-2504-000156 유지연.hwpx -> 워드(한글)-2504-000156 유지연.hml 2025-05-01 15:44:21,758 - INFO - 변환 성공: 워드(한글)-2504-000156 유지연.hwpx -> 워드(한글)-2504-000156 유지연.hml
2025-05-01 15:44:22,061 - INFO - 폴더 변환 완료: C:\Users\dra\project\HWP\HWP-Scoring\input\2504\C\DIW -> C:\Users\dra\project\HWP\HWP-Scoring\output\2504\C\DIW 2025-05-01 15:44:22,061 - INFO - 폴더 변환 완료: C:\Users\dra\project\HWP\HWP-Scoring\input\2504\C\DIW -> C:\Users\dra\project\HWP\HWP-Scoring\output\2504\C\DIW
2025-05-26 15:07:50,038 - INFO - 폴더 변환 시작: C:\Users\dra\project\HWP\HWP-Scoring\input\2505\A\DIW -> C:\Users\dra\project\HWP\HWP-Scoring\output\2505\A\DIW
2025-05-26 15:07:56,898 - INFO - 변환 성공: DIW2505A.hwpx -> DIW2505A.hml
2025-05-26 15:07:57,380 - INFO - 폴더 변환 완료: C:\Users\dra\project\HWP\HWP-Scoring\input\2505\A\DIW -> C:\Users\dra\project\HWP\HWP-Scoring\output\2505\A\DIW
2025-05-26 15:07:57,881 - INFO - 폴더 변환 시작: C:\Users\dra\project\HWP\HWP-Scoring\input\2505\B\DIW -> C:\Users\dra\project\HWP\HWP-Scoring\output\2505\B\DIW
2025-05-26 15:08:00,725 - INFO - 변환 성공: DIW2505B.hwpx -> DIW2505B.hml
2025-05-26 15:08:01,155 - INFO - 폴더 변환 완료: C:\Users\dra\project\HWP\HWP-Scoring\input\2505\B\DIW -> C:\Users\dra\project\HWP\HWP-Scoring\output\2505\B\DIW
2025-05-26 15:08:01,657 - INFO - 폴더 변환 시작: C:\Users\dra\project\HWP\HWP-Scoring\input\2505\C\DIW -> C:\Users\dra\project\HWP\HWP-Scoring\output\2505\C\DIW
2025-05-26 15:08:04,140 - INFO - 변환 성공: DIW2505C.hwpx -> DIW2505C.hml
2025-05-26 15:08:04,529 - INFO - 폴더 변환 완료: C:\Users\dra\project\HWP\HWP-Scoring\input\2505\C\DIW -> C:\Users\dra\project\HWP\HWP-Scoring\output\2505\C\DIW
2025-05-26 15:15:47,294 - INFO - 폴더 변환 시작: C:\Users\dra\project\HWP\HWP-Scoring\input\2505\A\DIW -> C:\Users\dra\project\HWP\HWP-Scoring\output\2505\A\DIW
2025-05-26 15:15:50,425 - INFO - 변환 성공: DIW2505A.hwpx -> DIW2505A.hml
2025-05-26 15:15:50,848 - INFO - 폴더 변환 완료: C:\Users\dra\project\HWP\HWP-Scoring\input\2505\A\DIW -> C:\Users\dra\project\HWP\HWP-Scoring\output\2505\A\DIW
2025-05-26 15:15:51,349 - INFO - 폴더 변환 시작: C:\Users\dra\project\HWP\HWP-Scoring\input\2505\B\DIW -> C:\Users\dra\project\HWP\HWP-Scoring\output\2505\B\DIW
2025-05-26 15:15:53,969 - INFO - 변환 성공: DIW2505B.hwpx -> DIW2505B.hml
2025-05-26 15:15:54,401 - INFO - 폴더 변환 완료: C:\Users\dra\project\HWP\HWP-Scoring\input\2505\B\DIW -> C:\Users\dra\project\HWP\HWP-Scoring\output\2505\B\DIW
2025-05-26 15:15:54,901 - INFO - 폴더 변환 시작: C:\Users\dra\project\HWP\HWP-Scoring\input\2505\C\DIW -> C:\Users\dra\project\HWP\HWP-Scoring\output\2505\C\DIW
2025-05-26 15:15:57,190 - INFO - 변환 성공: DIW2505C.hwpx -> DIW2505C.hml
2025-05-26 15:15:57,577 - INFO - 폴더 변환 완료: C:\Users\dra\project\HWP\HWP-Scoring\input\2505\C\DIW -> C:\Users\dra\project\HWP\HWP-Scoring\output\2505\C\DIW
2025-05-26 15:16:15,271 - INFO - 폴더 변환 시작: C:\Users\dra\project\HWP\HWP-Scoring\input\2505\A\DIW -> C:\Users\dra\project\HWP\HWP-Scoring\output\2505\A\DIW
2025-05-26 15:16:18,622 - INFO - 변환 성공: DIW2505A.hwpx -> DIW2505A.hml
2025-05-26 15:16:19,034 - INFO - 폴더 변환 완료: C:\Users\dra\project\HWP\HWP-Scoring\input\2505\A\DIW -> C:\Users\dra\project\HWP\HWP-Scoring\output\2505\A\DIW
2025-05-26 15:16:19,535 - INFO - 폴더 변환 시작: C:\Users\dra\project\HWP\HWP-Scoring\input\2505\B\DIW -> C:\Users\dra\project\HWP\HWP-Scoring\output\2505\B\DIW
2025-05-26 15:16:22,096 - INFO - 변환 성공: DIW2505B.hwpx -> DIW2505B.hml
2025-05-26 15:16:22,518 - INFO - 폴더 변환 완료: C:\Users\dra\project\HWP\HWP-Scoring\input\2505\B\DIW -> C:\Users\dra\project\HWP\HWP-Scoring\output\2505\B\DIW
2025-05-26 15:16:23,019 - INFO - 폴더 변환 시작: C:\Users\dra\project\HWP\HWP-Scoring\input\2505\C\DIW -> C:\Users\dra\project\HWP\HWP-Scoring\output\2505\C\DIW
2025-05-26 15:16:25,439 - INFO - 변환 성공: DIW2505C.hwpx -> DIW2505C.hml
2025-05-26 15:16:25,819 - INFO - 폴더 변환 완료: C:\Users\dra\project\HWP\HWP-Scoring\input\2505\C\DIW -> C:\Users\dra\project\HWP\HWP-Scoring\output\2505\C\DIW
2025-05-26 15:16:26,320 - INFO - 폴더 변환 시작: C:\Users\dra\project\HWP\HWP-Scoring\input\2505\D\DIW -> C:\Users\dra\project\HWP\HWP-Scoring\output\2505\D\DIW
2025-05-26 15:16:28,759 - INFO - 변환 성공: DIW2505D.hwpx -> DIW2505D.hml
2025-05-26 15:16:29,195 - INFO - 폴더 변환 완료: C:\Users\dra\project\HWP\HWP-Scoring\input\2505\D\DIW -> C:\Users\dra\project\HWP\HWP-Scoring\output\2505\D\DIW

227
score.py
View File

@@ -1,227 +0,0 @@
import json
import xml.etree.ElementTree as ET
import os
from pathlib import Path
import pandas as pd
from datetime import datetime
class XMLScorer:
def __init__(self, scoring_criteria_path):
"""
채점 기준표 JSON 파일을 로드하여 초기화합니다.
Args:
scoring_criteria_path (str): 채점 기준표 JSON 파일 경로
"""
self.scoring_criteria = self._load_scoring_criteria(scoring_criteria_path)
def _load_scoring_criteria(self, file_path):
"""
JSON 채점 기준표를 로드합니다.
Args:
file_path (str): JSON 파일 경로
Returns:
dict: 채점 기준표 데이터
"""
with open(file_path, 'r', encoding='utf-8') as f:
return json.load(f)
def _find_element_value(self, root, element_name, attribute_name):
"""
XML에서 특정 요소와 속성값을 찾습니다.
Args:
root (Element): XML 루트 요소
element_name (str): 찾을 요소 이름
attribute_name (str): 찾을 속성 이름
Returns:
str: 찾은 속성값 또는 None
"""
element = root.find(f".//{element_name}")
if element is not None:
return element.get(attribute_name)
return None
def score_xml_file(self, xml_path):
"""
단일 XML 파일을 채점합니다.
Args:
xml_path (str): XML 파일 경로
Returns:
dict: 채점 결과
"""
try:
tree = ET.parse(xml_path)
root = tree.getroot()
total_score = 0
results = {
'filename': os.path.basename(xml_path),
'criteria_matches': [],
'total_score': 0
}
# 각 채점 기준에 대해 검사
for criterion_id, criterion in self.scoring_criteria.items():
element_name = criterion['ele']
attribute_name = criterion['arg']
expected_value = criterion['value']
points = criterion['points']
actual_value = self._find_element_value(root, element_name, attribute_name)
match = {
'criterion': f"{element_name}.{attribute_name}",
'expected': expected_value,
'actual': actual_value,
'points': 0
}
# 값이 일치하면 점수 부여
if actual_value == expected_value:
total_score += points
match['points'] = points
results['criteria_matches'].append(match)
results['total_score'] = total_score
return results
except ET.ParseError as e:
return {
'filename': os.path.basename(xml_path),
'error': f"XML 파싱 오류: {str(e)}",
'total_score': 0
}
def export_to_excel(self, results, output_path=None):
"""
채점 결과를 엑셀 파일로 저장합니다.
Args:
results (list): 채점 결과 리스트
output_path (str, optional): 출력 파일 경로.
None이면 현재 시간으로 파일명 생성
Returns:
str: 저장된 엑셀 파일 경로
"""
if output_path is None:
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
output_path = f"scoring_results_{timestamp}.xlsx"
# 요약 시트용 데이터 준비
summary_data = []
detail_data = []
for result in results:
# 요약 정보
summary_row = {
'파일명': result['filename'],
'총점': result.get('total_score', 0)
}
if 'error' in result:
summary_row['오류'] = result['error']
summary_data.append(summary_row)
# 상세 정보
if 'criteria_matches' in result:
for match in result['criteria_matches']:
detail_row = {
'파일명': result['filename'],
'채점항목': match['criterion'],
'기대값': match['expected'],
'실제값': match['actual'],
'획득점수': match['points']
}
detail_data.append(detail_row)
# DataFrame 생성
summary_df = pd.DataFrame(summary_data)
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=False)
# 열 너비 자동 조정
for sheet_name in writer.sheets:
worksheet = writer.sheets[sheet_name]
for column in worksheet.columns:
max_length = 0
column = [cell for cell in column]
for cell in column:
try:
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
except:
pass
adjusted_width = (max_length + 2)
worksheet.column_dimensions[column[0].column_letter].width = adjusted_width
return output_path
def score_directory(self, xml_directory):
"""
디렉토리 내의 모든 XML 파일을 채점합니다.
Args:
xml_directory (str): XML 파일들이 있는 디렉토리 경로
Returns:
list: 모든 파일의 채점 결과
"""
results = []
xml_files = Path(xml_directory).glob('*.xml')
for xml_file in xml_files:
result = self.score_xml_file(str(xml_file))
results.append(result)
return results
# 사용 예시
def main():
# 채점기준표 파일 경로
scoring_criteria_path = "scoring_criteria.json"
# XML 파일들이 있는 디렉토리 경로
xml_directory = r"C:\Users\gzero-ser7-win11\Documents\hwpTest\Output"
# 채점기 초기화
scorer = XMLScorer(scoring_criteria_path)
# 디렉토리 내 모든 XML 파일 채점
results = scorer.score_directory(xml_directory)
# 결과 출력
for result in results:
print(f"\n파일: {result['filename']}")
if 'error' in result:
print(f"오류: {result['error']}")
continue
print(f"총점: {result['total_score']}")
print("\n채점 세부사항:")
for match in result['criteria_matches']:
print(f"기준: {match['criterion']}")
print(f"기대값: {match['expected']}")
print(f"실제값: {match['actual']}")
print(f"획득 점수: {match['points']}")
print("---")
# 결과를 엑셀 파일로 저장
excel_path = scorer.export_to_excel(results)
print(f"\n채점 결과가 다음 경로에 저장되었습니다: {excel_path}")
if __name__ == "__main__":
main()

327
score2.py
View File

@@ -1,327 +0,0 @@
import json
import xml.etree.ElementTree as ET
import os
from pathlib import Path
import pandas as pd
from datetime import datetime
from Levenshtein import distance as levenshtein_distance
class XMLScorer:
def __init__(self, scoring_criteria_path):
"""
채점 기준표 JSON 파일을 로드하여 초기화합니다.
Args:
scoring_criteria_path (str): 채점 기준표 JSON 파일 경로
"""
self.scoring_criteria = self._load_scoring_criteria(scoring_criteria_path)
# 오탈자 감점 설정
self.typo_penalties = {
'slight': 0.9, # 90% 점수 (약간의 오탈자)
'moderate': 0.7, # 70% 점수 (중간 정도의 오탈자)
'severe': 0.0 # 0% 점수 (심각한 오탈자)
}
def _load_scoring_criteria(self, file_path):
"""
JSON 채점 기준표를 로드합니다.
Args:
file_path (str): JSON 파일 경로
Returns:
dict: 채점 기준표 데이터
"""
with open(file_path, 'r', encoding='utf-8') as f:
return json.load(f)
def _calculate_similarity_score(self, str1, str2):
"""
두 문자열 간의 유사도를 계산합니다.
Args:
str1 (str): 첫 번째 문자열
str2 (str): 두 번째 문자열
Returns:
float: 유사도 점수 (0.0 ~ 1.0)
"""
if str1 is None or str2 is None:
return 0.0
max_len = max(len(str1), len(str2))
if max_len == 0:
return 1.0
distance = levenshtein_distance(str1, str2)
similarity = 1 - (distance / max_len)
return similarity
def _get_penalty_factor(self, similarity):
"""
유사도에 따른 감점 계수를 반환합니다.
Args:
similarity (float): 유사도 점수
Returns:
float: 감점 계수
"""
if similarity >= 0.9:
return self.typo_penalties['slight']
elif similarity >= 0.7:
return self.typo_penalties['moderate']
else:
return self.typo_penalties['severe']
def _find_best_matching_element(self, root, target_element):
"""
가장 유사한 요소를 찾습니다.
Args:
root (Element): XML 루트 요소
target_element (str): 찾고자 하는 요소 이름
Returns:
tuple: (가장 유사한 요소, 유사도 점수)
"""
best_match = None
best_similarity = 0.0
for element in root.iter():
similarity = self._calculate_similarity_score(element.tag, target_element)
if similarity > best_similarity:
best_similarity = similarity
best_match = element
return best_match, best_similarity
def _find_element_value(self, root, element_name, attribute_name):
"""
XML에서 특정 요소와 속성값을 찾습니다. 오탈자를 고려합니다.
Args:
root (Element): XML 루트 요소
element_name (str): 찾을 요소 이름
attribute_name (str): 찾을 속성 이름
Returns:
tuple: (속성값, 요소 유사도, 속성 유사도)
"""
element, element_similarity = self._find_best_matching_element(root, element_name)
if element is not None:
# 속성 중 가장 유사한 것을 찾음
best_attr_value = None
best_attr_similarity = 0.0
for attr_name, attr_value in element.attrib.items():
attr_similarity = self._calculate_similarity_score(attr_name, attribute_name)
if attr_similarity > best_attr_similarity:
best_attr_similarity = attr_similarity
best_attr_value = attr_value
return best_attr_value, element_similarity, best_attr_similarity
return None, 0.0, 0.0
def score_xml_file(self, xml_path):
"""
단일 XML 파일을 채점합니다.
Args:
xml_path (str): XML 파일 경로
Returns:
dict: 채점 결과
"""
try:
tree = ET.parse(xml_path)
root = tree.getroot()
total_score = 0
results = {
'filename': os.path.basename(xml_path),
'criteria_matches': [],
'total_score': 0
}
# 각 채점 기준에 대해 검사
for criterion_id, criterion in self.scoring_criteria.items():
element_name = criterion['ele']
attribute_name = criterion['arg']
expected_value = criterion['value']
points = criterion['points']
# 오탈자를 고려하여 값을 찾음
actual_value, element_similarity, attr_similarity = self._find_element_value(
root, element_name, attribute_name)
# 값 유사도 계산
value_similarity = self._calculate_similarity_score(str(actual_value), str(expected_value))
# 전체 유사도 계산 (요소, 속성, 값의 유사도를 종합)
total_similarity = (element_similarity + attr_similarity + value_similarity) / 3
# 감점 계수 계산
penalty_factor = self._get_penalty_factor(total_similarity)
match = {
'criterion': f"{element_name}.{attribute_name}",
'expected': expected_value,
'actual': actual_value,
'element_similarity': round(element_similarity, 3),
'attribute_similarity': round(attr_similarity, 3),
'value_similarity': round(value_similarity, 3),
'total_similarity': round(total_similarity, 3),
'penalty_factor': penalty_factor,
'points': round(points * penalty_factor, 2)
}
total_score += match['points']
results['criteria_matches'].append(match)
results['total_score'] = round(total_score, 2)
return results
except ET.ParseError as e:
return {
'filename': os.path.basename(xml_path),
'error': f"XML 파싱 오류: {str(e)}",
'total_score': 0
}
def score_directory(self, xml_directory):
"""
디렉토리 내의 모든 XML 파일을 채점합니다.
Args:
xml_directory (str): XML 파일들이 있는 디렉토리 경로
Returns:
list: 모든 파일의 채점 결과
"""
results = []
xml_files = Path(xml_directory).glob('*.xml')
for xml_file in xml_files:
result = self.score_xml_file(str(xml_file))
results.append(result)
return results
def export_to_excel(self, results, output_path=None):
"""
채점 결과를 엑셀 파일로 저장합니다.
Args:
results (list): 채점 결과 리스트
output_path (str, optional): 출력 파일 경로
"""
if output_path is None:
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
output_path = f"scoring_results_{timestamp}.xlsx"
# 요약 시트용 데이터 준비
summary_data = []
detail_data = []
for result in results:
# 요약 정보
summary_row = {
'파일명': result['filename'],
'총점': result.get('total_score', 0)
}
if 'error' in result:
summary_row['오류'] = result['error']
summary_data.append(summary_row)
# 상세 정보
if 'criteria_matches' in result:
for match in result['criteria_matches']:
detail_row = {
'파일명': result['filename'],
'채점항목': match['criterion'],
'기대값': match['expected'],
'실제값': match['actual'],
'요소유사도': match['element_similarity'],
'속성유사도': match['attribute_similarity'],
'값유사도': match['value_similarity'],
'전체유사도': match['total_similarity'],
'감점계수': match['penalty_factor'],
'획득점수': match['points']
}
detail_data.append(detail_row)
# DataFrame 생성
summary_df = pd.DataFrame(summary_data)
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=False)
# 열 너비 자동 조정
for sheet_name in writer.sheets:
worksheet = writer.sheets[sheet_name]
for column in worksheet.columns:
max_length = 0
column = [cell for cell in column]
for cell in column:
try:
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
except:
pass
adjusted_width = (max_length + 2)
worksheet.column_dimensions[column[0].column_letter].width = adjusted_width
return output_path
# 메인 함수는 이전과 동일
# 사용 예시
def main():
# 채점기준표 파일 경로
scoring_criteria_path = "scoring_criteria.json"
# XML 파일들이 있는 디렉토리 경로
xml_directory = r"C:\Users\gzero-ser7-win11\Documents\hwpTest\Output"
# 채점기 초기화
scorer = XMLScorer(scoring_criteria_path)
# 디렉토리 내 모든 XML 파일 채점
results = scorer.score_directory(xml_directory)
# 결과 출력
for result in results:
print(f"\n파일: {result['filename']}")
if 'error' in result:
print(f"오류: {result['error']}")
continue
print(f"총점: {result['total_score']}")
print("\n채점 세부사항:")
for match in result['criteria_matches']:
print(f"기준: {match['criterion']}")
print(f"기대값: {match['expected']}")
print(f"실제값: {match['actual']}")
print(f"획득 점수: {match['points']}")
print("---")
# 결과를 엑셀 파일로 저장
excel_path = scorer.export_to_excel(results)
print(f"\n채점 결과가 다음 경로에 저장되었습니다: {excel_path}")
if __name__ == "__main__":
main()

304
score3.py
View File

@@ -1,304 +0,0 @@
import json
import xml.etree.ElementTree as ET
import os
from pathlib import Path
import pandas as pd
from datetime import datetime
from difflib import SequenceMatcher
import re
class XMLScorer:
# 채점 기준 경로 초기화
def __init__(self, scoring_criteria_path):
# 채점 기준 로드
self.scoring_criteria = self._load_scoring_criteria(scoring_criteria_path)
print(self.scoring_criteria)
# 채점 기준파일 로드(JSON 파일)
def _load_scoring_criteria(self, file_path):
with open(file_path, 'r', encoding='utf-8') as f:
return json.load(f)
def _calculate_string_similarity(self, str1, str2):
"""
두 문자열 간의 유사도를 계산합니다.
Args:
str1 (str): 첫 번째 문자열
str2 (str): 두 번째 문자열
Returns:
float: 유사도 (0~1 사이의 값)
"""
return SequenceMatcher(None, str1, str2).ratio()
def _count_differences(self, str1, str2):
"""
두 문자열 간의 차이(오탈자, 띄어쓰기)를 계산합니다.
Args:
str1 (str): 첫 번째 문자열 (기준값)
str2 (str): 두 번째 문자열 (비교값)
Returns:
tuple: (전체 차이 개수, 띄어쓰기 차이 개수)
"""
# 띄어쓰기 차이 계산
space_diff = abs(str1.count(' ') - str2.count(' '))
# 전체 글자 차이 계산 (Levenshtein 거리 기반)
total_diff = 0
m, n = len(str1), len(str2)
dp = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(m + 1):
dp[i][0] = i
for j in range(n + 1):
dp[0][j] = j
for i in range(1, m + 1):
for j in range(1, n + 1):
if str1[i-1] == str2[j-1]:
dp[i][j] = dp[i-1][j-1]
else:
dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1
total_diff = dp[m][n]
return total_diff, space_diff
def _find_similar_element(self, root, target_element):
"""
유사한 요소를 찾습니다. 완전 일치하지 않더라도 비슷한 이름의 요소를 찾습니다.
Args:
root (Element): XML 루트 요소
target_element (str): 찾고자 하는 요소 이름
Returns:
Element: 가장 유사한 요소 또는 None
"""
best_match = None
best_similarity = 0.7 # 최소 유사도 임계값
for element in root.iter():
similarity = self._calculate_string_similarity(element.tag, target_element)
if similarity > best_similarity:
best_similarity = similarity
best_match = element
return best_match
def _find_element_value(self, root, element_name, attribute_name):
"""
XML에서 특정 요소와 속성값을 찾습니다. 유사한 요소도 고려합니다.
Args:
root (Element): XML 루트 요소
element_name (str): 찾을 요소 이름
attribute_name (str): 찾을 속성 이름
Returns:
tuple: (찾은 속성값 또는 None, 요소 이름 오탈자 여부)
"""
# 정확한 요소 찾기
element = root.find(f".//{element_name}")
# 정확한 요소가 없으면 유사한 요소 찾기
if element is None:
element = self._find_similar_element(root, element_name)
if element is not None:
# 속성값 찾기
value = element.get(attribute_name)
# 요소 이름이 정확히 일치하는지 확인
has_typo = element.tag != element_name
return value, has_typo
return None, False
# XML 파일 채점
def score_xml_file(self, xml_path):
try:
tree = ET.parse(xml_path)
root = tree.getroot()
total_score = 0
# 결과값을 Dictionary로 저장
results = {
'filename': os.path.basename(xml_path),
'criteria_matches': [], # 채점 항목별 결과
'total_score': 0,
'deductions': [] # 감점 상세 내역 추가
}
for criterion_id, criterion in self.scoring_criteria.items():
element_name = criterion['ele']
attribute_name = criterion['arg']
expected_value = criterion['value']
points = criterion['points']
actual_value, has_element_typo = self._find_element_value(
root, element_name, attribute_name)
# 채점 결과 저장
match = {
'criterion': f"{element_name}.{attribute_name}", # 채점 항목
'expected': expected_value, # 기대값
'actual': actual_value, # 실제값
'points': 0, # 획득 점수
'deductions': [] # 각 기준별 감점 내역
}
if actual_value is not None:
# 기본 점수 부여
match['points'] = points
# 요소 이름에 오탈자가 있는 경우
if has_element_typo:
deduction = 1
match['points'] -= deduction
match['deductions'].append(
f"요소 이름 오탈자 감점: -{deduction}")
# 속성값 비교 및 차이 계산
if actual_value != expected_value:
total_diff, space_diff = self._count_differences(
expected_value, actual_value)
# 띄어쓰기 차이당 1점 감점
if space_diff > 0:
match['points'] -= space_diff
match['deductions'].append(
f"띄어쓰기 오류 감점: -{space_diff}")
# 나머지 차이(오탈자)당 1점 감점
char_diff = total_diff - space_diff
if char_diff > 0:
match['points'] -= char_diff
match['deductions'].append(
f"글자 오류 감점: -{char_diff}")
# 음수 점수 방지
match['points'] = max(0, match['points'])
results['criteria_matches'].append(match)
total_score += match['points']
results['total_score'] = total_score
return results
except ET.ParseError as e:
return {
'filename': os.path.basename(xml_path),
'error': f"XML 파싱 오류: {str(e)}",
'total_score': 0
}
def export_to_excel(self, results, output_path=None):
if output_path is None:
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
output_path = f"scoring_results_{timestamp}.xlsx"
summary_data = []
detail_data = []
for result in results:
# 요약 정보
summary_row = {
'파일명': result['filename'],
'총점': result.get('total_score', 0)
}
if 'error' in result:
summary_row['오류'] = result['error']
summary_data.append(summary_row)
# 상세 정보
if 'criteria_matches' in result:
for match in result['criteria_matches']:
detail_row = {
'파일명': result['filename'],
'채점항목': match['criterion'],
'기대값': match['expected'],
'실제값': match['actual'],
'획득점수': match['points'],
'감점내역': '; '.join(match.get('deductions', []))
}
detail_data.append(detail_row)
# DataFrame 생성
summary_df = pd.DataFrame(summary_data)
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=False)
# 열 너비 자동 조정
for sheet_name in writer.sheets:
worksheet = writer.sheets[sheet_name]
for column in worksheet.columns:
max_length = 0
column = [cell for cell in column]
for cell in column:
try:
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
except:
pass
adjusted_width = (max_length + 2)
worksheet.column_dimensions[column[0].column_letter].width = adjusted_width
return output_path
def score_directory(self, xml_directory):
results = []
# xml_files = Path(xml_directory).glob('*.xml')
xml_files = Path(xml_directory).glob('*.hml')
for xml_file in xml_files:
result = self.score_xml_file(str(xml_file))
results.append(result)
return results
# 사용 예시
def main():
# 채점기준표 파일 경로
scoring_criteria_path = "scoring_criteria.json"
# XML 파일들이 있는 디렉토리 경로
# xml_directory = r"C:\Users\gzero-ser7-win11\Documents\hwpTest\Output"
xml_directory = r"C:\Users\dra\project\HWP-Scoring\output"
# 채점기 초기화
scorer = XMLScorer(scoring_criteria_path)
# 디렉토리 내 모든 XML 파일 채점
results = scorer.score_directory(xml_directory)
# 결과 출력
for result in results:
print(f"\n파일: {result['filename']}")
if 'error' in result:
print(f"오류: {result['error']}")
continue
print(f"총점: {result['total_score']}")
print("\n채점 세부사항:")
for match in result['criteria_matches']:
print(f"기준: {match['criterion']}")
print(f"기대값: {match['expected']}")
print(f"실제값: {match['actual']}")
print(f"획득 점수: {match['points']}")
print("---")
# 결과를 엑셀 파일로 저장
excel_path = scorer.export_to_excel(results)
print(f"\n채점 결과가 다음 경로에 저장되었습니다: {excel_path}")
if __name__ == "__main__":
main()

View File

@@ -1,50 +0,0 @@
from lxml import etree
from difflib import SequenceMatcher
def get_all_text_xml_file(root):
# all_text = root.xpath("//CHAR/text() | //TEXTART/@Text")
all_text = root.xpath("//CHAR/text()")
print(f'all_text length: {len(all_text)}')
return all_text
def find_typos_and_spaces(original, target):
typos = []
spaces = []
space_differences = 0
for text in original:
# 오타 검사
words = text.split()
for word in words:
if not any(SequenceMatcher(None, word, target_word).ratio() >= 0.9 for target_word in target):
typos.append(word)
# 공백 차이 검사
for orig_text, targ_text in zip(original, target):
min_length = min(len(orig_text), len(targ_text))
orig_text = orig_text[:min_length]
targ_text = targ_text[:min_length]
orig_spaces = orig_text.count(' ')
targ_spaces = targ_text.count(' ')
space_differences += abs(orig_spaces - targ_spaces)
print(f'space_differences : {space_differences}')
return typos, spaces
# XML 파일 파싱
original_file = r"C:\Users\dra\project\HWP-Scoring\output\워드(한글)-010128-윤빈.hml"
target_file = r"C:\Users\dra\project\HWP-Scoring\output\워드(한글)-009939-이준.hml"
# target_file = r"C:\Users\dra\project\HWP-Scoring\output\원본 copy.hml"
tree = etree.parse(original_file)
root = tree.getroot()
original_text = get_all_text_xml_file(root)
tree = etree.parse(target_file)
root = tree.getroot()
target_text = get_all_text_xml_file(root)
typos, spaces = find_typos_and_spaces(original_text, target_text)
# print(f'Typos: {typos}')
# print(f'Spaces: {spaces}')

580
score5.py
View File

@@ -1,580 +0,0 @@
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_path, chart_xml):
try:
tree = ET.parse(xml_path)
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)
total_score = 0
partial_score = 0
previous_first_digit = None
# 결과값을 Dictionary로 저장
results = {
'filename': os.path.basename(xml_path),
'score_results': [],
'total_score': 0,
'partial_scores': []
}
print(f"File name: {results['filename']}")
for criterion_id, criterion in self.scoring_criteria.items():
# 키값의 첫 숫자를 확인
first_digit = criterion_id.split('-')[0]
if (previous_first_digit is not None) and (first_digit != previous_first_digit):
results['partial_scores'].append({
'section': previous_first_digit,
'score': partial_score
})
partial_score = 0
previous_first_digit = first_digit
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 = {
'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['total_score'] = total_score
if previous_first_digit is not None:
results['partial_scores'].append({
'section': previous_first_digit,
'score': partial_score
})
return results
except ET.ParseError as e:
return {
'filename': os.path.basename(xml_path),
'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]
ignore_word = self.scoring_criteria["2-29"]['path'].split("'")[1]
print(f"ignore_word: {ignore_word}")
# 특정 단어 제거
# 오타와 누락의 경우만 판단하면 정상작동하지만
# 추가 된 단어의 경우를 채점기준에 추가하면 정확하게 채점 되지 않을 수 있음
# [정답] 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]
# 리스트를 하나의 문자열로 변경
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
partial_idx = 0
row_index = []
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']
row_index.append(f'문제{section_num}')
partial_idx += 1
section_num = current_section
detail_row[f'{i+1}'] = score_result['points']
row_index.append(score_result['id'])
# 마지막 섹션의 부분합을 출력
if section_num is not None and partial_idx < len(result['partial_scores']):
detail_row[f'문제{section_num}'] = result['partial_scores'][partial_idx]['score']
row_index.append(f'문제{section_num}')
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()

View File

@@ -412,8 +412,7 @@
"value": "견고딕", "value": "견고딕",
"points": 1, "points": 1,
"category": "FontName", "category": "FontName",
"item": "문구 (클라우드 컴퓨팅)/⑧ 글씨체 (견고딕)", "item": "문구 (클라우드 컴퓨팅)/⑧ 글씨체 (견고딕)"
"desc": "폰트 '견고딕'과 '중고딕'은 한글프로그램 내부적으로 '한양견고딕', '한양중고딕'처리 되어서 프로그램 내부에서 수험자 답변에서 '한양'을 제거하는 과정을 거침"
}, },
"12": { "12": {
"path": "//CHARSHAPE[@Id=//RECTANGLE//TEXT[./CHAR[text()='{searchValue}']]/@CharShape]/@Height", "path": "//CHARSHAPE[@Id=//RECTANGLE//TEXT[./CHAR[text()='{searchValue}']]/@CharShape]/@Height",
@@ -445,14 +444,14 @@
"value": "80", "value": "80",
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "② 크기-너비 (80mm)" "item": "② 크기-너비 (80 mm)"
}, },
"16": { "16": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/SIZE/@Height", "path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/SIZE/@Height",
"value": "45", "value": "45",
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "③ 크기-높이 (45mm)" "item": "③ 크기-높이 (45 mm)"
}, },
"17": { "17": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/POSITION/@HorzOffset", "path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/POSITION/@HorzOffset",
@@ -599,7 +598,7 @@
"item": "문구 (…유출과 데이터 사이버…)/\"유출과\" / \"데이터\" 순서바꿈" "item": "문구 (…유출과 데이터 사이버…)/\"유출과\" / \"데이터\" 순서바꿈"
}, },
"33": { "33": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape", "path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape",
"searchValue": "클라우드 보안(단위: 백만 달러)", "searchValue": "클라우드 보안(단위: 백만 달러)",
"value": "돋움", "value": "돋움",
"points": 1, "points": 1,
@@ -702,7 +701,7 @@
"points": 2, "points": 2,
"category": "ChartType", "category": "ChartType",
"item": "① 종류 (묶은 세로 막대형)", "item": "① 종류 (묶은 세로 막대형)",
"desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다." "desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)"
}, },
"46": { "46": {
"chart_xpath": "//c:valAx/c:majorTickMark/@val", "chart_xpath": "//c:valAx/c:majorTickMark/@val",
@@ -717,14 +716,14 @@
"value": "80", "value": "80",
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "③ 크기-너비 (80mm)" "item": "③ 크기-너비 (80 mm)"
}, },
"48": { "48": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Height", "path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Height",
"value": "90", "value": "90",
"points": 2, "points": 2,
"category": "mmSize", "category": "mmSize",
"item": "④ 크기-높이 (90mm)" "item": "④ 크기-높이 (90 mm)"
}, },
"49": { "49": {
"chart_xpath": "boolean(//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계' or text()='평균']))", "chart_xpath": "boolean(//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계' or text()='평균']))",
@@ -764,14 +763,14 @@
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface", "chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface",
"value": "돋움", "value": "돋움",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "ChartOneAnswer",
"item": "X축/① 글꼴 (돋움)" "item": "X축/① 글꼴 (돋움)"
}, },
"54": { "54": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@sz", "chart_xpath": "//c:catAx/c:txPr//a:defRPr/@sz",
"value": "900", "value": "900",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "ChartOneAnswer",
"item": "X축/② 크기 (9pt)" "item": "X축/② 크기 (9pt)"
}, },
"55": { "55": {
@@ -779,7 +778,7 @@
"option": "i", "option": "i",
"value": "1", "value": "1",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "ChartOneAnswer",
"item": "X축/③ 기울임", "item": "X축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b" "desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
}, },
@@ -787,14 +786,14 @@
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface", "chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface",
"value": "돋움", "value": "돋움",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "ChartOneAnswer",
"item": "Y축/① 글꼴 (돋움)" "item": "Y축/① 글꼴 (돋움)"
}, },
"57": { "57": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@sz", "chart_xpath": "//c:valAx/c:txPr//a:defRPr/@sz",
"value": "900", "value": "900",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "ChartOneAnswer",
"item": "Y축/② 크기 (9pt)" "item": "Y축/② 크기 (9pt)"
}, },
"58": { "58": {
@@ -802,7 +801,7 @@
"option": "i", "option": "i",
"value": "1", "value": "1",
"points": 1, "points": 1,
"category": "OneAnswer", "category": "ChartOneAnswer",
"item": "Y축/③ 기울임", "item": "Y축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b" "desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
}, },

View File

@@ -412,8 +412,7 @@
"value": "궁서체", "value": "궁서체",
"points": 1, "points": 1,
"category": "FontName", "category": "FontName",
"item": "문구 (친환경 에너지)/⑧ 글씨체 (궁서체)", "item": "문구 (친환경 에너지)/⑧ 글씨체 (궁서체)"
"desc": "폰트 '견고딕'과 '중고딕'은 한글프로그램 내부적으로 '한양견고딕', '한양중고딕'처리 되어서 프로그램 내부에서 수험자 답변에서 '한양'을 제거하는 과정을 거침"
}, },
"12": { "12": {
"path": "//CHARSHAPE[@Id=//RECTANGLE//TEXT[./CHAR[text()='{searchValue}']]/@CharShape]/@Height", "path": "//CHARSHAPE[@Id=//RECTANGLE//TEXT[./CHAR[text()='{searchValue}']]/@CharShape]/@Height",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,836 @@
{
"0": {
"0": {
"path": "",
"path2": "",
"points": 0,
"category": "파일저장",
"item": "파일명 (수검번호.hwp/hwpx)"
},
"1": {
"path": "//PAGEMARGIN",
"value": {
"Top": 20,
"Bottom": 20,
"Left": 20,
"Right": 20,
"Header": 10,
"Footer": 10,
"Gutter": 0
},
"tolerance": 1,
"points": 4,
"category": "PageSetting",
"item": "A4용지, 왼쪽/오른쪽/위쪽/아래쪽 (각20mm), 머리말/꼬리말 (10mm), 제본(0mm)"
},
"2": {
"path": "",
"value": {
"FontName": "바탕",
"FontSize": "1000",
"Alignment": "Justify",
"LineSpacing": "160"
},
"points": 4,
"category": "BasicSetting",
"item": "글꼴 (바탕, 10pt), 양쪽정렬, 줄간격 (160%)"
},
"3": {
"path": "",
"value": null,
"points": 40,
"category": "오타감점",
"item": "오타 1개 -1점 / 2503회부터 오타 1개 -1점으로 변경"
}
},
"1": {
"1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"searchValue": "천혜의비경철쭉",
"value": "맑은 고딕",
"points": 1,
"category": "OneAnswer",
"item": "문구 (천혜의비경철쭉)/① 글씨체 (맑은 고딕)"
},
"2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"searchValue": "천혜의비경철쭉",
"value": "28,61,98",
"points": 2,
"category": "Color",
"item": "문구 (천혜의비경철쭉)/② 채우기 : 색상(RGB:100,170,92)"
},
"3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"searchValue": "천혜의비경철쭉",
"value": "110",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (천혜의비경철쭉)/③ 크기-너비 (110mm)"
},
"4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"searchValue": "천혜의비경철쭉",
"value": "20",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (천혜의비경철쭉)/④ 크기-높이 (20 mm)"
},
"5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "천혜의비경철쭉",
"value": "true",
"points": 2,
"category": "OneAnswer",
"item": "문구 (천혜의비경철쭉)/⑤ 위치 (글자처럼 취급)"
},
"6": {
"path":"//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "천혜의비경철쭉",
"value": "Center",
"points": 2,
"category": "OneAnswer",
"item": "문구 (천혜의비경철쭉)/⑥ 정렬 (가운데 정렬)"
},
"7": {
"path": "//TEXTART[@Text='{searchValue}']",
"searchValue": "천혜의비경철쭉",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (천혜의비경철쭉)/⑦ 글맵시모양 (육안확인)"
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE",
"searchValue": "전",
"value": {
"Height": 2800,
"Width": 2800
},
"tolerance": 200,
"points": 1,
"category": "TwoLineSize",
"item": "전/① 모양 (2줄)"
},
"9": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "전",
"value": "궁서체",
"points": 1,
"category": "FontName",
"item": "전/② 글씨체 (궁서체)"
},
"10": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "전",
"value": "255,132,58",
"points": 2,
"category": "Color",
"item": "전/③ 면색 : 색상(RGB:255,132,58)"
},
"11": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right",
"searchValue": "전",
"value": "3.0",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "전/④ 본문과의 간격 : 3.0mm"
},
"12": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "바래봉 해발 약 500m에서 시작해 점점 정상으로",
"value": "BOLD",
"points": 2,
"category": "FontAttribute",
"item": "문구 (바래봉 해발 약 500m에서 시작해 점점 정상으로)/① 진하게"
},
"13": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "바래봉 해발 약 500m에서 시작해 점점 정상으로",
"value": "ITALIC",
"points": 2,
"category": "FontAttribute",
"item": "문구 (바래봉 해발 약 500m에서 시작해 점점 정상으로)/② 기울임"
},
"14": {
"path": "//CHAR[contains(text(),'{char1}')]",
"path2": "//CHAR[contains(text(),'{char2}')]",
"path3": "//CHAR[contains(text(),'{char3}')]",
"char1": "●",
"char2": "●",
"char3": "※",
"value": 3,
"points": 3,
"category": "SpecialChar",
"item": "① ●, ② ●, ③ ※"
},
"15": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "참여안내",
"value": "궁서",
"points": 1,
"category": "FontName",
"item": "문구 (● 참여안내 ●)/① 글씨체 (궁서)"
},
"16": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "참여안내",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (● 참여안내 ●)/② 정렬 (가운데 정렬)"
},
"17": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "홈페이지(http://www.ihd.or.kr) 참조",
"value": "ITALIC",
"points": 1,
"category": "FontAttribute",
"item": "문구 (홈페이지(http://www.ihd.or.kr) 참조)/① 기울임"
},
"18": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "홈페이지(http://www.ihd.or.kr) 참조",
"value": "UNDERLINE",
"points": 1,
"category": "FontAttribute",
"item": "문구 (홈페이지(http://www.ihd.or.kr) 참조)/② 밑줄"
},
"19": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN",
"searchValue": "기타사항",
"value": {
"Left": 15,
"Indent": 12
},
"points": 2,
"category": "ParaShape",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (15pt), 내어쓰기 (12pt)",
"desc": "내부적으로 내어쓰기는 음수값 / JSON value값은 양수로 입력"
},
"20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"searchValue": "2025. 05. 24.",
"value": "1400",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2025. 05. 24.)/① 크기 (14pt)",
"desc": "1pt당 100"
},
"21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "2025. 05. 24.",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2025. 05. 24.)/② 정렬 (가운데 정렬)"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "운봉바래봉철쭉제",
"value": "궁서체",
"points": 1,
"category": "FontName",
"item": "문구 (운봉바래봉철쭉제)/① 글씨체 (궁서체)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "운봉바래봉철쭉제",
"value": "2600",
"points": 1,
"category": "OneAnswer",
"item": "문구 (운봉바래봉철쭉제)/② 크기 (26pt)"
},
"24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"searchValue": "운봉바래봉철쭉제",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (운봉바래봉철쭉제)/③ 정렬 (가운데 정렬)"
},
"25": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "DIAT",
"value": "궁서",
"points": 1,
"category": "FontName",
"item": "문구 (DIAT)/① 글꼴 (궁서)"
},
"26": {
"path": "//CHARSHAPE[@Id=//SECTION[1]//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "DIAT",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "문구 (DIAT)/② 크기 (9pt)"
},
"27": {
"path": "//PARASHAPE[@Id=//SECTION[1]//CHAR[text()='{searchValue}']/parent::TEXT/parent::P/@ParaShape]/@Align",
"searchValue": "DIAT",
"value": "Right",
"points": 1,
"category": "OneAnswer",
"item": "문구 (DIAT)/③ 정렬 (오른쪽 정렬)"
},
"28": {
"path": "//PAGENUM/@FormatType",
"value": "LatinCapital",
"points": 2,
"category": "PageNumber",
"item": "① 쪽 번호 매기기 (A,B,C 순으로)",
"desc1": {
"가,나,다":"HangulSyllable",
"1,2,3":"Digit",
"갑,을,병":"DecagonCircle",
"A,B,C":"LatinCapital",
"①,②,③":"CircledDigit",
"一,二,三":"Ideograph",
"㉠,㉡,㉢":"CircledHangulJamo",
"ⓐ,ⓑ,ⓒ":"CircledLatinSmall",
"i,ii,iii":"RomanSmall",
"㉮,㉯,㉰":"CircledHangulSyllable",
"정답에 맞는 값 value에 입력":""
},
"desc2": "1, 2페이지 모두 정답이어야 점수 부여"
},
"29": {
"path": "//PAGENUM/@Pos",
"value": "BottomRight",
"points": 2,
"category": "PageNumber",
"item": "오른쪽 아래",
"desc": "1, 2페이지 모두 정답이어야 점수 부여",
"desc2": {
"가운데 아래": "BottomCenter",
"오른쪽 아래": "BottomRight"
}
},
"30": {
"path": "not(//PARASHAPE[@Id=//SECTION[1]/P/@ParaShape]/PARAMARGIN[@LineSpacing!='{option}'])",
"option": "200",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문제 1 줄간격 200% 설정",
"desc": "1페이지 문단의 줄간격이 정답이 아닌 문단이 있으면 False(감점)"
}
},
"2": {
"1": {
"path": "//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@HeaderInside",
"path2": "//BORDERFILL[@Id=//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@BorferFill]",
"value": {
"header_inside": true,
"all_double_slim": true
},
"points": 4,
"category": "PageBorder",
"item": "문제2 쪽테두리(이중 실선, 머리말 포함) 설정"
},
"2": {
"path": "count(//SECTION)>1",
"value": true,
"points": 3,
"category": "Boolean",
"item": "① 구역나누기",
"desc": "섹션이 1개 이상이면 점수부여"
},
"3": {
"path": "//COLDEF/@Count",
"value": "2",
"points": 3,
"category": "OneAnswer",
"item": "② 다단 2단"
},
"4": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"searchValue": "철쭉과 진달래",
"value": "50",
"points": 2,
"category": "mmSize",
"item": "문구 (철쭉과 진달래)/① 크기-너비 (50 mm)"
},
"5": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"searchValue": "철쭉과 진달래",
"value": "12",
"points": 2,
"category": "mmSize",
"item": "문구 (철쭉과 진달래)/② 크기-높이 (12 mm)"
},
"6": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//LINESHAPE/@Style",
"path2": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//LINESHAPE/@Width",
"searchValue": "철쭉과 진달래",
"value": [ "DoubleSlim", "283" ],
"points": 2,
"category": "DoubleAnswer",
"item": "문구 (철쭉과 진달래)/③ 테두리 : 이중 실선(1.00mm)",
"desc": "1mm = 283pt"
},
"7": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/@Ratio",
"searchValue": "철쭉과 진달래",
"value": "20",
"points": 2,
"category": "OneAnswer",
"item": "문구 (철쭉과 진달래)/④ 글상자 모서리 (둥근모양)",
"desc": "모서리 비율 50이면 반원 / 20이면 둥근모양"
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "철쭉과 진달래",
"value": "225,15,161",
"points": 2,
"category": "Color",
"item": "문구 (철쭉과 진달래)/⑤ 채우기 : 색상(RGB:225,15,161)"
},
"9": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "철쭉과 진달래",
"value": "true",
"points": 1,
"category": "OneAnswer",
"item": "문구 (철쭉과 진달래)/⑥ 글상자 위치 (글자처럼 취급)"
},
"10": {
"path": "//PARASHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::P[last()]/@ParaShape]/@Align",
"searchValue": "철쭉과 진달래",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (철쭉과 진달래)/⑦ 글상자 정렬 (가운데 정렬)"
},
"11": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "철쭉과 진달래",
"value": "맑은고딕",
"points": 1,
"category": "FontName",
"item": "문구 (철쭉과 진달래)/⑧ 글씨체 (맑은고딕)"
},
"12": {
"path": "//CHARSHAPE[@Id=//RECTANGLE//TEXT[./CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "철쭉과 진달래",
"value": "1800",
"points": 1,
"category": "OneAnswer",
"item": "문구 (철쭉과 진달래)/⑨ 글씨크기 (18 pt)",
"desc":"1pt당 100"
},
"13": {
"path": "//PARASHAPE[@Id=//RECTANGLE//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "철쭉과 진달래",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (철쭉과 진달래)/⑩ 정렬 (가운데 정렬)"
},
"14": {
"path": "boolean(//PICTURE//SHAPECOMMENT[contains(text(),'{searchValue}')])",
"searchValue": "원본 그림의 이름: 그림",
"value": true,
"points": 2,
"category": "Boolean",
"item": "① 파일명 \"그림A.jpg\" 삽입"
},
"15": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/SIZE/@Width",
"value": "85",
"points": 2,
"category": "mmSize",
"item": "② 크기-너비 (85 mm)"
},
"16": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/SIZE/@Height",
"value": "40",
"points": 2,
"category": "mmSize",
"item": "③ 크기-높이 (40 mm)"
},
"17": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/POSITION/@HorzOffset",
"value": "0",
"points": 2,
"category": "mmSize",
"item": "④ 위치 (어울림 : 가로-쪽의 왼쪽 0.0mm)"
},
"18": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/POSITION/@VertOffset",
"value": "23",
"points": 2,
"category": "mmSize",
"item": "⑤ 위치 (어울림 : 세로-쪽의 위 23 mm)"
},
"19": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "1. 철쭉의 특징",
"value": "굴림",
"points": 1,
"category": "FontName",
"item": "문구① (1. 철쭉의 특징)/① 글씨체 (굴림)"
},
"20": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "1. 철쭉의 특징",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구① (1. 철쭉의 특징)/② 크기 (12pt)"
},
"21": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "1. 철쭉의 특징",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구① (1. 철쭉의 특징)/③ 진하게"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "2. 봄의 전령 진달래",
"value": "굴림",
"points": 1,
"category": "FontName",
"item": "문구② (2. 봄의 전령 진달래)/① 글씨체 (굴림)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "2. 봄의 전령 진달래",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구② (2. 봄의 전령 진달래)/② 크기 (12pt)"
},
"24": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "2. 봄의 전령 진달래",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구② (2. 봄의 전령 진달래)/③ 진하게"
},
"25": {
"path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)",
"option": "거름",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (거름)/① 각주 설정 및 문구 입력"
},
"26": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "땅을 기름지게 하는데 사용되는 유기물질",
"value": "궁서",
"points": 1,
"category": "FontName",
"item": "문구 (거름)/② 글씨체 (궁서)"
},
"27": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height",
"searchValue": "땅을 기름지게 하는데 사용되는 유기물질",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "문구 (거름)/③ 크기 (9pt)"
},
"28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"searchValue": "땅을 기름지게 하는데 사용되는 유기물질",
"value": "Ideograph",
"points": 2,
"category": "OneAnswer",
"item": "문구 (거름)/④ 각주 번호모양",
"desc": {
"가,나,다":"HangulSyllable",
"1,2,3":"Digit",
"갑,을,병":"DecagonCircle",
"A,B,C":"LatinCapital",
"①,②,③":"CircledDigit",
"一,二,三":"Ideograph",
"㉠,㉡,㉢":"CircledHangulJamo",
"ⓐ,ⓑ,ⓒ":"CircledLatinSmall",
"i,ii,iii":"RomanSmall",
"㉮,㉯,㉰":"CircledHangulSyllable",
"정답에 맞는 값 value에 입력":""
}
},
"29": {
"path": "boolean(//CHAR[contains(text(),'Breeding')])",
"ignoreWord": "Breeding",
"value": true,
"points": 3,
"category": "Boolean",
"item": "Breeding/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": "유사도 검사를 진행하지 않고 영단어가 모두 일치해야 하므로 xpath구문 내 단어도 수정필요"
},
"30": {
"path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]",
"word":[
["생육", "生育"],
["유년", "幼年"],
["허기", "虛飢"],
["풍류", "風流"],
["식물", "植物"]
],
"value": 10,
"points": 10,
"category": "Hanja",
"item": "① 생육(生育), ② 유년(幼年), ③ 허기(虛飢), ④ 풍류(風流), ⑤ 식물(植物)"
},
"31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'지를잘라')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…새로 나온 가지가 잘라…) 가 → 를 글자바꿈"
},
"32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'보다참꽃')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…참꽃나무란 진달래보다 이름에 더…) 참꽃나무란 / 진달래보다 순서바꿈"
},
"33": {
"path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape",
"searchValue": "철쭉 관광객 현황(단위 : 천 명)",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "제목 문구 (철쭉 관광객 현황(단위 : 천 명))/① 글씨체 (돋움)"
},
"34": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "철쭉 관광객 현황(단위 : 천 명)",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (철쭉 관광객 현황(단위 : 천 명))/② 크기 (12pt)"
},
"35": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "철쭉 관광객 현황(단위 : 천 명)",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "제목 문구 (철쭉 관광객 현황(단위 : 천 명))/③ 진하게"
},
"36": {
"path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "철쭉 관광객 현황(단위 : 천 명)",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (철쭉 관광객 현황(단위 : 천 명))/④ 정렬 (가운데 정렬)"
},
"37": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"value": "140,249,62",
"points": 2,
"category": "Color",
"item": "위쪽 제목 셀/① 색상(RGB:140,249,62)"
},
"38": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "위쪽 제목 셀/② 진하게",
"desc": "글자 속성이라 CELLZONE으로 적용 되지 않음"
},
"39": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Type",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Type",
"value": "DoubleSlim",
"points": 2,
"category": "TableAnswer",
"item": "제목 셀 아래선/① 이중실선"
},
"40": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Width",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Width",
"value": "0.5mm",
"points": 2,
"category": "TableAnswer",
"item": "제목 셀 아래선/② 0.5mm"
},
"41": {
"path": "//TABLE//TEXT/@CharShape",
"path2": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"value": "중고딕",
"points": 1,
"category": "TableFontName",
"category_tmp": "FontName",
"item": "글자모양/① 글씨체 (중고딕)",
"desc": "테이블 폰트명 문항은 테이블의 모든 셀이 정답폰트와 일치해야 함, 하나만 일치해도 정답으로 채점할 경우 category값을 FontName으로 변경"
},
"42": {
"path": "//CHARSHAPE[@Id=//TABLE//TEXT/@CharShape]/@Height",
"value": "1000",
"points": 1,
"category": "TableAnswer",
"item": "글자모양/② 크기 (10pt)"
},
"43": {
"path": "//PARASHAPE[@Id=//TABLE/ROW//P/@ParaShape]/@Align",
"value": "Center",
"points": 1,
"category": "TableAnswer",
"item": "글자모양/③ 정렬 (가운데 정렬)"
},
"44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) and boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "AVG",
"value": true,
"points": 4,
"category": "Boolean",
"item": "블록 계산식/합계",
"desc": "option값에 합계는 SUM / 평균은 AVG"
},
"45": {
"chart_xpath": "",
"chart_type": "누적세로막대형",
"value": true,
"points": 2,
"category": "ChartType",
"item": "① 종류 (누적세로막대형)",
"desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)"
},
"46": {
"chart_xpath": "//c:valAx/c:majorTickMark/@val",
"value": "out",
"points": 2,
"category": "OneAnswer",
"item": "② 값 축 주 눈금선",
"desc": "chart xml파일에서 답안을 가져오는 문항은 path키값 대신 chart_xpath키값을 이용해 xapth구문을 작성한다"
},
"47": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Width",
"value": "80",
"points": 2,
"category": "mmSize",
"item": "③ 크기-너비 (80 mm)"
},
"48": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Height",
"value": "90",
"points": 2,
"category": "mmSize",
"item": "④ 크기-높이 (90 mm)"
},
"49": {
"chart_xpath": "boolean(//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계' or text()='평균']))",
"value": true,
"points": 2,
"category": "Boolean",
"item": "⑤ 차트 데이터(표에서 블록계산식을 제외한 나머지 값만 이용)",
"desc": "차트가 존재하고 블록계산식(합계, 평균) 데이터가 없는 경우 정답 처리"
},
"50": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"searchValue": "철쭉 관광객 현황",
"value": "굴림",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (철쭉 관광객 현황)/① 글씨체 (굴림)"
},
"51": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"searchValue": "철쭉 관광객 현황",
"value": "1300",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (철쭉 관광객 현황)/② 크기 (13pt)"
},
"52": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}",
"option": "b",
"searchValue": "철쭉 관광객 현황",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (철쭉 관광객 현황)/③ 진하게",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"53": {
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface",
"value": "돋움",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/① 글꼴 (돋움)"
},
"54": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/② 크기 (9pt)"
},
"55": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"56": {
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface",
"value": "돋움",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/① 글꼴 (돋움)"
},
"57": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/② 크기 (9pt)"
},
"58": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"59": {
"chart_xpath": "//c:legend//a:ea/@typeface",
"value": "돋움",
"points": 1,
"category": "OneAnswer",
"item": "범례/① 글꼴 (돋움)"
},
"60": {
"chart_xpath": "//c:legend//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "범례/② 크기 (9pt)"
},
"61": {
"chart_xpath": "//c:legend//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "범례/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
}
}
}

View File

@@ -0,0 +1,836 @@
{
"0": {
"0": {
"path": "",
"path2": "",
"points": 0,
"category": "파일저장",
"item": "파일명 (수검번호.hwp/hwpx)"
},
"1": {
"path": "//PAGEMARGIN",
"value": {
"Top": 20,
"Bottom": 20,
"Left": 20,
"Right": 20,
"Header": 10,
"Footer": 10,
"Gutter": 0
},
"tolerance": 1,
"points": 4,
"category": "PageSetting",
"item": "A4용지, 왼쪽/오른쪽/위쪽/아래쪽 (각20mm), 머리말/꼬리말 (10mm), 제본(0mm)"
},
"2": {
"path": "",
"value": {
"FontName": "바탕",
"FontSize": "1000",
"Alignment": "Justify",
"LineSpacing": "160"
},
"points": 4,
"category": "BasicSetting",
"item": "글꼴 (바탕, 10pt), 양쪽정렬, 줄간격 (160%)"
},
"3": {
"path": "",
"value": null,
"points": 40,
"category": "오타감점",
"item": "오타 1개 -1점 / 2503회부터 오타 1개 -1점으로 변경"
}
},
"1": {
"1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"searchValue": "광양매실축제안내",
"value": "맑은 고딕",
"points": 1,
"category": "OneAnswer",
"item": "문구 (광양매실축제안내)/① 글씨체 (맑은 고딕)"
},
"2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"searchValue": "광양매실축제안내",
"value": "199,80,124",
"points": 2,
"category": "Color",
"item": "문구 (광양매실축제안내)/② 채우기 : 색상(RGB:199,82,82)"
},
"3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"searchValue": "광양매실축제안내",
"value": "100",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (광양매실축제안내)/③ 크기-너비 (100mm)"
},
"4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"searchValue": "광양매실축제안내",
"value": "20",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (광양매실축제안내)/④ 크기-높이 (20 mm)"
},
"5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "광양매실축제안내",
"value": "true",
"points": 2,
"category": "OneAnswer",
"item": "문구 (광양매실축제안내)/⑤ 위치 (글자처럼 취급)"
},
"6": {
"path":"//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "광양매실축제안내",
"value": "Center",
"points": 2,
"category": "OneAnswer",
"item": "문구 (광양매실축제안내)/⑥ 정렬 (가운데 정렬)"
},
"7": {
"path": "//TEXTART[@Text='{searchValue}']",
"searchValue": "광양매실축제안내",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (광양매실축제안내)/⑦ 글맵시모양 (육안확인)"
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE",
"searchValue": "올",
"value": {
"Height": 2800,
"Width": 2800
},
"tolerance": 200,
"points": 1,
"category": "TwoLineSize",
"item": "올/① 모양 (2줄)"
},
"9": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "올",
"value": "궁서체",
"points": 1,
"category": "FontName",
"item": "올/② 글씨체 (궁서체)"
},
"10": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "올",
"value": "186,255,26",
"points": 2,
"category": "Color",
"item": "올/③ 면색 : 색상(RGB:186,255,26)"
},
"11": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right",
"searchValue": "올",
"value": "3.0",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "올/④ 본문과의 간격 : 3.0mm"
},
"12": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "봄 매화, 여름 매실로 우리 함께 힐링합시다!",
"value": "ITALIC",
"points": 2,
"category": "FontAttribute",
"item": "문구 (봄 매화, 여름 매실로 우리 함께 힐링합시다!)/① 기울임"
},
"13": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "봄 매화, 여름 매실로 우리 함께 힐링합시다!",
"value": "ITALIC",
"points": 2,
"category": "FontAttribute",
"item": "문구 (봄 매화, 여름 매실로 우리 함께 힐링합시다!)/② 기울임"
},
"14": {
"path": "//CHAR[contains(text(),'{char1}')]",
"path2": "//CHAR[contains(text(),'{char2}')]",
"path3": "//CHAR[contains(text(),'{char3}')]",
"char1": "→",
"char2": "←",
"char3": "※",
"value": 3,
"points": 3,
"category": "SpecialChar",
"item": "① → , ② ← , ③ ※"
},
"15": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "축제안내",
"value": "굴림체",
"points": 1,
"category": "FontName",
"item": "문구 (→ 축제안내 ←)/① 글씨체 (굴림체)"
},
"16": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "축제안내",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (→ 축제안내 ←)/② 정렬 (가운데 정렬)"
},
"17": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "광양매실축제 홈페이지(http://www.ihd.or.kr)",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구 (광양매실축제 홈페이지(http://www.ihd.or.kr))/① 진하게"
},
"18": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "광양매실축제 홈페이지(http://www.ihd.or.kr)",
"value": "ITALIC",
"points": 1,
"category": "FontAttribute",
"item": "문구 (광양매실축제 홈페이지(http://www.ihd.or.kr))/② 기울임"
},
"19": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN",
"searchValue": "기타사항",
"value": {
"Left": 15,
"Indent": 12
},
"points": 2,
"category": "ParaShape",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (15pt), 내어쓰기 (12pt)",
"desc": "내부적으로 내어쓰기는 음수값 / JSON value값은 양수로 입력"
},
"20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"searchValue": "2025. 05. 24.",
"value": "1400",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2025. 05. 24.)/① 크기 (14pt)",
"desc": "1pt당 100"
},
"21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "2025. 05. 24.",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2025. 05. 24.)/② 정렬 (가운데 정렬)"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "광양매실축제위원회",
"value": "견고딕",
"points": 1,
"category": "FontName",
"item": "문구 (광양매실축제위원회)/① 글씨체 (견고딕)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "광양매실축제위원회",
"value": "2600",
"points": 1,
"category": "OneAnswer",
"item": "문구 (광양매실축제위원회)/② 크기 (26pt)"
},
"24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"searchValue": "광양매실축제위원회",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (광양매실축제위원회)/③ 정렬 (가운데 정렬)"
},
"25": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "DIAT",
"value": "굴림",
"points": 1,
"category": "FontName",
"item": "문구 (DIAT)/① 글꼴 (굴림)"
},
"26": {
"path": "//CHARSHAPE[@Id=//SECTION[1]//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "DIAT",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "문구 (DIAT)/② 크기 (9pt)"
},
"27": {
"path": "//PARASHAPE[@Id=//SECTION[1]//CHAR[text()='{searchValue}']/parent::TEXT/parent::P/@ParaShape]/@Align",
"searchValue": "DIAT",
"value": "Right",
"points": 1,
"category": "OneAnswer",
"item": "문구 (DIAT)/③ 정렬 (오른쪽 정렬)"
},
"28": {
"path": "//PAGENUM/@FormatType",
"value": "CircledDigit",
"points": 2,
"category": "PageNumber",
"item": "① 쪽 번호 매기기 (A,B,C 순으로)",
"desc1": {
"가,나,다":"HangulSyllable",
"1,2,3":"Digit",
"갑,을,병":"DecagonCircle",
"A,B,C":"LatinCapital",
"①,②,③":"CircledDigit",
"一,二,三":"Ideograph",
"㉠,㉡,㉢":"CircledHangulJamo",
"ⓐ,ⓑ,ⓒ":"CircledLatinSmall",
"i,ii,iii":"RomanSmall",
"㉮,㉯,㉰":"CircledHangulSyllable",
"정답에 맞는 값 value에 입력":""
},
"desc2": "1, 2페이지 모두 정답이어야 점수 부여"
},
"29": {
"path": "//PAGENUM/@Pos",
"value": "BottomCenter",
"points": 2,
"category": "PageNumber",
"item": "가운데 아래",
"desc": "1, 2페이지 모두 정답이어야 점수 부여",
"desc2": {
"가운데 아래": "BottomCenter",
"오른쪽 아래": "BottomRight"
}
},
"30": {
"path": "not(//PARASHAPE[@Id=//SECTION[1]/P/@ParaShape]/PARAMARGIN[@LineSpacing!='{option}'])",
"option": "180",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문제 1 줄간격 180% 설정",
"desc": "1페이지 문단의 줄간격이 정답이 아닌 문단이 있으면 False(감점)"
}
},
"2": {
"1": {
"path": "//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@HeaderInside",
"path2": "//BORDERFILL[@Id=//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@BorferFill]",
"value": {
"header_inside": true,
"all_double_slim": true
},
"points": 4,
"category": "PageBorder",
"item": "문제2 쪽테두리(이중 실선, 머리말 포함) 설정"
},
"2": {
"path": "count(//SECTION)>1",
"value": true,
"points": 3,
"category": "Boolean",
"item": "① 구역나누기",
"desc": "섹션이 1개 이상이면 점수부여"
},
"3": {
"path": "//COLDEF/@Count",
"value": "2",
"points": 3,
"category": "OneAnswer",
"item": "② 다단 2단"
},
"4": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"searchValue": "매화와 매실",
"value": "55",
"points": 2,
"category": "mmSize",
"item": "문구 (매화와 매실)/① 크기-너비 (55 mm)"
},
"5": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"searchValue": "매화와 매실",
"value": "12",
"points": 2,
"category": "mmSize",
"item": "문구 (매화와 매실)/② 크기-높이 (12 mm)"
},
"6": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//LINESHAPE/@Style",
"path2": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//LINESHAPE/@Width",
"searchValue": "매화와 매실",
"value": [ "DoubleSlim", "283" ],
"points": 2,
"category": "DoubleAnswer",
"item": "문구 (매화와 매실)/③ 테두리 : 이중 실선(1.00mm)",
"desc": "1mm = 283pt"
},
"7": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/@Ratio",
"searchValue": "매화와 매실",
"value": "20",
"points": 2,
"category": "OneAnswer",
"item": "문구 (매화와 매실)/④ 글상자 모서리 (둥근모양)",
"desc": "모서리 비율 50이면 반원 / 20이면 둥근모양"
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "매화와 매실",
"value": "122,179,64",
"points": 2,
"category": "Color",
"item": "문구 (매화와 매실)/⑤ 채우기 : 색상(RGB:122,179,64)"
},
"9": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "매화와 매실",
"value": "true",
"points": 1,
"category": "OneAnswer",
"item": "문구 (매화와 매실)/⑥ 글상자 위치 (글자처럼 취급)"
},
"10": {
"path": "//PARASHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::P[last()]/@ParaShape]/@Align",
"searchValue": "매화와 매실",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (매화와 매실)/⑦ 글상자 정렬 (가운데 정렬)"
},
"11": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "매화와 매실",
"value": "중고딕",
"points": 1,
"category": "FontName",
"item": "문구 (매화와 매실)/⑧ 글씨체 (중고딕)"
},
"12": {
"path": "//CHARSHAPE[@Id=//RECTANGLE//TEXT[./CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "매화와 매실",
"value": "2000",
"points": 1,
"category": "OneAnswer",
"item": "문구 (매화와 매실)/⑨ 글씨크기 (20 pt)",
"desc":"1pt당 100"
},
"13": {
"path": "//PARASHAPE[@Id=//RECTANGLE//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "매화와 매실",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (매화와 매실)/⑩ 정렬 (가운데 정렬)"
},
"14": {
"path": "boolean(//PICTURE//SHAPECOMMENT[contains(text(),'{searchValue}')])",
"searchValue": "원본 그림의 이름: 그림",
"value": true,
"points": 2,
"category": "Boolean",
"item": "① 파일명 \"그림B.jpg\" 삽입"
},
"15": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/SIZE/@Width",
"value": "85",
"points": 2,
"category": "mmSize",
"item": "② 크기-너비 (85 mm)"
},
"16": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/SIZE/@Height",
"value": "40",
"points": 2,
"category": "mmSize",
"item": "③ 크기-높이 (40 mm)"
},
"17": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/POSITION/@HorzOffset",
"value": "0",
"points": 2,
"category": "mmSize",
"item": "④ 위치 (어울림 : 가로-쪽의 왼쪽 0.0mm)"
},
"18": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/POSITION/@VertOffset",
"value": "24",
"points": 2,
"category": "mmSize",
"item": "⑤ 위치 (어울림 : 세로-쪽의 위 24mm)"
},
"19": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "1. 매화의 특징",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "문구① (1. 매화의 특징)/① 글씨체 (돋움)"
},
"20": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "1. 매화의 특징",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구① (1. 매화의 특징)/② 크기 (12pt)"
},
"21": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "1. 매화의 특징",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구① (1. 매화의 특징)/③ 진하게"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "2. 매실의 효능",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "문구② (2. 매실의 효능)/① 글씨체 (돋움)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "2. 매실의 효능",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구② (2. 매실의 효능)/② 크기 (12pt)"
},
"24": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "2. 매실의 효능",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구② (2. 매실의 효능)/③ 진하게"
},
"25": {
"path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)",
"option": "문인화",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (문인화)/① 각주 설정 및 문구 입력"
},
"26": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "그림을 직업으로 하지 않는 선비나 사대부들이 여흥으로 자신들의 심중을 표현하여 그린 그림",
"value": "돋움체",
"points": 1,
"category": "FontName",
"item": "문구 (문인화)/② 글씨체 (돋움체)"
},
"27": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height",
"searchValue": "그림을 직업으로 하지 않는 선비나 사대부들이 여흥으로 자신들의 심중을 표현하여 그린 그림",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "문구 (문인화)/③ 크기 (9pt)"
},
"28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"searchValue": "그림을 직업으로 하지 않는 선비나 사대부들이 여흥으로 자신들의 심중을 표현하여 그린 그림",
"value": "CircledHangulSyllable",
"points": 2,
"category": "OneAnswer",
"item": "문구 (문인화)/④ 각주 번호모양",
"desc": {
"가,나,다":"HangulSyllable",
"1,2,3":"Digit",
"갑,을,병":"DecagonCircle",
"A,B,C":"LatinCapital",
"①,②,③":"CircledDigit",
"一,二,三":"Ideograph",
"㉠,㉡,㉢":"CircledHangulJamo",
"ⓐ,ⓑ,ⓒ":"CircledLatinSmall",
"i,ii,iii":"RomanSmall",
"㉮,㉯,㉰":"CircledHangulSyllable",
"정답에 맞는 값 value에 입력":""
}
},
"29": {
"path": "boolean(//CHAR[contains(text(),'Vitamin')])",
"ignoreWord": "Vitamin",
"value": true,
"points": 3,
"category": "Boolean",
"item": "Vitamin/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": "유사도 검사를 진행하지 않고 영단어가 모두 일치해야 하므로 xpath구문 내 단어도 수정필요"
},
"30": {
"path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]",
"word":[
["매향", "梅香"],
["불의", "不義"],
["국화", "菊花"],
["매실", "梅實"],
["해독", "解讀"]
],
"value": 10,
"points": 10,
"category": "Hanja",
"item": "① 매향(梅香), ② 불의(不義), ③ 국화(菊花), ④ 매실(梅實), ⑤ 해독(解讀)"
},
"31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'흰색,분홍')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (청색, 분홍색, 붉은색 등 다양한 색을…)/청 → 흰 글자바꿈"
},
"32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'킨과폴리')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (항산화 성분인 폴리페놀은 카테킨과 해독(解讀)과…)/ 폴리페놀은 / 카테킨과 순서바꿈"
},
"33": {
"path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape",
"searchValue": "광양매실축제 만족도(단위 : %)",
"value": "굴림체",
"points": 1,
"category": "FontName",
"item": "제목 문구 (광양매실축제 만족도(단위 : %))/① 글씨체 (굴림체)"
},
"34": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "광양매실축제 만족도(단위 : %)",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (광양매실축제 만족도(단위 : %))/② 크기 (12pt)"
},
"35": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "광양매실축제 만족도(단위 : %)",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "제목 문구 (광양매실축제 만족도(단위 : %))/③ 진하게"
},
"36": {
"path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "광양매실축제 만족도(단위 : %)",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (광양매실축제 만족도(단위 : %))/④ 정렬 (가운데 정렬)"
},
"37": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"value": "233,174,43",
"points": 2,
"category": "Color",
"item": "위쪽 제목 셀/① 색상(RGB:233,174,43)"
},
"38": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "위쪽 제목 셀/② 진하게",
"desc": "글자 속성이라 CELLZONE으로 적용 되지 않음"
},
"39": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Type",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Type",
"value": "DoubleSlim",
"points": 2,
"category": "TableAnswer",
"item": "제목 셀 아래선/① 이중실선"
},
"40": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Width",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Width",
"value": "0.5mm",
"points": 2,
"category": "TableAnswer",
"item": "제목 셀 아래선/② 0.5mm"
},
"41": {
"path": "//TABLE//TEXT/@CharShape",
"path2": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"value": "돋움",
"points": 1,
"category": "TableFontName",
"category_tmp": "FontName",
"item": "글자모양/① 글씨체 (돋움)",
"desc": "테이블 폰트명 문항은 테이블의 모든 셀이 정답폰트와 일치해야 함, 하나만 일치해도 정답으로 채점할 경우 category값을 FontName으로 변경"
},
"42": {
"path": "//CHARSHAPE[@Id=//TABLE//TEXT/@CharShape]/@Height",
"value": "1000",
"points": 1,
"category": "TableAnswer",
"item": "글자모양/② 크기 (10pt)"
},
"43": {
"path": "//PARASHAPE[@Id=//TABLE/ROW//P/@ParaShape]/@Align",
"value": "Center",
"points": 1,
"category": "TableAnswer",
"item": "글자모양/③ 정렬 (가운데 정렬)"
},
"44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) and boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "AVG",
"value": true,
"points": 4,
"category": "Boolean",
"item": "블록 계산식/합계",
"desc": "option값에 합계는 SUM / 평균은 AVG"
},
"45": {
"chart_xpath": "",
"chart_type": "묶은세로막대형",
"value": true,
"points": 2,
"category": "ChartType",
"item": "① 종류 (묶은세로막대형)",
"desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)"
},
"46": {
"chart_xpath": "//c:valAx/c:majorTickMark/@val",
"value": "out",
"points": 2,
"category": "OneAnswer",
"item": "② 값 축 주 눈금선",
"desc": "chart xml파일에서 답안을 가져오는 문항은 path키값 대신 chart_xpath키값을 이용해 xapth구문을 작성한다"
},
"47": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Width",
"value": "80",
"points": 2,
"category": "mmSize",
"item": "③ 크기-너비 (80 mm)"
},
"48": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Height",
"value": "90",
"points": 2,
"category": "mmSize",
"item": "④ 크기-높이 (90 mm)"
},
"49": {
"chart_xpath": "boolean(//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계' or text()='평균']))",
"value": true,
"points": 2,
"category": "Boolean",
"item": "⑤ 차트 데이터(표에서 블록계산식을 제외한 나머지 값만 이용)",
"desc": "차트가 존재하고 블록계산식(합계, 평균) 데이터가 없는 경우 정답 처리"
},
"50": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"searchValue": "광양매실축제 만족도",
"value": "궁서체",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (광양매실축제 만족도)/① 글씨체 (궁서체)"
},
"51": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"searchValue": "광양매실축제 만족도",
"value": "1300",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (광양매실축제 만족도)/② 크기 (13pt)"
},
"52": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}",
"option": "b",
"searchValue": "광양매실축제 만족도",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (광양매실축제 만족도)/③ 진하게",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"53": {
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface",
"value": "바탕",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/① 글꼴 (바탕)"
},
"54": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/② 크기 (9pt)"
},
"55": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"56": {
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface",
"value": "바탕",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/① 글꼴 (바탕)"
},
"57": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/② 크기 (9pt)"
},
"58": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"59": {
"chart_xpath": "//c:legend//a:ea/@typeface",
"value": "바탕",
"points": 1,
"category": "OneAnswer",
"item": "범례/① 글꼴 (바탕)"
},
"60": {
"chart_xpath": "//c:legend//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "범례/② 크기 (9pt)"
},
"61": {
"chart_xpath": "//c:legend//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "범례/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
}
}
}

View File

@@ -0,0 +1,841 @@
{
"0": {
"0": {
"path": "",
"path2": "",
"points": 0,
"category": "파일저장",
"item": "파일명 (수검번호.hwp/hwpx)"
},
"1": {
"path": "//PAGEMARGIN",
"value": {
"Top": 20,
"Bottom": 20,
"Left": 20,
"Right": 20,
"Header": 10,
"Footer": 10,
"Gutter": 0
},
"tolerance": 1,
"points": 4,
"category": "PageSetting",
"item": "A4용지, 왼쪽/오른쪽/위쪽/아래쪽 (각20mm), 머리말/꼬리말 (10mm), 제본(0mm)"
},
"2": {
"path": "",
"value": {
"FontName": "바탕",
"FontSize": "1000",
"Alignment": "Justify",
"LineSpacing": "160"
},
"points": 4,
"category": "BasicSetting",
"item": "글꼴 (바탕, 10pt), 양쪽정렬, 줄간격 (160%)"
},
"3": {
"path": "",
"value": null,
"points": 40,
"category": "오타감점",
"item": "오타 1개 -1점 / 2503회부터 오타 1개 -1점으로 변경"
}
},
"1": {
"1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"searchValue": "별사랑천문대캠프안내",
"value": "궁서체",
"points": 1,
"category": "OneAnswer",
"item": "문구 (별사랑천문대캠프안내)/① 글씨체 (궁서체)"
},
"2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"searchValue": "별사랑천문대캠프안내",
"value": "53,164,78",
"points": 2,
"category": "Color",
"item": "문구 (별사랑천문대캠프안내)/② 채우기 : 색상(RGB:53,164,78)"
},
"3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"searchValue": "별사랑천문대캠프안내",
"value": "120",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (별사랑천문대캠프안내)/③ 크기-너비 (120 mm)"
},
"4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"searchValue": "별사랑천문대캠프안내",
"value": "20",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (별사랑천문대캠프안내)/④ 크기-높이 (20 mm)"
},
"5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "별사랑천문대캠프안내",
"value": "true",
"points": 2,
"category": "OneAnswer",
"item": "문구 (별사랑천문대캠프안내)/⑤ 위치 (글자처럼 취급)"
},
"6": {
"path":"//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "별사랑천문대캠프안내",
"value": "Center",
"points": 2,
"category": "OneAnswer",
"item": "문구 (별사랑천문대캠프안내)/⑥ 정렬 (가운데 정렬)"
},
"7": {
"path": "//TEXTART[@Text='{searchValue}']",
"searchValue": "별사랑천문대캠프안내",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (별사랑천문대캠프안내)/⑦ 글맵시모양 (육안확인)"
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE",
"searchValue": "별",
"value": {
"Height": 2800,
"Width": 2800
},
"tolerance": 200,
"points": 1,
"category": "TwoLineSize",
"item": "별/① 모양 (2줄)"
},
"9": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "별",
"value": "굴림체",
"points": 1,
"category": "FontName",
"item": "별/② 글씨체 (굴림체)"
},
"10": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "별",
"value": "211,202,24",
"points": 2,
"category": "Color",
"item": "별/③ 면색 : 색상(RGB:211,202,24)"
},
"11": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right",
"searchValue": "별",
"value": "3.0",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "별/④ 본문과의 간격 : 3.0mm"
},
"12": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "천문우주과학 체험학습",
"value": "BOLD",
"points": 2,
"category": "FontAttribute",
"item": "문구 (천문우주과학 체험학습)/① 진하게"
},
"13": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "천문우주과학 체험학습",
"value": "UNDERLINE",
"points": 2,
"category": "FontAttribute",
"item": "문구 (천문우주과학 체험학습)/② 밑줄"
},
"14": {
"path": "//CHAR[contains(text(),'{char1}')]",
"path2": "//CHAR[contains(text(),'{char2}')]",
"path3": "//CHAR[contains(text(),'{char3}')]",
"char1": "●",
"char2": "●",
"char3": "※",
"value": 3,
"points": 3,
"category": "SpecialChar",
"item": "① ● , ② ● , ③ ※"
},
"15": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "참가안내",
"value": "굴림",
"points": 1,
"category": "FontName",
"item": "문구 (● 참가안내 ●)/① 글씨체 (굴림)"
},
"16": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "참가안내",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (● 참가안내 ●)/② 정렬 (가운데 정렬)"
},
"17": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "그룹별 20명(선착순 마감)",
"value": "ITALIC",
"points": 1,
"category": "FontAttribute",
"item": "문구 (그룹별 20명(선착순 마감))/① 기울임"
},
"18": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "그룹별 20명(선착순 마감)",
"value": "UNDERLINE",
"points": 1,
"category": "FontAttribute",
"item": "문구 (그룹별 20명(선착순 마감))/② 밑줄"
},
"19": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN",
"searchValue": "기타사항",
"value": {
"Left": 15,
"Indent": 14
},
"points": 2,
"category": "ParaShape",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (15pt), 내어쓰기 (14pt)",
"desc": "내부적으로 내어쓰기는 음수값 / JSON value값은 양수로 입력"
},
"20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"searchValue": "2025. 05. 24.",
"value": "1400",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2025. 05. 24.)/① 크기 (14pt)",
"desc": "1pt당 100"
},
"21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "2025. 05. 24.",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2025. 05. 24.)/② 정렬 (가운데 정렬)"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "별사랑천문대",
"value": "견고딕",
"points": 1,
"category": "FontName",
"item": "문구 (별사랑천문대)/① 글씨체 (견고딕)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "별사랑천문대",
"value": "2600",
"points": 1,
"category": "OneAnswer",
"item": "문구 (별사랑천문대)/② 크기 (26pt)"
},
"24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"searchValue": "별사랑천문대",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (별사랑천문대)/③ 정렬 (가운데 정렬)"
},
"25": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "DIAT",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "문구 (DIAT)/① 글꼴 (돋움)"
},
"26": {
"path": "//CHARSHAPE[@Id=//SECTION[1]//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "DIAT",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "문구 (DIAT)/② 크기 (9pt)"
},
"27": {
"path": "//PARASHAPE[@Id=//SECTION[1]//CHAR[text()='{searchValue}']/parent::TEXT/parent::P/@ParaShape]/@Align",
"searchValue": "DIAT",
"value": "Right",
"points": 1,
"category": "OneAnswer",
"item": "문구 (DIAT)/③ 정렬 (오른쪽 정렬)"
},
"28": {
"path": "//PAGENUM/@FormatType",
"value": "LatinCapital",
"points": 2,
"category": "PageNumber",
"item": "① 쪽 번호 매기기 (A,B,C 순으로)",
"desc1": {
"1,2,3":"Digit",
"①,②,③":"CircledDigit",
"가,나,다":"HangulSyllable",
"㉮,㉯,㉰":"CircledHangulSyllable",
"A,B,C":"LatinCapital",
"Ⓐ,Ⓑ,Ⓒ":"CircledLatinCapital",
"갑,을,병":"DecagonCircle",
"一,二,三":"Ideograph",
"㉠,㉡,㉢":"CircledHangulJamo",
"ⓐ,ⓑ,ⓒ":"CircledLatinSmall",
"i,ii,iii":"RomanSmall",
"정답에 맞는 값 value에 입력":""
},
"desc2": "1, 2페이지 모두 정답이어야 점수 부여"
},
"29": {
"path": "//PAGENUM/@Pos",
"value": "BottomCenter",
"points": 2,
"category": "PageNumber",
"item": "가운데 아래",
"desc": "1, 2페이지 모두 정답이어야 점수 부여",
"desc2": {
"가운데 아래": "BottomCenter",
"오른쪽 아래": "BottomRight"
}
},
"30": {
"path": "not(//PARASHAPE[@Id=//SECTION[1]/P/@ParaShape]/PARAMARGIN[@LineSpacing!='{option}'])",
"option": "180",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문제 1 줄간격 180% 설정",
"desc": "1페이지 문단의 줄간격이 정답이 아닌 문단이 있으면 False(감점)"
}
},
"2": {
"1": {
"path": "//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@HeaderInside",
"path2": "//BORDERFILL[@Id=//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@BorferFill]",
"value": {
"header_inside": true,
"all_double_slim": true
},
"points": 4,
"category": "PageBorder",
"item": "문제2 쪽테두리(이중 실선, 머리말 포함) 설정"
},
"2": {
"path": "count(//SECTION)>1",
"value": true,
"points": 3,
"category": "Boolean",
"item": "① 구역나누기",
"desc": "섹션이 1개 이상이면 점수부여"
},
"3": {
"path": "//COLDEF/@Count",
"value": "2",
"points": 3,
"category": "OneAnswer",
"item": "② 다단 2단"
},
"4": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"searchValue": "별자리",
"value": "60",
"points": 2,
"category": "mmSize",
"item": "문구 (별자리)/① 크기-너비 (60 mm)"
},
"5": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"searchValue": "별자리",
"value": "12",
"points": 2,
"category": "mmSize",
"item": "문구 (별자리)/② 크기-높이 (12mm)"
},
"6": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//LINESHAPE/@Style",
"path2": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//LINESHAPE/@Width",
"searchValue": "별자리",
"value": [ "DoubleSlim", "283" ],
"points": 2,
"category": "DoubleAnswer",
"item": "문구 (별자리)/③ 테두리 : 이중 실선(1.00mm)",
"desc": "1mm = 283pt"
},
"7": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/@Ratio",
"searchValue": "별자리",
"value": "20",
"points": 2,
"category": "OneAnswer",
"item": "문구 (별자리)/④ 글상자 모서리 (반원)",
"desc": "모서리 비율 50이면 반원 / 20이면 둥근모양"
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "별자리",
"value": "191,179,233",
"points": 2,
"category": "Color",
"item": "문구 (별자리)/⑤ 채우기 : 색상(RGB:191,179,233)"
},
"9": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "별자리",
"value": "true",
"points": 1,
"category": "OneAnswer",
"item": "문구 (별자리)/⑥ 글상자 위치 (글자처럼 취급)"
},
"10": {
"path": "//PARASHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::P[last()]/@ParaShape]/@Align",
"searchValue": "별자리",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (별자리)/⑦ 글상자 정렬 (가운데 정렬)"
},
"11": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "별자리",
"value": "중고딕",
"points": 1,
"category": "FontName",
"item": "문구 (별자리)/⑧ 글씨체 (중고딕)"
},
"12": {
"path": "//CHARSHAPE[@Id=//RECTANGLE//TEXT[./CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "별자리",
"value": "1600",
"points": 1,
"category": "OneAnswer",
"item": "문구 (별자리)/⑨ 글씨크기 (16pt)",
"desc":"1pt당 100"
},
"13": {
"path": "//PARASHAPE[@Id=//RECTANGLE//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "별자리",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (별자리)/⑩ 정렬 (가운데 정렬)"
},
"14": {
"path": "boolean(//PICTURE//SHAPECOMMENT[contains(text(),'{searchValue}')])",
"searchValue": "원본 그림의 이름: 그림",
"value": true,
"points": 2,
"category": "Boolean",
"item": "① 파일명 \"그림C.jpg\" 삽입"
},
"15": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/SIZE/@Width",
"value": "80",
"points": 2,
"category": "mmSize",
"item": "② 크기-너비 (80 mm)"
},
"16": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/SIZE/@Height",
"value": "40",
"points": 2,
"category": "mmSize",
"item": "③ 크기-높이 (40 mm)"
},
"17": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/POSITION/@HorzOffset",
"value": "0",
"points": 2,
"category": "mmSize",
"item": "④ 위치 (어울림 : 가로-쪽의 왼쪽 0.0mm)"
},
"18": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/POSITION/@VertOffset",
"value": "24",
"points": 2,
"category": "mmSize",
"item": "⑤ 위치 (어울림 : 세로-쪽의 위 24mm)"
},
"19": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "1. 별자리란",
"value": "돋움체",
"points": 1,
"category": "FontName",
"item": "문구① (1. 별자리란)/① 글씨체 (돋움체)"
},
"20": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "1. 별자리란",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구① (1. 별자리란)/② 크기 (12pt)"
},
"21": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "1. 별자리란",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구① (1. 별자리란)/③ 진하게"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "2. 우리나라 계절별 별자리",
"value": "돋움체",
"points": 1,
"category": "FontName",
"item": "문구② (2. 우리나라 계절별 별자리)/① 글씨체 (돋움체)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "2. 우리나라 계절별 별자리",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구② (2. 우리나라 계절별 별자리)/② 크기 (12pt)"
},
"24": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "2. 우리나라 계절별 별자리",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구② (2. 우리나라 계절별 별자리)/③ 진하게"
},
"25": {
"path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)",
"option": "북두칠성",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (북두칠성)/① 각주 설정 및 문구 입력"
},
"26": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "큰곰자리의 꼬리에 해당하는 7개의 별",
"value": "굴림",
"points": 1,
"category": "FontName",
"item": "문구 (북두칠성)/② 글씨체 (굴림)"
},
"27": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height",
"searchValue": "큰곰자리의 꼬리에 해당하는 7개의 별",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "문구 (북두칠성)/③ 크기 (9pt)"
},
"28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"searchValue": "큰곰자리의 꼬리에 해당하는 7개의 별",
"value": "CircledLatinCapital",
"points": 2,
"category": "OneAnswer",
"item": "문구 (북두칠성)/④ 각주 번호모양",
"desc": {
"1,2,3":"Digit",
"①,②,③":"CircledDigit",
"가,나,다":"HangulSyllable",
"㉮,㉯,㉰":"CircledHangulSyllable",
"A,B,C":"LatinCapital",
"Ⓐ,Ⓑ,Ⓒ":"CircledLatinCapital",
"갑,을,병":"DecagonCircle",
"一,二,三":"Ideograph",
"㉠,㉡,㉢":"CircledHangulJamo",
"ⓐ,ⓑ,ⓒ":"CircledLatinSmall",
"i,ii,iii":"RomanSmall",
"정답에 맞는 값 value에 입력":""
}
},
"29": {
"path": "boolean(//CHAR[contains(text(),'Babylonia')])",
"ignoreWord": "Babylonia",
"value": true,
"points": 3,
"category": "Boolean",
"item": "Babylonia/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": "유사도 검사를 진행하지 않고 영단어가 모두 일치해야 하므로 xpath구문 내 단어도 수정필요"
},
"30": {
"path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]",
"word":[
["성좌", "星座"],
["유래", "由來"],
["표석", "標石"],
["천구", "天球"],
["계절", "季節"]
],
"value": 10,
"points": 10,
"category": "Hanja",
"item": "① 성좌(星座), ② 유래(由來), ③ 표석(標石), ④ 천구(天球), ⑤ 계절(季節)"
},
"31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'역에해당')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…지역이 해당하는 티그리스강과…)/이 → 에 글자바꿈"
},
"32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'나는반드')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…둘 중 반드시 하나는…)/반드시 / 하나는 순서바꿈"
},
"33": {
"path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape",
"searchValue": "지역별 천문대 수",
"value": "돋움체",
"points": 1,
"category": "FontName",
"item": "제목 문구 (지역별 천문대 수)/① 글씨체 (돋움체)"
},
"34": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "지역별 천문대 수",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (지역별 천문대 수)/② 크기 (12pt)"
},
"35": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "지역별 천문대 수",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "제목 문구 (지역별 천문대 수)/③ 진하게"
},
"36": {
"path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "지역별 천문대 수",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (지역별 천문대 수)/④ 정렬 (가운데 정렬)"
},
"37": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"value": "255,164,95",
"points": 2,
"category": "Color",
"item": "위쪽 제목 셀/① 색상(RGB:255,164,95)"
},
"38": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "위쪽 제목 셀/② 진하게",
"desc": "글자 속성이라 CELLZONE으로 적용 되지 않음"
},
"39": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Type",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Type",
"value": "DoubleSlim",
"points": 2,
"category": "TableAnswer",
"item": "제목 셀 아래선/① 이중실선"
},
"40": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Width",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Width",
"value": "0.5mm",
"points": 2,
"category": "TableAnswer",
"item": "제목 셀 아래선/② 0.5mm"
},
"41": {
"path": "//TABLE//TEXT/@CharShape",
"path2": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"value": "궁서",
"points": 1,
"category": "TableFontName",
"category_tmp": "FontName",
"item": "글자모양/① 글씨체 (궁서)",
"desc": "테이블 폰트명 문항은 테이블의 모든 셀이 정답폰트와 일치해야 함, 하나만 일치해도 정답으로 채점할 경우 category값을 FontName으로 변경"
},
"42": {
"path": "//CHARSHAPE[@Id=//TABLE//TEXT/@CharShape]/@Height",
"value": "1000",
"points": 1,
"category": "TableAnswer",
"item": "글자모양/② 크기 (10pt)"
},
"43": {
"path": "//PARASHAPE[@Id=//TABLE/ROW//P/@ParaShape]/@Align",
"value": "Center",
"points": 1,
"category": "TableAnswer",
"item": "글자모양/③ 정렬 (가운데 정렬)"
},
"44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) and boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "SUM",
"value": true,
"points": 4,
"category": "Boolean",
"item": "블록 계산식/합계",
"desc": "option값에 합계는 SUM / 평균은 AVG"
},
"45": {
"chart_xpath": "",
"chart_type": "묶은가로막대형",
"value": true,
"points": 2,
"category": "ChartType",
"item": "① 종류 (묶은가로막대형)",
"desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)"
},
"46": {
"chart_xpath": "//c:valAx/c:majorTickMark/@val",
"value": "out",
"points": 2,
"category": "OneAnswer",
"item": "② 값 축 주 눈금선",
"desc": "chart xml파일에서 답안을 가져오는 문항은 path키값 대신 chart_xpath키값을 이용해 xapth구문을 작성한다"
},
"47": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Width",
"value": "80",
"points": 2,
"category": "mmSize",
"item": "③ 크기-너비 (80 mm)"
},
"48": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Height",
"value": "90",
"points": 2,
"category": "mmSize",
"item": "④ 크기-높이 (90 mm)"
},
"49": {
"chart_xpath": "boolean(//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계' or text()='평균']))",
"value": true,
"points": 2,
"category": "Boolean",
"item": "⑤ 차트 데이터(표에서 블록계산식을 제외한 나머지 값만 이용)",
"desc": "차트가 존재하고 블록계산식(합계, 평균) 데이터가 없는 경우 정답 처리"
},
"50": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"searchValue": "지역별 천문대 수",
"value": "맑은 고딕",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (지역별 천문대 수)/① 글씨체 (맑은 고딕)"
},
"51": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"searchValue": "지역별 천문대 수",
"value": "1400",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (지역별 천문대 수)/② 크기 (14pt)"
},
"52": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}",
"option": "b",
"searchValue": "지역별 천문대 수",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (지역별 천문대 수)/③ 진하게",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"53": {
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface",
"value": "바탕",
"points": 1,
"category": "OneAnswer",
"item": "X축/① 글꼴 (바탕)"
},
"54": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "X축/② 크기 (9pt)"
},
"55": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "X축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"56": {
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface",
"value": "바탕",
"points": 1,
"category": "OneAnswer",
"item": "Y축/① 글꼴 (바탕)"
},
"57": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "Y축/② 크기 (9pt)"
},
"58": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "Y축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"59": {
"chart_xpath": "//c:legend//a:ea/@typeface",
"value": "바탕",
"points": 1,
"category": "OneAnswer",
"item": "범례/① 글꼴 (바탕)"
},
"60": {
"chart_xpath": "//c:legend//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "범례/② 크기 (9pt)"
},
"61": {
"chart_xpath": "//c:legend//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "범례/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
}
}
}

View File

@@ -0,0 +1,841 @@
{
"0": {
"0": {
"path": "",
"path2": "",
"points": 0,
"category": "파일저장",
"item": "파일명 (수검번호.hwp/hwpx)"
},
"1": {
"path": "//PAGEMARGIN",
"value": {
"Top": 20,
"Bottom": 20,
"Left": 20,
"Right": 20,
"Header": 10,
"Footer": 10,
"Gutter": 0
},
"tolerance": 1,
"points": 4,
"category": "PageSetting",
"item": "A4용지, 왼쪽/오른쪽/위쪽/아래쪽 (각20mm), 머리말/꼬리말 (10mm), 제본(0mm)"
},
"2": {
"path": "",
"value": {
"FontName": "바탕",
"FontSize": "1000",
"Alignment": "Justify",
"LineSpacing": "160"
},
"points": 4,
"category": "BasicSetting",
"item": "글꼴 (바탕, 10pt), 양쪽정렬, 줄간격 (160%)"
},
"3": {
"path": "",
"value": null,
"points": 40,
"category": "오타감점",
"item": "오타 1개 -1점 / 2503회부터 오타 1개 -1점으로 변경"
}
},
"1": {
"1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"searchValue": "여름방학특집해양스포츠체험교실",
"value": "궁서체",
"points": 1,
"category": "OneAnswer",
"item": "문구 (여름방학특집해양스포츠체험교실)/① 글씨체 (궁서체)"
},
"2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"searchValue": "여름방학특집해양스포츠체험교실",
"value": "49,95,151",
"points": 2,
"category": "Color",
"item": "문구 (여름방학특집해양스포츠체험교실)/② 채우기 : 색상(RGB:49,95,151)"
},
"3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"searchValue": "여름방학특집해양스포츠체험교실",
"value": "120",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (여름방학특집해양스포츠체험교실)/③ 크기-너비 (120 mm)"
},
"4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"searchValue": "여름방학특집해양스포츠체험교실",
"value": "20",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (여름방학특집해양스포츠체험교실)/④ 크기-높이 (20 mm)"
},
"5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "여름방학특집해양스포츠체험교실",
"value": "true",
"points": 2,
"category": "OneAnswer",
"item": "문구 (여름방학특집해양스포츠체험교실)/⑤ 위치 (글자처럼 취급)"
},
"6": {
"path":"//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "여름방학특집해양스포츠체험교실",
"value": "Center",
"points": 2,
"category": "OneAnswer",
"item": "문구 (여름방학특집해양스포츠체험교실)/⑥ 정렬 (가운데 정렬)"
},
"7": {
"path": "//TEXTART[@Text='{searchValue}']",
"searchValue": "여름방학특집해양스포츠체험교실",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (여름방학특집해양스포츠체험교실)/⑦ 글맵시모양 (육안확인)"
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE",
"searchValue": "여",
"value": {
"Height": 2800,
"Width": 2800
},
"tolerance": 200,
"points": 1,
"category": "TwoLineSize",
"item": "여/① 모양 (2줄)"
},
"9": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "여",
"value": "굴림체",
"points": 1,
"category": "FontName",
"item": "여/② 글씨체 (굴림체)"
},
"10": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "여",
"value": "144,231,51",
"points": 2,
"category": "Color",
"item": "여/③ 면색 : 색상(RGB:144,231,51)"
},
"11": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right",
"searchValue": "여",
"value": "3.0",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "여/④ 본문과의 간격 : 3.0mm"
},
"12": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "시원한 바다와 함께하는 해양 스포츠 체험 교실",
"value": "BOLD",
"points": 2,
"category": "FontAttribute",
"item": "문구 (시원한 바다와 함께하는 해양 스포츠 체험 교실)/① 진하게"
},
"13": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "시원한 바다와 함께하는 해양 스포츠 체험 교실",
"value": "UNDERLINE",
"points": 2,
"category": "FontAttribute",
"item": "문구 (시원한 바다와 함께하는 해양 스포츠 체험 교실)/② 밑줄"
},
"14": {
"path": "//CHAR[contains(text(),'{char1}')]",
"path2": "//CHAR[contains(text(),'{char2}')]",
"path3": "//CHAR[contains(text(),'{char3}')]",
"char1": "◐",
"char2": "◑",
"char3": "※",
"value": 3,
"points": 3,
"category": "SpecialChar",
"item": "① ◐ , ② ◑ , ③ ※"
},
"15": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "참가안내",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "문구 (◐ 참가안내 ◑)/① 글씨체 (돋움)"
},
"16": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "참가안내",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (◐ 참가안내 ◑)/② 정렬 (가운데 정렬)"
},
"17": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "해양소년단 연맹 홈페이지(http://www.ihd.or.kr)",
"value": "ITALIC",
"points": 1,
"category": "FontAttribute",
"item": "문구 (해양소년단 연맹 홈페이지(http://www.ihd.or.kr))/① 기울임"
},
"18": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "해양소년단 연맹 홈페이지(http://www.ihd.or.kr)",
"value": "UNDERLINE",
"points": 1,
"category": "FontAttribute",
"item": "문구 (해양소년단 연맹 홈페이지(http://www.ihd.or.kr))/② 밑줄"
},
"19": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN",
"searchValue": "기타사항",
"value": {
"Left": 10,
"Indent": 12
},
"points": 2,
"category": "ParaShape",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (10pt), 내어쓰기 (12pt)",
"desc": "내부적으로 내어쓰기는 음수값 / JSON value값은 양수로 입력"
},
"20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"searchValue": "2025. 05. 24.",
"value": "1400",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2025. 05. 24.)/① 크기 (14pt)",
"desc": "1pt당 100"
},
"21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "2025. 05. 24.",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2025. 05. 24.)/② 정렬 (가운데 정렬)"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "해양스포츠홍보위원회",
"value": "견고딕",
"points": 1,
"category": "FontName",
"item": "문구 (해양스포츠홍보위원회)/① 글씨체 (견고딕)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "해양스포츠홍보위원회",
"value": "2600",
"points": 1,
"category": "OneAnswer",
"item": "문구 (해양스포츠홍보위원회)/② 크기 (26pt)"
},
"24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"searchValue": "해양스포츠홍보위원회",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (해양스포츠홍보위원회)/③ 정렬 (가운데 정렬)"
},
"25": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "DIAT",
"value": "굴림",
"points": 1,
"category": "FontName",
"item": "문구 (DIAT)/① 글꼴 (굴림)"
},
"26": {
"path": "//CHARSHAPE[@Id=//SECTION[1]//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "DIAT",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "문구 (DIAT)/② 크기 (9pt)"
},
"27": {
"path": "//PARASHAPE[@Id=//SECTION[1]//CHAR[text()='{searchValue}']/parent::TEXT/parent::P/@ParaShape]/@Align",
"searchValue": "DIAT",
"value": "Right",
"points": 1,
"category": "OneAnswer",
"item": "문구 (DIAT)/③ 정렬 (오른쪽 정렬)"
},
"28": {
"path": "//PAGENUM/@FormatType",
"value": "CircledDigit",
"points": 2,
"category": "PageNumber",
"item": "① 쪽 번호 매기기 (A,B,C 순으로)",
"desc1": {
"1,2,3":"Digit",
"①,②,③":"CircledDigit",
"가,나,다":"HangulSyllable",
"㉮,㉯,㉰":"CircledHangulSyllable",
"A,B,C":"LatinCapital",
"Ⓐ,Ⓑ,Ⓒ":"CircledLatinCapital",
"갑,을,병":"DecagonCircle",
"一,二,三":"Ideograph",
"㉠,㉡,㉢":"CircledHangulJamo",
"ⓐ,ⓑ,ⓒ":"CircledLatinSmall",
"i,ii,iii":"RomanSmall",
"정답에 맞는 값 value에 입력":""
},
"desc2": "1, 2페이지 모두 정답이어야 점수 부여"
},
"29": {
"path": "//PAGENUM/@Pos",
"value": "BottomRight",
"points": 2,
"category": "PageNumber",
"item": "가운데 아래",
"desc": "1, 2페이지 모두 정답이어야 점수 부여",
"desc2": {
"가운데 아래": "BottomCenter",
"오른쪽 아래": "BottomRight"
}
},
"30": {
"path": "not(//PARASHAPE[@Id=//SECTION[1]/P/@ParaShape]/PARAMARGIN[@LineSpacing!='{option}'])",
"option": "180",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문제 1 줄간격 180% 설정",
"desc": "1페이지 문단의 줄간격이 정답이 아닌 문단이 있으면 False(감점)"
}
},
"2": {
"1": {
"path": "//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@HeaderInside",
"path2": "//BORDERFILL[@Id=//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@BorferFill]",
"value": {
"header_inside": true,
"all_double_slim": true
},
"points": 4,
"category": "PageBorder",
"item": "문제2 쪽테두리(이중 실선, 머리말 포함) 설정"
},
"2": {
"path": "count(//SECTION)>1",
"value": true,
"points": 3,
"category": "Boolean",
"item": "① 구역나누기",
"desc": "섹션이 1개 이상이면 점수부여"
},
"3": {
"path": "//COLDEF/@Count",
"value": "2",
"points": 3,
"category": "OneAnswer",
"item": "② 다단 2단"
},
"4": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"searchValue": "해양 스포츠의 세계",
"value": "60",
"points": 2,
"category": "mmSize",
"item": "문구 (해양 스포츠의 세계)/① 크기-너비 (60 mm)"
},
"5": {
"path": "//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"searchValue": "해양 스포츠의 세계",
"value": "12",
"points": 2,
"category": "mmSize",
"item": "문구 (해양 스포츠의 세계)/② 크기-높이 (12mm)"
},
"6": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//LINESHAPE/@Style",
"path2": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//LINESHAPE/@Width",
"searchValue": "해양 스포츠의 세계",
"value": [ "DoubleSlim", "283" ],
"points": 2,
"category": "DoubleAnswer",
"item": "문구 (해양 스포츠의 세계)/③ 테두리 : 이중 실선(1.00mm)",
"desc": "1mm = 283pt"
},
"7": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/@Ratio",
"searchValue": "해양 스포츠의 세계",
"value": "20",
"points": 2,
"category": "OneAnswer",
"item": "문구 (해양 스포츠의 세계)/④ 글상자 모서리 (반원)",
"desc": "모서리 비율 50이면 반원 / 20이면 둥근모양"
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "해양 스포츠의 세계",
"value": "248,231,130",
"points": 2,
"category": "Color",
"item": "문구 (해양 스포츠의 세계)/⑤ 채우기 : 색상(RGB:248,231,130)"
},
"9": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "해양 스포츠의 세계",
"value": "true",
"points": 1,
"category": "OneAnswer",
"item": "문구 (해양 스포츠의 세계)/⑥ 글상자 위치 (글자처럼 취급)"
},
"10": {
"path": "//PARASHAPE[@Id=//RECTANGLE//CHAR[text()='{searchValue}']/ancestor::P[last()]/@ParaShape]/@Align",
"searchValue": "해양 스포츠의 세계",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (해양 스포츠의 세계)/⑦ 글상자 정렬 (가운데 정렬)"
},
"11": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "해양 스포츠의 세계",
"value": "궁서",
"points": 1,
"category": "FontName",
"item": "문구 (해양 스포츠의 세계)/⑧ 글씨체 (궁서)"
},
"12": {
"path": "//CHARSHAPE[@Id=//RECTANGLE//TEXT[./CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "해양 스포츠의 세계",
"value": "1800",
"points": 1,
"category": "OneAnswer",
"item": "문구 (해양 스포츠의 세계)/⑨ 글씨크기 (18pt)",
"desc":"1pt당 100"
},
"13": {
"path": "//PARASHAPE[@Id=//RECTANGLE//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "해양 스포츠의 세계",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (해양 스포츠의 세계)/⑩ 정렬 (가운데 정렬)"
},
"14": {
"path": "boolean(//PICTURE//SHAPECOMMENT[contains(text(),'{searchValue}')])",
"searchValue": "원본 그림의 이름: 그림",
"value": true,
"points": 2,
"category": "Boolean",
"item": "① 파일명 \"그림D.jpg\" 삽입"
},
"15": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/SIZE/@Width",
"value": "80",
"points": 2,
"category": "mmSize",
"item": "② 크기-너비 (80 mm)"
},
"16": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/SIZE/@Height",
"value": "40",
"points": 2,
"category": "mmSize",
"item": "③ 크기-높이 (40 mm)"
},
"17": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/POSITION/@HorzOffset",
"value": "0",
"points": 2,
"category": "mmSize",
"item": "④ 위치 (어울림 : 가로-쪽의 왼쪽 0.0mm)"
},
"18": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/POSITION/@VertOffset",
"value": "24",
"points": 2,
"category": "mmSize",
"item": "⑤ 위치 (어울림 : 세로-쪽의 위 24mm)"
},
"19": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "1. 국립해양박물관",
"value": "돋움체",
"points": 1,
"category": "FontName",
"item": "문구① (1. 국립해양박물관)/① 글씨체 (돋움체)"
},
"20": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "1. 국립해양박물관",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구① (1. 국립해양박물관)/② 크기 (12pt)"
},
"21": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "1. 국립해양박물관",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구① (1. 국립해양박물관)/③ 진하게"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "2. 윈드 서핑",
"value": "돋움체",
"points": 1,
"category": "FontName",
"item": "문구② (2. 윈드 서핑)/① 글씨체 (돋움체)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "2. 윈드 서핑",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구② (2. 윈드 서핑)/② 크기 (12pt)"
},
"24": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "2. 윈드 서핑",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구② (2. 윈드 서핑)/③ 진하게"
},
"25": {
"path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)",
"option": "마스트",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (마스트)/① 각주 설정 및 문구 입력"
},
"26": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "선체의 갑판 위에 세워진 기둥",
"value": "바탕체",
"points": 1,
"category": "FontName",
"item": "문구 (마스트)/② 글씨체 (바탕체)"
},
"27": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height",
"searchValue": "선체의 갑판 위에 세워진 기둥",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "문구 (마스트)/③ 크기 (9pt)"
},
"28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"searchValue": "선체의 갑판 위에 세워진 기둥",
"value": "CircledDigit",
"points": 2,
"category": "OneAnswer",
"item": "문구 (마스트)/④ 각주 번호모양",
"desc": {
"1,2,3":"Digit",
"①,②,③":"CircledDigit",
"가,나,다":"HangulSyllable",
"㉮,㉯,㉰":"CircledHangulSyllable",
"A,B,C":"LatinCapital",
"Ⓐ,Ⓑ,Ⓒ":"CircledLatinCapital",
"갑,을,병":"DecagonCircle",
"一,二,三":"Ideograph",
"㉠,㉡,㉢":"CircledHangulJamo",
"ⓐ,ⓑ,ⓒ":"CircledLatinSmall",
"i,ii,iii":"RomanSmall",
"정답에 맞는 값 value에 입력":""
}
},
"29": {
"path": "boolean(//CHAR[contains(text(),'Display')])",
"ignoreWord": "Display",
"value": true,
"points": 3,
"category": "Boolean",
"item": "Display/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": "유사도 검사를 진행하지 않고 영단어가 모두 일치해야 하므로 xpath구문 내 단어도 수정필요"
},
"30": {
"path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]",
"word":[
["유물", "遺物"],
["상설", "常設"],
["체험", "體驗"],
["해양", "海洋"],
["기교", "技巧"]
],
"value": 10,
"points": 10,
"category": "Hanja",
"item": "① 유물(遺物), ② 상설(常設), ③ 체험(體驗), ④ 해양(海洋), ⑤ 기교(技巧)"
},
"31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'을헤치는')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…물살을 헤치은…)/ 은 → 는 글자바꿈"
},
"32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'연의바람')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…바람을 자연의 이용하여…)/바람을 / 자연의 순서바꿈"
},
"33": {
"path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape",
"searchValue": "종목별 해양 스포츠 참가자 수",
"value": "중고딕",
"points": 1,
"category": "FontName",
"item": "제목 문구 (종목별 해양 스포츠 참가자 수)/① 글씨체 (중고딕)"
},
"34": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "종목별 해양 스포츠 참가자 수",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (종목별 해양 스포츠 참가자 수)/② 크기 (12pt)"
},
"35": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "종목별 해양 스포츠 참가자 수",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "제목 문구 (종목별 해양 스포츠 참가자 수)/③ 진하게"
},
"36": {
"path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "종목별 해양 스포츠 참가자 수",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (종목별 해양 스포츠 참가자 수)/④ 정렬 (가운데 정렬)"
},
"37": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"value": "233,162,149",
"points": 2,
"category": "Color",
"item": "위쪽 제목 셀/① 색상(RGB:233,162,149)"
},
"38": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "위쪽 제목 셀/② 진하게",
"desc": "글자 속성이라 CELLZONE으로 적용 되지 않음"
},
"39": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Type",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Type",
"value": "DoubleSlim",
"points": 2,
"category": "TableAnswer",
"item": "제목 셀 아래선/① 이중실선"
},
"40": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Width",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Width",
"value": "0.5mm",
"points": 2,
"category": "TableAnswer",
"item": "제목 셀 아래선/② 0.5mm"
},
"41": {
"path": "//TABLE//TEXT/@CharShape",
"path2": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"value": "굴림체",
"points": 1,
"category": "TableFontName",
"category_tmp": "FontName",
"item": "글자모양/① 글씨체 (굴림체)",
"desc": "테이블 폰트명 문항은 테이블의 모든 셀이 정답폰트와 일치해야 함, 하나만 일치해도 정답으로 채점할 경우 category값을 FontName으로 변경"
},
"42": {
"path": "//CHARSHAPE[@Id=//TABLE//TEXT/@CharShape]/@Height",
"value": "1000",
"points": 1,
"category": "TableAnswer",
"item": "글자모양/② 크기 (10pt)"
},
"43": {
"path": "//PARASHAPE[@Id=//TABLE/ROW//P/@ParaShape]/@Align",
"value": "Center",
"points": 1,
"category": "TableAnswer",
"item": "글자모양/③ 정렬 (가운데 정렬)"
},
"44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) and boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "SUM",
"value": true,
"points": 4,
"category": "Boolean",
"item": "블록 계산식/합계",
"desc": "option값에 합계는 SUM / 평균은 AVG"
},
"45": {
"chart_xpath": "",
"chart_type": "묶은세로막대형",
"value": true,
"points": 2,
"category": "ChartType",
"item": "① 종류 (묶은세로막대형)",
"desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)"
},
"46": {
"chart_xpath": "//c:valAx/c:majorTickMark/@val",
"value": "out",
"points": 2,
"category": "OneAnswer",
"item": "② 값 축 주 눈금선",
"desc": "chart xml파일에서 답안을 가져오는 문항은 path키값 대신 chart_xpath키값을 이용해 xapth구문을 작성한다"
},
"47": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Width",
"value": "80",
"points": 2,
"category": "mmSize",
"item": "③ 크기-너비 (80 mm)"
},
"48": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Height",
"value": "90",
"points": 2,
"category": "mmSize",
"item": "④ 크기-높이 (90 mm)"
},
"49": {
"chart_xpath": "boolean(//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계' or text()='평균']))",
"value": true,
"points": 2,
"category": "Boolean",
"item": "⑤ 차트 데이터(표에서 블록계산식을 제외한 나머지 값만 이용)",
"desc": "차트가 존재하고 블록계산식(합계, 평균) 데이터가 없는 경우 정답 처리"
},
"50": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"searchValue": "종목별 해양 스포츠 참가자 수",
"value": "궁서체",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (종목별 해양 스포츠 참가자 수)/① 글씨체 (궁서체)"
},
"51": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"searchValue": "종목별 해양 스포츠 참가자 수",
"value": "1300",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (종목별 해양 스포츠 참가자 수)/② 크기 (13pt)"
},
"52": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}",
"option": "b",
"searchValue": "종목별 해양 스포츠 참가자 수",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (종목별 해양 스포츠 참가자 수)/③ 진하게",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"53": {
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface",
"value": "맑은 고딕",
"points": 1,
"category": "OneAnswer",
"item": "X축/① 글꼴 (맑은 고딕)"
},
"54": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "X축/② 크기 (9pt)"
},
"55": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "X축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"56": {
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface",
"value": "맑은 고딕",
"points": 1,
"category": "OneAnswer",
"item": "Y축/① 글꼴 (맑은 고딕)"
},
"57": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "Y축/② 크기 (9pt)"
},
"58": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "Y축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"59": {
"chart_xpath": "//c:legend//a:ea/@typeface",
"value": "맑은고딕",
"points": 1,
"category": "OneAnswer",
"item": "범례/① 글꼴 (맑은고딕)"
},
"60": {
"chart_xpath": "//c:legend//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "범례/② 크기 (9pt)"
},
"61": {
"chart_xpath": "//c:legend//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "범례/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
}
}
}