Пример #1
0
    def remodel_equation(self, metainfo_option_num=2, metalineinfo=None):
        mod_dict = {1: "중첩 PRNTDATA 변환"}
        if metalineinfo == None:
            print("불완전한 수식을 교정해주는 유틸리티입니다.")
            erb_files, encode_type = CustomInput("ERB").get_filelist()
            file_count_check = StatusNum(erb_files, "파일")
            file_count_check.how_much_there()
            mod_no = MenuPreset().select_mod(mod_dict)

            for filename in erb_files:
                erb_bulk = ERBLoad(filename, encode_type).make_erblines()
                lines = (ERBUtil().make_metainfo_lines(erb_bulk,
                                                       metainfo_option_num,
                                                       filename).linelist)
                lines.insert(0, [0, 0, 0, ";{}에서 불러옴\n".format(filename)])
                temp_metainfo = ERBMetaInfo()
                temp_metainfo.linelist = lines
                self.result_infodict.add_dict(
                    filename,
                    ERBUtil().grammar_corrector(temp_metainfo, mod_no))
                file_count_check.how_much_done()

            result_dataset = self.result_infodict  # InfoDict 클래스 {파일명:ERBMetaInfo 클래스 메소드}
        else:
            mod_no = MenuPreset().select_mod(mod_dict, 0b1)
            result_dataset = ERBUtil().grammar_corrector(
                metalineinfo, mod_no)  # ERBMetaInfo 클래스 메소드
        CommonSent.extract_finished()
        self.func_log.sucessful_done()
        return result_dataset
Пример #2
0
    def extract_printfunc(self, erb_files=None, encode_type=None, opt=0):
        """ERB 파일 내 출력문 데이터를 추출하는 함수
        
        opt bit 1 : 차트 내 중복 context 제거, 2: 파일당 차트 할당, 3: 공백 출력안함
        """
        print("PRINT/DATAFORM 구문의 추출을 시작합니다.")
        if not erb_files or not encode_type:
            erb_files, encode_type = CustomInput("ERB").get_filelist()
        file_count_check = StatusNum(erb_files, "파일")
        file_count_check.how_much_there()
        result_sheet = SheetInfo()
        sheet_tags = ["COM_type", "context"]
        if not opt & 0b10:  # 파일당 차트 할당 아님
            sheet_tags.insert(0, "file")
            sheetname = "print_sent"
            result_sheet.add_sheet(sheetname, sheet_tags)
        if opt & 0b1:  # 중복 후처리
            dup_list = list()

        for filename in erb_files:
            bulk_lines = ERBLoad(filename, encode_type)
            if opt & 0b10:  # 파일당 차트 할당
                sheetname = filename
                result_sheet.add_sheet(sheetname, sheet_tags)

            if opt & 0b1000:  # 주석처리 모드
                printfunc_list = [
                    line for line in bulk_lines.make_erblines()
                    if line.find(";")
                ]
            else:
                printfunc_list = bulk_lines.search_line(
                    "PRINT",
                    "DATA",
                    except_args=["PRINTDATA", "DATALIST"],
                    opt=0b1)

            for line in printfunc_list:
                comtype = line.split()[0]
                context = " ".join(line.split()[1:])
                if opt & 0b1:  # 중복 후처리
                    if dup_list.count(context):
                        continue
                    else:
                        dup_list.append(context)
                if opt & 0b100:  # 공백 처리안함
                    if not context:
                        continue

                result_sheet.add_row(sheetname,
                                     file=filename,
                                     COM_type=comtype,
                                     context=context)
            file_count_check.how_much_done()

        CommonSent.extract_finished()
        self.func_log.sucessful_done()
        if opt & 0b1 and dup_list:
            print("중복으로 발견되어 누락 처리한 문장이 한 개 이상 존재합니다. 이후 처리에 유의해주세요.")
        return result_sheet  # SheetInfo
Пример #3
0
    def remodel_indent(self, metainfo_option_num=0, metalineinfo=None):
        if metalineinfo == None:
            print("들여쓰기를 자동 교정하는 유틸리티입니다.")
            erb_files, encode_type = CustomInput("ERB").get_filelist()
            file_count_check = StatusNum(erb_files, "파일")
            file_count_check.how_much_there()

            for filename in erb_files:
                erb_bulk = ERBLoad(filename, encode_type).make_erblines()
                lines = (ERBUtil().make_metainfo_lines(erb_bulk,
                                                       metainfo_option_num,
                                                       filename).linelist)
                lines.insert(0, [0, 0, 0, ";{}에서 불러옴\n".format(filename)])
                temp_metainfo = ERBMetaInfo()
                temp_metainfo.linelist = lines
                self.result_infodict.add_dict(
                    filename,
                    ERBUtil().indent_maker(temp_metainfo))
                file_count_check.how_much_done()

            result_dataset = self.result_infodict  # InfoDict 클래스 {파일명:[들여쓰기 처리된 lines]}
        else:
            if isinstance(metalineinfo, list):  # metaline 없는 순수 lines 일 때
                metalineinfo = ERBUtil().make_metainfo_lines(
                    metalineinfo, metainfo_option_num)
            result_dataset = ERBUtil().indent_maker(
                metalineinfo)  # [들여쓰기 처리된 lines]
        CommonSent.extract_finished()
        self.func_log.sucessful_done()
        return result_dataset
Пример #4
0
 def first_log(self, file_info=None):
     """작업 시작 절차를 logfile에 기록함. 입력받은 인자가 없으면 시작 시간만을 입력함."""
     with self.addwrite() as log_open:
         if file_info == None:
             log_open.write("[{}] Util Started\n".format(
                 CommonSent.put_time()))
         else:
             log_open.write("[{}] {} Loaded\n".format(
                 CommonSent.put_time(), file_info))
Пример #5
0
    def search_csv_var(self, erb_files=None, encode_type=None, opt=0):
        """ERB 파일 내 사용된 csv 변수 목록 출력
        
        opt bit 1: 참이면 CSV별 차트, 아니면 ERB별 차트
        """
        print("ERB 파일에서 사용된 CSV 변수목록을 추출합니다.")
        if not erb_files or not encode_type:
            erb_files, encode_type = CustomInput("ERB").get_filelist()
        csvvar_list = ERBUtil().csv_infodict_maker()
        if csvvar_list == None:
            try:
                csvvar_list = CSVFunc().single_csv_read("CSVfnclist.csv",
                                                        opt=2)
            except:
                print("설정 정보가 없어 실행이 불가합니다.")
                return None
        vfinder = ERBVFinder(csvvar_list)
        file_count_check = StatusNum(erb_files, "파일")
        file_count_check.how_much_there()
        result_sheet = SheetInfo()
        sheet_tags = ["file", "var_name", "orig_word"]

        for filename in erb_files:
            erb_bulk = ERBLoad(filename, encode_type).make_erblines()
            self.func_log.write_loaded_log(filename)
            if not opt & 0b1:  # ERB별 차트
                result_sheet.add_sheet(filename, sheet_tags)
                sheet_name = filename

            file_results = []
            for line in erb_bulk:
                vars_list = vfinder.find_csvfnc_line(line)
                if vars_list:
                    file_results.extend(vars_list)
            dup_res_list = DataFilter().dup_filter(file_results)

            for var_info in dup_res_list:
                varhead, varname, _, _ = var_info
                context = vfinder.print_csvfnc([
                    var_info,
                ])[0]
                if opt & 0b1:
                    sheet_name = varhead
                    if sheet_name not in result_sheet.sheetdict.keys():
                        result_sheet.add_sheet(sheet_name, sheet_tags)
                    f_name = filename
                else:
                    f_name = varhead
                result_sheet.add_row(sheet_name,
                                     file=f_name,
                                     var_name=varname,
                                     orig_word=context)
            file_count_check.how_much_done()

        CommonSent.extract_finished()
        self.func_log.sucessful_done()
        return result_sheet  # SheetInfo
Пример #6
0
 def run_paged_menu(self):
     while True:
         selected_num = self.__print_paged_menu()
         try:
             selected_num = int(selected_num)
             if self.menu_dict.get(selected_num):
                 self.selected_menu = self.menu_dict[selected_num]
                 return selected_num
             else:
                 CommonSent.not_ok()
         except ValueError:
             CommonSent.not_ok()
Пример #7
0
    def make_csv_var_dict(self, csv_files=None, encode_type=None):
        """{csv변수명:[파일명,번호]} 형태 딕셔너리 제작"""
        print("csv 변수 대응 딕셔너리를 제작합니다.")
        if not csv_files or not encode_type:
            csv_files, encode_type = CustomInput("CSV").get_filelist()

        count_check = StatusNum(csv_files, "파일", self.debug_log.NameDir)
        count_check.how_much_there()
        csvvar_dict = {}
        all_var_list = []
        dup_count = 0

        for csvname in csv_files:
            csvdata_dict = self.single_csv_read(csvname, encode_type,
                                                1)  # {변수명:숫자}
            if csvdata_dict == None:
                count_check.error_num += 1
                continue

            for var in csvdata_dict.keys():
                if var == "":
                    continue
                core_var = var
                var = var.split(";")[0]
                nospace_var = var.replace(" ", "__")
                all_var_list.append(var)
                try:
                    if csvvar_dict.get(nospace_var):
                        dup_count = all_var_list.count(var) - 1
                        csvvar_dict["dup{}_{}".format(
                            dup_count, nospace_var)] = [
                                csvname,
                                int(csvdata_dict[core_var]),
                            ]
                    else:
                        csvvar_dict[nospace_var] = [
                            csvname, int(csvdata_dict[core_var])
                        ]
                except ValueError:
                    continue
            count_check.how_much_done()

        total_dup = len(all_var_list) - len(set(all_var_list))
        if dup_count != 0:
            print("{}건의 중복변수가 존재합니다. 추후 유의해주세요.".format(total_dup))
        if count_check.error_num > 0:
            self.debug_log.if_decode_error()

        CommonSent.extract_finished()
        CommonSent.print_line()
        self.debug_log.sucessful_done()
        return csvvar_dict
Пример #8
0
    def __no_void_str(self, opt):
        if opt & 0b010:
            text = "명칭"
        elif opt & 0b100:
            text = "타입"
        else:
            return False
        while True:
            inputed = input("%s의 %s을 입력해주세요. : " % (text, self.target))
            if len(inputed) == 0:
                CommonSent.no_void()
                continue
            break

        return inputed
Пример #9
0
    def memory_optimizer(self, erb_files=None, encode_type=None):
        print("현재 기능이 완성되지 않았습니다. 되도록 백업 후 이용해주시고, 구상 파일에만 사용해주세요.")
        if not erb_files or not encode_type:
            erb_files, encode_type = CustomInput("ERB").get_filelist()
        file_count_check = StatusNum(erb_files, "파일")
        file_count_check.how_much_there()

        for filename in erb_files:
            erblines = ERBLoad(filename, encode_type).make_erblines()
            optmized_lines = ERBRemodel(erblines).memory_optimize()
            self.result_infodict.add_dict(filename, optmized_lines)
            file_count_check.how_much_done()

        CommonSent.extract_finished()
        self.func_log.sucessful_done()
        return self.result_infodict  # {파일명:lines} 형태가 포함된 infodict
Пример #10
0
    def replace_num_or_name(self, mod_num=0, erb_files=None, encode_type=None):
        """0:숫자 > 변수, 1: 변수 > 숫자"""
        if not erb_files or not encode_type:
            erb_files, encode_type = CustomInput("ERB").get_filelist()
        file_count_check = StatusNum(erb_files, "ERB 파일")
        file_count_check.how_much_there()
        csv_infodict = ERBUtil().csv_infodict_maker(mod_num + 1, self.func_log)
        print("ERB내 index 변환작업을 시작합니다.")

        for filename in erb_files:
            erblines = ERBLoad(filename, encode_type).make_erblines()
            replaced_lines = ERBRemodel(erblines).replace_csvvars(
                csv_infodict, mod_num)
            self.result_infodict.add_dict(filename, replaced_lines)
            file_count_check.how_much_done()

        CommonSent.extract_finished()
        self.func_log.sucessful_done()
        return self.result_infodict  # {파일명:[바뀐줄]}
Пример #11
0
 def run_menu(self):
     """입력 정보를 int로 변환 후 해당하는 선택지가 있을 때 해당 숫자 반환함. 다른 경우 루프."""
     menu_numlist = tuple(self.menu_dict.keys())
     while True:
         selected_num = self.__print_menu()
         try:
             selected_num = int(selected_num)
             if menu_numlist.count(selected_num) == True:
                 self.selected_menu = self.menu_dict[selected_num]
                 return selected_num
             # EasterEgg
             elif selected_num in (4, 99, 127, 255, 999, 32767, 65535,
                                   2147483647):
                 print("디버그 기능 없습니다!")
                 time.sleep(0.5)
             elif selected_num == 10:
                 input("지켜보고 있다" * 500)
             else:
                 CommonSent.not_ok()
         except ValueError:
             CommonSent.not_ok()
Пример #12
0
    def import_all_CSV(self, mode_num=0, csv_files=None, encode_type=None):
        """InfoDict 클래스를 받아 CSV 변수 자료형 생성

        {csv파일명:{csv변수명:숫자}} 또는 {csv파일명:{숫자:csv변수명}}
        mode_num:
            bit 기반 모드 필터링
            0 = 필터링 없음
            0b1 = 숫자/변수명 반전
            0b10 = chara 등 미포함
            0b100 = srs용 chara 처리
        """
        print("추출을 시작합니다.")

        if not csv_files or not encode_type:
            csv_files, encode_type = CustomInput("CSV").get_filelist()
        self.dic_assemble = InfoDict(0)
        count_check = StatusNum(csv_files, "파일", self.debug_log.NameDir)
        count_check.how_much_there()

        arg_list = [0, None]  # 구별없이 전부
        name_filter = []  # 리스트에 포함된 파일명 제외(소문자만 지원)

        if mode_num:
            # 만들어도 의미없는 파일 제외
            name_filter.extend(("gamebase", "_replace", "variablesize"))

            if mode_num & 0b1:  # 숫자/변수명 반전 있음
                name_filter.append("chara")
                arg_list[0] = 1
            if mode_num & 0b10:  # chara 미포함
                name_filter.extend(("chara", "_rename"))
            if mode_num & 0b100:  # SRS용 인명 처리
                arg_list[1] = ["NAME", "名前", "CALLNAME", "呼び名"]

        # 중복 필터 제거
        name_filter = DataFilter().dup_filter(name_filter)

        for filename in csv_files:
            if mode_num:
                if mode_num & 0b100 and "chara" not in filename.lower():
                    continue
                else:
                    is_filtered = 0
                    for name in name_filter:
                        if name in filename.lower():
                            is_filtered = 1
                            break
                    if is_filtered:
                        continue

            csvdata_dict = self.single_csv_read(filename, encode_type,
                                                *arg_list)
            if csvdata_dict == None:  # 인식되지 않은 경우 infodict에 추가되지 않음
                count_check.error_num += 1
                continue

            self.dic_assemble.add_dict(filename, csvdata_dict)
            count_check.how_much_done()

        if count_check.error_num > 0:
            self.debug_log.if_decode_error()
        CommonSent.extract_finished()
        CommonSent.print_line()
        self.debug_log.sucessful_done()
        return self.dic_assemble
Пример #13
0
    def to_TXT(self, filetype="TXT", option_num=0, encode_type="UTF-8"):
        """입력받은 데이터를 텍스트 파일 형태로 출력하는 함수.

        Vairables:
            filetype: 확장자 구분
            option_num: 1이면 출력시 줄바꿈 관련 절차 진행
            encode_type: 저장되는 파일의 인코딩
        """
        # txt, erb 공용
        # erb metaline은 ERBUtil.indent_maker에서 텍스트.readlines형으로 양식화됨
        self.log_file.workclass = "TXTwrite"
        self.encoding = encode_type
        if self.target_data == None:
            print_data = MenuPreset()
            self.target_data = print_data.load_saved_data(
                0, "미리 실행된 자료가 없습니다.")
            if self.target_data == None:
                print("데이터가 선택되지 않았습니다.")
                return False
            else:
                self.target_name = print_data.selected_name
        else:
            print("이번 구동 중 실행된 {} 자료를 {}화 합니다.".format(self.target_name,
                                                       filetype))
        target_data = self.__data_type_check(
            self.target_data)  # ((자료명,알수 없는 자료형),...)
        menu_dict_sel_dest = {0: "원본 위치에 저장", 1: "결과물 폴더에 저장"}
        menu_sel_dest = Menu(menu_dict_sel_dest)
        menu_sel_dest.title(
            "변환된 파일을 어떤 위치에 저장할까요?",
            "원본 폴더에 저장시 원본 데이터가 손상될 수 있습니다.",
            "결과물 데이터에 원본 위치 정보가 없다면 오류가 발생합니다.",
        )
        dest_mod = menu_sel_dest.run_menu()

        que_list = []
        for data in target_data:
            tag, content = data
            if isinstance(content, InfoDict):
                infodict = content.dict_main
                sel_data = list(
                    map(lambda x: {x: infodict[x]}, infodict.keys()))
            elif isinstance(content, ERBMetaInfo):
                sel_data = [{tag: content}]
            elif isinstance(content, (list, dict)):
                sel_data = [{tag: content}]
            else:
                print("상정되지 않은 자료형이나 일단 진행합니다.")
                sel_data = [data]
            que_list.extend(sel_data)  # [{tag:content}]
        numstat = StatusNum(que_list, filetype + " 파일자료")
        numstat.how_much_there()

        for que in que_list:
            que_key = list(que.keys())[0]
            if dest_mod == 1:  # 결과물 디렉토리에 저장
                if len(que_list) == 1 and que_key in list(
                        self.single_namedict.values()):
                    data_filename = "({}){}".format(CommonSent.put_time(1),
                                                    self.target_name)
                else:
                    data_filename = que_key
                result_filename = "{}.{}".format(
                    FileFilter().sep_filename(data_filename), filetype)
                self.res_filename = self.dest_dir + result_filename
            elif dest_mod == 0:  # 원본 디렉토리에 저장
                self.res_filename = que_key
            self.log_file.which_type_loaded(filetype)

            result_lines = []
            if filetype == "TXT":
                result_lines.append("{}에서 불러옴\n".format(self.target_name))
            context = que[que_key]
            if type(context) == dict:
                for key, value in list(context.items()):
                    result_lines.append("{}:{}\n".format(key, value))
            elif type(context) == FuncInfo:
                for key, value in list(context.func_dict.items()):
                    if isinstance(value, (str, int)):
                        value = value
                    result_lines.append("{}:{}".format(key, ",\n".join(value)))
            elif option_num == 0:
                result_lines.append("{}\n".format(context))
            elif option_num == 1:
                if type(context) == list:
                    result_lines = context
                elif isinstance(context, ERBMetaInfo):
                    result_lines = ERBFunc().remodel_indent(
                        metalineinfo=context.printable_lines())
                else:
                    print("텍스트화 할 수 없는 데이터입니다. 옵션을 바꿔 다시 시도해주세요.")
                    self.log_file.write_log("Can not write text by {}".format(
                        type(context)))
            if result_lines:
                self.__output_txt(result_lines)
            numstat.how_much_done()
        self.log_file.sucessful_done()
        return True
Пример #14
0
 def title(self, *title_names):
     """메뉴 제목용 함수. 메뉴 내 문장 출력에도 사용 가능"""
     CommonSent.print_line()
     for title_name in title_names:
         print(title_name.center(self.window_size, " "))
     CommonSent.print_line()
Пример #15
0
 def __print_menu(self):
     for key in self.menu_dict:
         print("[{}]. {}".format(key, self.menu_dict[key]))
     CommonSent.print_line()
     return input("번호를 입력하세요. 클릭은 지원하지 않습니다. :")
Пример #16
0
 def end_log(self, workname=""):
     with self.addwrite() as log_open:
         log_open.write("[{}] {} done\n\n".format(CommonSent.put_time(),
                                                  workname))
Пример #17
0
def run_main():
    global last_work
    global last_work_name
    global version_no
    while True:
        print("작업 후 버튼을 눌러 프로그램을 종료하셔야 작업파일이 손실되지 않습니다.")
        CommonSent.print_line()
        menu_main.run_menu()

        # [0] 프로그램 종료
        if menu_main.selected_menu == "프로그램 종료":
            break

        # [1] CSV 파일의 분석
        elif menu_main.selected_menu == "CSV 파일 분석":
            CommonSent.print_line()
            menu_dict_csv = {
                0: "이전으로",
                1: "CSV 변수 목록 추출",
                2: "CSV 변수 명칭 사전",
            }
            menu_csv = Menu(menu_dict_csv)
            menu_csv.title("CSV 파일 분석 메뉴입니다.", "따로 표기해놓지 않았다면 숫자:변수명 꼴입니다.")
            no_csvmenu = menu_csv.run_menu()
            if not no_csvmenu:  # 이전으로
                continue
            elif no_csvmenu == 1:
                menu_dict_import_all_csv = {
                    0: "처음으로",
                    1: "필터 설정",
                    2: "구별없이 모두",
                    3: "SRS 작성용 - 인명",
                    4: "SRS 작성용 - 변수명",
                }
                menu_import_all_csv = Menu(menu_dict_import_all_csv)
                menu_import_all_csv.title("CSV를 추출할 내용/파일명 조건을 선택해주세요.")
                no_impcsv_menu = menu_import_all_csv.run_menu()
                if not no_impcsv_menu:  # csv 변수추출 중 처음으로 이동
                    continue
                elif no_impcsv_menu == 1:
                    mod_dict = {1: "1열/2열 반전", 2: "특수형식 csv 미포함"}
                    mod_no = MenuPreset().select_mod(
                        mod_dict,
                        title_txt="1열/2열 반전시 특수형식 csv는 포함하지 않는 것을 권장합니다.")
                elif no_impcsv_menu == 2:
                    mod_no = 0
                elif no_impcsv_menu == 3:  # 인명 SRS용 특수 항목처리
                    mod_no = 0b100
                elif no_impcsv_menu == 4:  # 변수 SRS용 프리셋 - 특수형식 csv 미포함만
                    mod_no = 0b10

                import_all_csv_infodict = CSVFunc().import_all_CSV(mod_no)
                MenuPreset().shall_save_data(import_all_csv_infodict,
                                             "infodict")
                last_work = import_all_csv_infodict  # 마지막 작업 저장
            elif no_csvmenu == 2:
                csvvar_dict = CSVFunc().make_csv_var_dict()
                MenuPreset().shall_save_data(csvvar_dict, "dict")
                last_work = csvvar_dict

            last_work_name = menu_csv.selected_menu  # 마지막 작업 명칭 저장

        # [2] ERB 파일의 분석
        elif menu_main.selected_menu == "ERB 파일 분석":
            menu_dict_anal_erb = {
                0: "이전으로",
                1: "ERB 내 CSV 변수 추출",
                2: "구상추출",
                3: "ERB형 데이터베이스 추출"
            }
            menu_anal_erb = Menu(menu_dict_anal_erb)
            menu_anal_erb.title("ERB 파일 분석 메뉴입니다.")
            no_erbmenu = menu_anal_erb.run_menu()
            if not no_erbmenu:  # 이전으로
                continue
            elif no_erbmenu == 1:
                csvvar_mod_dict = {1: "CSV당 차트 생성(비활성화시 ERB당 생성됨)"}
                csvvar_opt = MenuPreset().select_mod(csvvar_mod_dict)
                last_work = ERBFunc().search_csv_var(opt=csvvar_opt)
                sav_datatype = "sheetinfo"
            elif no_erbmenu == 2:
                ext_print_mod_dict = {
                    1: "차트 내 중복 자료 제거",
                    2: "ERB파일당 차트 할당(비활성화시 차트 하나에 전부 포함)",
                    3: "공백을 포함하지 않음",
                    4: "주석추출 모드"
                }
                ext_print_opt = MenuPreset().select_mod(ext_print_mod_dict)
                last_work = ERBFunc().extract_printfunc(opt=ext_print_opt)
                sav_datatype = "sheetinfo"
            elif no_erbmenu == 3:
                last_work = ERBFunc().db_erb_finder()
                sav_datatype = "erblines"

            if last_work != None:
                MenuPreset().shall_save_data(last_work, sav_datatype)

            last_work_name = menu_anal_erb.selected_menu  # 마지막 작업 명칭 저장

        # [3] ERB 파일의 처리
        elif menu_main.selected_menu == "ERB 파일 처리":
            menu_dict_erb = {
                0: "이전으로",
                1: "들여쓰기 교정",
                2: "구상 번역기",
                3: "ERB 내 CSV 인덱스 변환",
                4: "불완전 수식 정리",
                5: "구상 메모리 최적화",
            }
            menu_erb = Menu(menu_dict_erb)
            menu_erb.title("ERB 파일 처리 메뉴입니다.",
                           "현재 TW 파일 이외의 정상 구동을 보장하지 않습니다.")
            no_erbmenu = menu_erb.run_menu()
            if not no_erbmenu:  # 이전으로
                continue

            last_work = None

            if menu_erb.selected_menu == "들여쓰기 교정":
                last_work = ERBFunc().remodel_indent()
                sav_datatype = "erblines"
            elif menu_erb.selected_menu == "구상 번역기":  # v3.7.0 현재 알파버전
                print("양식에 맞는 txt 파일을 erb 문법 파일로 바꾸어주는 유틸리티입니다.")
                menu_list_eratype = ["TW"]
                menu_eratype = Menu(menu_list_eratype)
                menu_eratype.title("어느 종류의 에라인지 선택해주세요.")
                menu_eratype.run_menu()
                if menu_eratype.selected_menu in menu_list_eratype:
                    sent_load_dis = "csvvar 딕셔너리를 불러와주세요. 미선택시 추후 생성 단계로 넘어갑니다."
                    csvvar_dict = MenuPreset().load_saved_data(
                        0, sent_load_dis)
                    last_work = ERBFunc().translate_txt_to_erb(
                        menu_eratype.selected_menu, csvvar_dict)
                    sav_datatype = "metaerb"
            elif menu_erb.selected_menu == "ERB 내 CSV 인덱스 변환":
                menu_dict_erb_rep = {0: "숫자를 변수로", 1: "변수를 숫자로"}
                menu_erb_rep = Menu(menu_dict_erb_rep)
                mod_num = menu_erb_rep.run_menu()
                last_work = ERBFunc().replace_num_or_name(mod_num)
                sav_datatype = "erblines"
            elif menu_erb.selected_menu == "불완전 수식 정리":
                last_work = ERBFunc().remodel_equation()
                sav_datatype = "metainfoline"
            elif menu_erb.selected_menu == "구상 메모리 최적화":  # 3.7.0 현재 베타버전
                last_work = ERBFunc().memory_optimizer()
                sav_datatype = "erblines"

            if last_work != None:
                MenuPreset().shall_save_data(last_work, sav_datatype)
                print("결과물을 ERB로 출력하시고 싶은 경우 추가 절차를 진행해주세요.")
                if MenuPreset().yesno("지금 바로 데이터를 erb화 할까요?"):
                    ResultFunc().make_result(menu_erb.selected_menu, last_work,
                                             1)

            last_work_name = menu_erb.selected_menu  # 마지막 작업 명칭 저장

        # [4] ERH 파일의 분석
        elif menu_main.selected_menu == "ERH 파일 분석 (미실장)":
            print("미실장입니다")

        # [5] 외부 데이터 처리
        elif menu_main.selected_menu == "외부 데이터 처리":
            menu_dict_other_data = {
                0: "이전으로",
                1: "UserDic.json srs화",
                2: "웹 게시글 txt화",
                3: "srs 병합",
            }
            menu_other_data = Menu(menu_dict_other_data)
            menu_other_data.title("에라 파일과 관련성이 적은 데이터의 처리 메뉴입니다.")
            no_othermenu = menu_other_data.run_menu()

            if not no_othermenu:  # 이전으로
                continue

            last_work_name = menu_other_data.selected_menu

            if "srs" in last_work_name:
                if last_work_name == "UserDic.json srs화":
                    last_work = EXTFunc().userdict_to_srs()
                elif last_work_name == "srs 병합":
                    last_work = SRSFunc().merge_srs()

                if not last_work:
                    input("작업한 내용이 없습니다.")
                    continue
                elif MenuPreset().yesno("바로 srs화를 진행할까요?"):
                    ResultFunc().make_result(last_work_name, last_work, 2)
                else:
                    input(
                        "저장된 infodict 데이터를 기반으로 '결과물 srs화'를 해주셔야 srs화가 되니 참고해주세요."
                    )

            elif last_work_name == "웹 게시글 txt화":
                last_work = CrawlFunc().crawl_text()
                if last_work == None:
                    input("작업한 내용이 없습니다.")
                    continue

                print("바로 txt화를 진행합니다.")
                ResultFunc().make_result(last_work_name, last_work)

        # [6] 결과물 처리
        elif menu_main.selected_menu == "결과물 처리":
            menu_dict_result = {
                0: "이전으로",
                1: "결과물 TXT화",
                2: "결과물 ERB화",
                3: "결과물 srs화",
                4: "결과물 xlsx화",
            }
            menu_result = Menu(menu_dict_result)
            menu_result.title("추출 결과물에 대한 제어 메뉴입니다.")
            no_resultmenu = menu_result.run_menu()
            if not no_resultmenu:
                continue

            ResultFunc().make_result(last_work_name, last_work,
                                     no_resultmenu - 1)
            # 결과물 처리 이후 last_work, last_work_name 은 초기화되지 않음

        # [7] 프로그램 정보
        elif menu_main.selected_menu == "프로그램 정보":
            xml_settings = SettingXML()
            menu_dict_prginfo = {0: "이전으로", 1: "버전명", 2: "오류보고 관련", 3: "유의사항"}
            menu_prginfo = Menu(menu_dict_prginfo)
            menu_prginfo.title("EZworkEra 정보")
            no_proginfo = menu_prginfo.run_menu()
            if no_proginfo == 1:
                print("버전명: " + version_no)
            elif no_proginfo == 2:
                print("{}/issues 으로 연락주세요.".format(
                    xml_settings.show_info("github")))
            elif no_proginfo == 3:
                print(xml_settings.show_info("caution"))

    CommonSent.end_comment()