diff --git a/src/tree.py b/src/tree.py index b770efcbed27862e46454c98fa75f23c00da153b..156e547da8071a7a04343cb3d0689542e0c0e57e 100644 --- a/src/tree.py +++ b/src/tree.py @@ -14,6 +14,7 @@ formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) + def load_json(p): with open(p, 'r') as f: return json.loads(f.read()) @@ -28,7 +29,7 @@ def dump_json(p, j, exist_ok=False, override=False): logger.error(f"{p} already exist") sys.exit(0) - with open(p, 'w+') as f: + with open(p, 'w+', encoding="utf8") as f: f.write(json.dumps(j, indent=2, ensure_ascii=False)) @@ -94,23 +95,39 @@ class TreeWalker: for index, level in enumerate(root_node["children"]): level_title = list(level.keys())[0] level_node = list(level.values())[0] - level_path = os.path.join(self.root, f"{index+1}.{level_title}") + level_path = os.path.join(self.root, f"{index + 1}.{level_title}") self.load_chapters(level_path, level_node) for index, chapter in enumerate(level_node["children"]): chapter_title = list(chapter.keys())[0] chapter_node = list(chapter.values())[0] - chapter_path = os.path.join(level_path, f"{index+1}.{chapter_title}") + chapter_path = os.path.join(level_path, f"{index + 1}.{chapter_title}") self.load_sections(chapter_path, chapter_node) for index, section_node in enumerate(chapter_node["children"]): section_title = list(section_node.keys())[0] - full_path = os.path.join(chapter_path, f"{index}.{section_title}") + full_path = os.path.join(chapter_path, f"{index + 1}.{section_title}") if os.path.isdir(full_path): self.ensure_exercises(full_path) + # TODO 四级知识点的处理仅为 Java 技能树的临时处理而设定,未来java技能树上线前会删掉这部分代码,将四级节点 + # 合并到三级节点 + for idx, [num, sub_section_title] in self.sort_dir_list([p for p in os.listdir(full_path) + if os.path.isdir(os.path.join(full_path, p))]): + order = idx + 1 + ensure_path = os.path.join(full_path, f"{order}.{sub_section_title}") + forth_full_path = os.path.join(full_path, f"{num}.{sub_section_title}") + if ensure_path != forth_full_path: + os.rename(forth_full_path, ensure_path) + if os.path.isdir(ensure_path): + self.ensure_exercises(forth_full_path) tree_path = os.path.join(self.root, "tree.json") dump_json(tree_path, self.tree, exist_ok=True, override=True) return self.tree + def sort_dir_list(self, dirs): + result = [self.extract_node_env(dir) for dir in dirs] + result.sort(key=lambda item: item[0]) + return result + def load_levels(self, root_node): levels = [] for level in os.listdir(self.root): @@ -167,7 +184,7 @@ class TreeWalker: for index, [number, element] in enumerate(children): title = list(element.keys())[0] origin = os.path.join(base, f"{number}.{title}") - posted = os.path.join(base, f"{index+1}.{title}") + posted = os.path.join(base, f"{index + 1}.{title}") if origin != posted: self.logger.info(f"rename [{origin}] to [{posted}]") os.rename(origin, posted) @@ -229,8 +246,8 @@ class TreeWalker: config = { "node_id": self.gen_node_id(), "keywords": [], - "children":[], - "export":[] + "children": [], + "export": [] } dump_json(config_path, config, exist_ok=True, override=True) else: @@ -258,7 +275,8 @@ class TreeWalker: return int(number), title except Exception as error: self.logger.error(f"目录 [{path}] 解析失败,结构不合法,可能是缺少序号") - sys.exit(1) + # sys.exit(1) + raise error def load_chapter_node(self, full_name): config = self.ensure_chapter_config(full_name) @@ -290,8 +308,8 @@ class TreeWalker: config = self.ensure_section_config(section_path) for e in config.get("export", []): full_name = os.path.join(section_path, e) + logger.info(full_name) exercise = load_json(full_name) if "exercise_id" not in exercise: exercise["exercise_id"] = uuid.uuid4().hex - dump_json(full_name, exercise) - + dump_json(full_name, exercise, exist_ok=True, override=True)