import yaml import os from typing import Dict import pickle from .utils import get_files __all__ = ["load_fonts", "DSFont"] class DSFont: def __init__(self, path, language): self.path = path self.language = language def load_fonts(config_path="configs/font.yml"): with open(config_path, "r", encoding="utf-8") as f: config = yaml.safe_load(f) ds_config = config["dataset"] ds_path = ds_config["path"] font_list = [] for spec in ds_config["specs"]: for spec_path in spec["path"]: spec_path = os.path.join(ds_path, spec_path) spec_files = get_files(spec_path) if spec.keys().__contains__("rule"): rule = eval(spec["rule"]) else: rule = None for file in spec_files: if rule is not None and not rule(file): print("skip: " + file) continue font_list.append(DSFont(str(file).replace("\\", "/"), spec["language"])) font_list.sort(key=lambda x: x.path) exclusion_list = ds_config["exclusion"] exclusion_list = [os.path.join(ds_path, path) for path in exclusion_list] def exclusion_rule(font: DSFont): for exclusion in exclusion_list: if os.path.samefile(font.path, exclusion): return True return False return font_list, exclusion_rule def load_font_with_exclusion( config_path="configs/font.yml", cache_path="font_list_cache.bin" ) -> Dict: if os.path.exists(cache_path): return pickle.load(open(cache_path, "rb")) font_list, exclusion_rule = load_fonts(config_path) font_list = list(filter(lambda x: not exclusion_rule(x), font_list)) font_list.sort(key=lambda x: x.path) print("font count: " + str(len(font_list))) ret = {font_list[i].path: i for i in range(len(font_list))} with open("font_list_cache.bin", "wb") as f: pickle.dump(ret, f) return ret