예제 #1
0
 def __handle_csvvar(self, word, last_word):
     dup_datalist = []
     dup_switch = 0
     now_switch = 0
     if "<지금>" in word:
         word.replace("<지금>", "")
         now_switch = 1
     if self.csvvar_dict.get("dup1_" + word):
         self.__csvvar_dup_count += 1
         dup_switch = 1
         target_list = list(self.csvvar_dict.keys())
     else:
         target_list = [word]
     for var in target_list:
         if (var.endswith(word) and var.startswith("dup")) or word == var:
             csvvar_data = self.csvvar_dict[var]
             csv_name = FileFilter().sep_filename(csvvar_data[0]).upper()
             if now_switch:
                 if csv_name == "EX":
                     csv_name = "NOWEX"
             if self.csvvar_type == 0:
                 word_withcsv = csv_name + ":" + word.replace("__", " ")
             elif self.csvvar_type == 1:
                 word_withcsv = "{}:{}".format(csv_name, csvvar_data[1])
             dup_datalist.append(word_withcsv)
     if dup_switch:
         result = "!중복변수! 변수명={} {}".format(word, " OR ".join(dup_datalist))
     else:
         result = word_withcsv
     if last_word in self.namedict_situ.values():
         result = result.replace(":", ":{}:".format(last_word))
         self.__namedict_used_switch = 1
     return result
예제 #2
0
 def search_filelist(self, *ext, opt=1):
     result = []
     for ex in ext:
         if not ex.startswith("."):
             ex = "." + ex
         result.extend(FileFilter(opt).files_ext(self.dirname, ex))
     return result
예제 #3
0
    def srsdict_to_sheet(self, srs_data=None):
        if not srs_data:
            filename = input("작업할 srs/simplesrs 파일의 경로를 입력해주세요.")
            encoding = MenuPreset().encode()
            srs_data, _ = SRSFile(filename, encoding).make_dict()
            sheetname = FileFilter().sep_filename(filename)
        else:
            sheetname = 'srs-sheet'

        result, _ = SRSConvert().make_srs_to_sheet(srs_data, sheetname)

        return result
예제 #4
0
 def __init__(self, csvdict: InfoDict or list, log_set=None):
     if isinstance(csvdict, InfoDict):
         self.csv_infodict = csvdict
         self.csv_fnames = dict()
         for filename in list(self.csv_infodict.dict_main.keys()):
             csvname = FileFilter().sep_filename(filename).upper()
             self.csv_fnames[csvname] = filename
         self.csv_head = list(self.csv_fnames.keys())
     elif isinstance(csvdict, list):
         self.csv_head = csvdict
     else:
         raise TypeError
     csv_all_head = self.csv_head + list(self.extra_dict.keys())
     re_varshead = "({})".format("|".join(csv_all_head))
     self.csvvar_re = re.compile(re_varshead + self.context_filter)
     self.log_set = log_set
예제 #5
0
    def _check_datatype(self, data_1, data_2, text: str = "", isrepeat=False):
        result: list(tuple) = []
        have_null = {}
        if type(data_1) == type(data_2):
            if isinstance(data_1, InfoDict):
                a_dict: dict = data_1.dict_main
                b_dict: dict = data_2.dict_main
                sep_name = FileFilter(0).sep_filename
                datadict_a = {
                    sep_name(key): val
                    for key, val in a_dict.items()
                }
                datadict_b = {
                    sep_name(key): val
                    for key, val in b_dict.items()
                }
                result, have_null = self._check_datatype(
                    datadict_a, datadict_b, "InfoDict 내부 ", True)
            elif isinstance(data_1, dict):
                keys_1 = list(data_1.keys())
                keys_2 = list(data_2.keys())
                total_keys = DataFilter().dup_filter(keys_1 + keys_2)
                for t_key in total_keys:
                    if t_key not in keys_1:
                        have_null[t_key] = 1
                    elif t_key not in keys_2:
                        have_null[t_key] = 2
                    elif isrepeat and isinstance(
                            data_1[t_key],
                        (dict, list, tuple)):  # 재귀중 value에서 또 발견
                        dat, h_nul = self._check_datatype(
                            data_1[t_key], data_2[t_key], "dict 안 data ", True)
                        result.extend(dat)
                        have_null.update(h_nul)
                    else:
                        result.append((data_1[t_key], data_2[t_key]))
            elif isinstance(data_1, (list, tuple)):
                if len(data_1) != len(data_2):
                    print("두 자료의 길이가 일치하지 않습니다. 일부 자료가 누락되었습니다.")
                f_strip = DataFilter().strip_filter
                result = list(zip(f_strip(data_1), f_strip(data_2)))
            else:
                raise NotImplementedError("지원하지 않는 자료형: " + type(data_1))
        else:
            raise TypeError("%s두 데이터의 자료형이 같지 않습니다." % text)

        return result, have_null
예제 #6
0
    def to_xlsx(self, xlsxname=None):
        """입력받은 데이터를 xlsx로 출력하는 함수. 현재 SheetInfo형만 지원함."""
        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

        if not xlsxname:
            xlsxname = "basic_sheet"

        _, data = self.__data_type_check(self.target_data,
                                         max_data=1)[0]  # 최대 1개만
        if not isinstance(data, SheetInfo):
            print("차트화 기능은 현재 특정 기능에서만 지원합니다. 다른 처리방법을 시도해주세요.")
            return False

        xlsx_data = openpyxl.Workbook()
        for count, o_sheetname in enumerate(data.sheetdict):
            sheetname = FileFilter(2).sep_filename(o_sheetname)
            if not count:
                sheet = xlsx_data.active
                sheet.title = sheetname
            else:
                xlsx_data.create_sheet(sheetname)
                sheet = xlsx_data.get_sheet_by_name(sheetname)

            main_data = data.sheetdict[o_sheetname].copy()
            sheet_info = main_data.pop(0)
            datatags = sheet_info["tags"]
            sheet.append(datatags)
            tags_dict = dict(zip(datatags, range(1, len(datatags) + 1)))
            for context in main_data:
                apnd_dict = dict()
                for key, value in context.items():
                    apnd_dict[tags_dict[key]] = value
                sheet.append(apnd_dict)
        xlsx_data.save("%s%s.xlsx" % (self.dest_dir, xlsxname))
        return True
예제 #7
0
 def search_csvdict(self, encode_type):
     csv_filelist = FileFilter(1).files_ext(self.dirname, ".CSV")
     CSVinfodict = CSVFunc().import_all_CSV(0b10, csv_filelist, encode_type)
     return CSVinfodict
예제 #8
0
    def to_SRS(self, srs_opt=0, srsname=None):
        """입력받은 데이터를 updateera의 simplesrs 양식으로 출력

        Variables:
            srs_opt: bit 기반 모드 설정 - 짧은 단어, srs 내부 중복 문자열 필터링 등 체크.
            srsname: 저장될 simplesrs 파일명
        """
        flags = 0b000000
        h_opt = 0b0000
        done_count = 0
        failed_count = 0
        self.log_file.workclass = "SRSWrite"
        while True:
            dataset = self.__multi_data_input()
            print("처음 선택한 두 데이터만으로 진행합니다.\n")
            print("SRS 자료 입력시 첫번째를 원문, 두번째를 번역문으로 인식합니다.\n")
            o_dataset, t_dataset = self.__data_type_check(*dataset, max_data=2)
            orig_data, trans_data = o_dataset[1], t_dataset[1]
            if orig_data and trans_data:
                if MenuPreset().yesno(
                        "선택하신 두 자료가",
                        "원본:  " + str(o_dataset[0]),
                        "번역본: " + str(t_dataset[0]),
                        "입니까?",
                ):
                    break
            else:
                print("공란인 데이터가 있습니다. 다시 시도해주세요.")

        if srs_opt & 0b100000:  # srs 내 제외사항 기록
            exp_opt_dict = {1: "미번역 단어", 2: "한글자 단어", 3: "원문 누락", 4: "번역문 누락"}
            exp_opt = MenuPreset().select_mod(exp_opt_dict, 0b1010,
                                              "srs 내 작성할 항목을 선택해주세요.")
            flags |= exp_opt

        # SRS type 설정부
        ext_str = "simplesrs"
        if not srsname:
            srsname = "autobuild"
        self.res_filename = "{}.{}".format(self.dest_dir + srsname, ext_str)

        # 데이터가 InfoDict형이라면 데이터 목록 호출
        if isinstance(orig_data, InfoDict) and isinstance(
                trans_data, InfoDict):
            sep_name = FileFilter(0).sep_filename
            orig_data = {
                sep_name(key): val
                for key, val in orig_data.dict_main.items()
            }
            trans_data = {
                sep_name(key): val
                for key, val in trans_data.dict_main.items()
            }
            orig_infokeys = list(orig_data.keys())
            trans_infokeys = list(trans_data.keys())
            flags |= 0b010000  # isInfoDict
        else:
            orig_infokeys = [o_dataset[0]]
            trans_infokeys = [t_dataset[0]]

        # SRS 가필 유무 검사
        if not os.path.isfile(self.res_filename):
            print("SRS 파일을 새로 작성합니다.")
            flags |= 0b100000  # isFirst
            srs_headdict = {
                1: "[-WORDWRAP-]",
                2: "[-TRIM-]",
                3: "[-REGEX-]",
                4: "[-SORT-]"
            }
            h_opt = MenuPreset().select_mod(
                srs_headdict, 0b1010,
                "srs에 사용할 필터를 선택해주세요.\nREGEX와 SORT 옵션은 동시 사용이 불가합니다")
            dup_chk = DupItemCheck()
        else:
            _, dup_chk = SRSFunc().exist_srsdict(self.res_filename)

        print("SRS 입력을 시작합니다...")
        for num in range(len(orig_infokeys)):
            try:
                self.orig_key = orig_infokeys[num]
                self.trans_key = trans_infokeys[num]
                if isinstance(orig_data, dict) and isinstance(
                        trans_data, dict):
                    self.trans_key = self.orig_key
            except IndexError as error:
                comment = "두 자료의 항목 수 또는 행이 같지 않습니다."
                self.log_file.write_error_log(error, self.orig_key, comment)
                failed_count += 1
                continue

            if self.orig_key in list(self.single_namedict.values()):
                keyname = "단독파일"
            elif self.orig_key.startswith("ex: "):  # FuncInfo 대응용 임시
                keyname = "단독파일"
            else:
                keyname = FileFilter().sep_filename(self.orig_key)

            if isinstance(orig_data, dict) and isinstance(trans_data, dict):
                target_couple = orig_data.get(self.orig_key), trans_data.get(
                    self.trans_key)
            elif isinstance(orig_data, FuncInfo) and isinstance(
                    trans_data, FuncInfo):
                # TODO 함수별 또는 파일별 나눠 분류 가능하도록
                target_couple = orig_data.func_dict, trans_data.func_dict
            else:
                target_couple = orig_data, trans_data

            multiwrite = self.__SRS_multi_write(*target_couple, keyname, flags,
                                                dup_chk, h_opt, srs_opt)
            if not multiwrite:
                failed_count += 1
            else:
                if multiwrite[0]:  #is_worked
                    flags &= flags ^ 0b100000  # remove isFirst Flag when first write finished
                    h_opt = 0
                    done_count += 1
                if multiwrite[1] & 0b100 or multiwrite[1] & 0b001:
                    failed_count += 1

        if done_count and failed_count == 0:
            pass
        else:
            if not done_count:
                print(
                    "입력된 정보로 이전에 만들어진 SRS 파일이거나 오류로 인해 SRS의 가필이 이루어지지 않았습니다.")
            elif failed_count != 0:
                print("{}쌍의 데이터가 정확히 작성되지 못했습니다.".format(failed_count))
            print("{}를 확인해주세요.".format(self.log_file.NameDir))
        self.log_file.sucessful_done()
        return True
예제 #9
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