Beispiel #1
0
 def printing(self, srs_dict: dict = dict()):
     result_infodict = InfoDict(1)
     for filename, lines in self.erb_info.dict_main.items():
         replaced_lines = ERBRemodel(lines).replace_csvvars(
             self.csv_infodict, 1, srs_dict)
         result_infodict.add_dict(filename, replaced_lines)
     return result_infodict
Beispiel #2
0
    def crawl_text(self):
        """웹페이지 내 텍스트를 크롤링하는 함수"""
        print("현재 ArcaLive 내 게시글만 지원합니다.")
        while True:
            print("입력하신 웹페이지 내 텍스트 내용을 크롤링합니다. 공란인 경우 이전으로 돌아갑니다.")
            target_url = input(
                "크롤링할 웹페이지 url를 입력해주세요. http나 https가 포함되어야 합니다. : ")
            if not target_url:  # 공란 입력
                return None
            elif target_url.find("arca.live"):
                html_data = ArcaliveCrawl(target_url)
                result_data = html_data.txt_data()
                break
            else:  # 도메인이 아카라이브가 아님
                print("현재 ArcaLive 내 게시글만 지원합니다.")

        if not result_data:
            print("크롤링된 데이터가 없습니다.")

        result_infodict = InfoDict("WebCrawl")
        result_infodict.add_dict(target_url, result_data)
        return result_infodict
Beispiel #3
0
    def analyze_erh(self, erh_files=None, encode_type=None):  # TODO 본격적으로 만져야함
        """return (ERH_infodict, 구동중 통합 dim_dict)"""
        if not erh_files or not encode_type:
            erh_files, encode_type = CustomInput("ERH").get_filelist()
        clsdim = HandleDIM()
        infodict = InfoDict("ERHInfoDict")

        for erhname in erh_files:
            temp_dimdict = dict()
            lines = ERHLoad(erhname, encode_type).make_bulklines()
            for line in lines:
                line.strip()
                if line.startswith(";"):
                    continue
                words = line.split()
                if not words:
                    continue
                elif words[0].startswith("#DIM"):
                    temp_dimdict.update(clsdim.dim_search(line))
            infodict.add_dict(erhname, temp_dimdict)

        return infodict, clsdim.dim_dict
Beispiel #4
0
    def convert_to_infodict(self):
        pd_name = "PreDic"
        ad_name = "AfterDic"
        orig_words = InfoDict("orig_words")
        trans_words = InfoDict("trans_words")

        for dict_name in (pd_name, ad_name):
            dictdata = self.filedata.get(dict_name)
            orig_dict = dict()
            trans_dict = dict()

            for order_no, key in enumerate(dictdata):
                orig_dict[order_no] = key
                trans_dict[order_no] = dictdata[key]

            orig_words.add_dict("orig\\" + dict_name, orig_dict)
            trans_words.add_dict("trans\\" + dict_name, trans_dict)
        return orig_words, trans_words
Beispiel #5
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
Beispiel #6
0
class CSVFunc:

    debug_log = LogPreset(1)

    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

    def single_csv_read(self,
                        csvname,
                        encode_type="UTF-8",
                        opt=0,
                        filter_list=None):
        """csv 파일을 읽어 dict형이나 list형을 불러옴.
        opt 0: {0행:1행}, 1: {1행:0행}, 2:[1행1열,1행2열,...]
        """
        csv_data = CSVLoad(csvname, encode_type)
        self.debug_log.write_loaded_log(csvname)
        try:
            if opt in (0, 1):
                if "chara" in csvname.lower():
                    csv_data.chara_csv(filter_list)
                else:
                    csv_data.core_csv(opt, filter_list)
                the_result = DataFilter().erase_quote(csv_data.dict_csvdata)
            elif opt == 2:
                csv_data.core_csv()
                the_result = DataFilter().dup_filter(csv_data.list_csvdata)
        except UnicodeDecodeError as UniDecode:
            if opt == 2:
                self.debug_log.if_decode_error()
            self.debug_log.write_error_log(UniDecode, csvname)
            the_result = None

        return the_result

    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
Beispiel #7
0
    def anal_erbs(self, mod: int = 0b111):
        """ERB 파일 분석 함수.

        mod 설정정보
            bit 0 : 함수, bit 1 : CSV변수, bit 2: DIM변수
        """
        self.erb_infdict = InfoDict(1)
        for erb in self.bring.search_filelist(".ERB"):
            with open(erb, "r", encoding=self.encode_type) as erbfile:
                self.erb_infdict.add_dict(erb, erbfile.readlines())
        self.anal_erhs()

        if mod & 0b001:  # Function 처리
            def_funcinfo = FuncInfo()
            use_funcinfo = FuncInfo()
            mis_funcs = []
        if mod & 0b010:  # CSV Var 처리
            csv_varlist = []
        if mod & 0b100:  # DIM Var 처리
            handle_dim = HandleDIM()

        for erbname, lines in self.erb_infdict.dict_main.items():
            # line당 여건 체크
            for line in lines:
                line.strip()
                if line.startswith(";"):  # Comment
                    continue
                words = line.split()
                if not words:
                    continue
                if mod & 0b001:  # Function
                    head = words[0]
                    if mod & 0b001 and head in ("TRYCALLFORM", "TRYCCALLFORM",
                                                "TRYCALL", "CALLFORM", "CALLF",
                                                "CALL"):
                        words.pop(0)
                        funcname = " ".join(words).split("(")[0]
                        try:
                            int(funcname)
                        except ValueError:
                            use_funcinfo.add_dict(funcname, [
                                funcname,
                            ], erbname)
                    elif mod & 0b001 and head.startswith("@"):
                        funcname = head.replace("@",
                                                "").split("(")[0].split(",")[0]
                        def_funcinfo.add_dict(funcname, [
                            funcname,
                        ], erbname)
                if mod & 0b010:  # CSV Vars
                    result = self.vfinder.find_csvfnc_line(line)
                    if result:
                        csv_varlist.extend(result)
                if mod & 0b100 and words[0].startswith("#DIM"):  # DIM Vars
                    self.dim_dict.update(
                        handle_dim.dim_search(line))  # TODO DIM 분석필요

        # 결과물 처리 부분
        used_csvvar = []
        index_csvvar = []
        if mod & 0b001:  # Function
            for used_func in use_funcinfo.func_dict:
                if not def_funcinfo.func_dict.get(used_func):
                    mis_funcs.append(used_func)
        if mod & 0b010:  # CSV Vars
            changed_csvvar = self.vfinder.change_var_index(csv_varlist, 1)
            changed_csvvar = DataFilter().dup_filter(changed_csvvar)
            used_csvvar, index_csvvar = self.vfinder.print_csvfnc(
                changed_csvvar, 0b1100)
            index_csvvar = self.compare_csvvar(index_csvvar)

        return mis_funcs, used_csvvar, index_csvvar
Beispiel #8
0
class AnalyzeFiles:
    def __init__(self, bringfiles: BringFiles, encode_type: str):
        self.bring = bringfiles
        self.encode_type = encode_type
        self.dim_dict: dict[str, list[str]] = dict()

    def anal_erbs(self, mod: int = 0b111):
        """ERB 파일 분석 함수.

        mod 설정정보
            bit 0 : 함수, bit 1 : CSV변수, bit 2: DIM변수
        """
        self.erb_infdict = InfoDict(1)
        for erb in self.bring.search_filelist(".ERB"):
            with open(erb, "r", encoding=self.encode_type) as erbfile:
                self.erb_infdict.add_dict(erb, erbfile.readlines())
        self.anal_erhs()

        if mod & 0b001:  # Function 처리
            def_funcinfo = FuncInfo()
            use_funcinfo = FuncInfo()
            mis_funcs = []
        if mod & 0b010:  # CSV Var 처리
            csv_varlist = []
        if mod & 0b100:  # DIM Var 처리
            handle_dim = HandleDIM()

        for erbname, lines in self.erb_infdict.dict_main.items():
            # line당 여건 체크
            for line in lines:
                line.strip()
                if line.startswith(";"):  # Comment
                    continue
                words = line.split()
                if not words:
                    continue
                if mod & 0b001:  # Function
                    head = words[0]
                    if mod & 0b001 and head in ("TRYCALLFORM", "TRYCCALLFORM",
                                                "TRYCALL", "CALLFORM", "CALLF",
                                                "CALL"):
                        words.pop(0)
                        funcname = " ".join(words).split("(")[0]
                        try:
                            int(funcname)
                        except ValueError:
                            use_funcinfo.add_dict(funcname, [
                                funcname,
                            ], erbname)
                    elif mod & 0b001 and head.startswith("@"):
                        funcname = head.replace("@",
                                                "").split("(")[0].split(",")[0]
                        def_funcinfo.add_dict(funcname, [
                            funcname,
                        ], erbname)
                if mod & 0b010:  # CSV Vars
                    result = self.vfinder.find_csvfnc_line(line)
                    if result:
                        csv_varlist.extend(result)
                if mod & 0b100 and words[0].startswith("#DIM"):  # DIM Vars
                    self.dim_dict.update(
                        handle_dim.dim_search(line))  # TODO DIM 분석필요

        # 결과물 처리 부분
        used_csvvar = []
        index_csvvar = []
        if mod & 0b001:  # Function
            for used_func in use_funcinfo.func_dict:
                if not def_funcinfo.func_dict.get(used_func):
                    mis_funcs.append(used_func)
        if mod & 0b010:  # CSV Vars
            changed_csvvar = self.vfinder.change_var_index(csv_varlist, 1)
            changed_csvvar = DataFilter().dup_filter(changed_csvvar)
            used_csvvar, index_csvvar = self.vfinder.print_csvfnc(
                changed_csvvar, 0b1100)
            index_csvvar = self.compare_csvvar(index_csvvar)

        return mis_funcs, used_csvvar, index_csvvar

    def anal_erhs(self) -> dict[str, list[str]]:
        """분석할 ERB의 기반 ERH를 분석해 그 결과값을 dict형태로 반환함"""
        erh_files = self.bring.search_filelist(".ERH")
        if not erh_files:  # 주어진 구상 폴더 내에 ERH 파일이 없음
            return {}
        _, temp_dimdict = ERHFunc().analyze_erh(erh_files, self.encode_type)
        self.dim_dict.update(temp_dimdict)
        return temp_dimdict

    def anal_csvs(self, f_csvinfo: InfoDict, t_csvinfo: InfoDict) -> dict:
        self.vfinder = ERBVFinder(f_csvinfo)
        self.t_vfinder = ERBVFinder(t_csvinfo)
        srs_dict, *_ = SRSFunc().build_srsdict(f_csvinfo, t_csvinfo)
        return srs_dict

    def compare_csvvar(self, used_list: list[str]):
        """index 기반 사용 변수 list를 받아 처리되지 않은 list 반환"""
        not_checked = used_list.copy()

        for var in used_list:
            is_dim = False
            csvname, *vardata = var.split(":")
            var_context = vardata[-1]

            if self.t_vfinder.extra_dict.get(
                    csvname):  # csvname != 일반적 filename
                csvname: str = self.t_vfinder.extra_dict[csvname]

            csv_filename: str = self.t_vfinder.csv_fnames.get(csvname)
            if csv_filename:
                if self.dim_dict.get(
                        var_context):  # dim_dict 에서 찾을 수 있는 var_context인 경우
                    var_context = self.dim_dict[var_context][0]  # 일단 1차원만 상정
                    is_dim = True

                if self.t_vfinder.csv_infodict.dict_main[csv_filename].get(
                        var_context):  # 해당 var_context가 목록에 존재하는 경우
                    trans_var = var
                elif is_dim:
                    vardata[-1] = var_context
                    trans_var = csvname + ":" + ":".join(vardata)
                else:
                    continue

                try:
                    not_checked.pop(not_checked.index(trans_var))
                except ValueError:
                    pass

        return not_checked
Beispiel #9
0
 def __init__(self):
     self.result_infodict = InfoDict(1)
Beispiel #10
0
class ERBFunc:

    func_log = LogPreset("ERBwork")

    def __init__(self):
        self.result_infodict = InfoDict(1)

    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

    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

    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

    def translate_txt_to_erb(self, era_type, csvvar_dict):
        txt_files, encode_type = CustomInput("TXT").get_filelist()
        file_count_check = StatusNum(txt_files, "파일")
        file_count_check.how_much_there()
        chara_num = input("작성하실 캐릭터의 번호를 입력해주세요. : ")
        self.comp_lines = []

        for filename in txt_files:
            file_lines = ERBWrite(filename, encode_type, era_type,
                                  chara_num).txt_to_erblines(csvvar_dict)
            print("{}의 처리가 완료되었습니다.".format(filename))
            self.comp_lines.extend(file_lines)
            file_count_check.how_much_done()

        erb_metainfo = ERBUtil().make_metainfo_lines(self.comp_lines, 0,
                                                     filename)
        self.func_log.sucessful_done()
        return erb_metainfo

    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  # {파일명:[바뀐줄]}

    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

    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

    def erb_trans_helper(self):  # TODO 공사중
        """번역본의 원본 이식에 도움을 주는 함수"""
        print("원본 erb의 디렉토리를 지정해주세요.")
        o_blkdata = ERBBlkFinder()
        print("번역본 erb의 디렉토리를 지정해주세요.")
        t_blkdata = ERBBlkFinder()
        # TODO 이름만 다른 파일 비교 가능하게 - CompareErb.csv 활용

    def db_erb_finder(self, erb_files=None, encode_type=None, tag=None):
        """데이터베이스형 ERB 자료 추출 함수"""
        print("되도록 필요한 파일만 있는 폴더를 만든 후 그곳에서 진행해주세요.",
              "추후 복수의 파일을 비교하고자 하는 경우, 각 파일의 파일명은 같아야 합니다.",
              sep="\n")
        if not erb_files or not encode_type:
            erb_files, encode_type = CustomInput("ERB").get_filelist()
        while True:
            if not tag:
                tag = input("필요한 데이터 형식의 앞말을 붙여넣어주세요.: ")
            adj_yn = MenuPreset().yesno(
                "AAA/BBB/CCC 꼴의 데이터인 경우, 각 요소별 분할이 가능합니다.", "분할을 시도하시겠습니까?")
            case_yn = MenuPreset().yesno(
                "CASE XXX ~ tag AAA 꼴의 데이터인 경우 CASE를 활용한 좀 더 정확한 계산이 가능합니다.",
                "해당 작업을 시도하시겠습니까?")
            adj_res = "Yes" if adj_yn else "No"
            case_res = "Yes" if case_yn else "No"
            if not MenuPreset().yesno(
                    "tag: %s, 분할 시도: %s, CASE 사용: %s가 맞습니까?" %
                (tag, adj_res, case_res)):
                if MenuPreset().yesno("작업을 취소할까요?"):
                    return None
                continue
            break

        for erbname in erb_files:
            erb_load = ERBLoad(erbname, encode_type)
            erblines = erb_load.make_erblines()
            self.result_infodict.add_dict(
                erbname,
                DataBaseERB().collect_adj(erblines, tag, adj_yn, case_yn))

        return self.result_infodict
Beispiel #11
0
 def __init__(self):
     self.block_data = InfoDict(1)  # {filename:{index:(func,(code_block))}}
     self.files, self.encode_type = CustomInput("ERB").get_filelist()