提交 f40fac90 编写于 作者: F feilong

添加 init 方法

上级 2f84db1a
......@@ -471,3 +471,186 @@ class TreeWalker:
if not config.get("keywords", []):
self.logger.error(f"节点 [{full_path}] 的关键字为空,请修改配置文件写入关键字")
sys.exit(1)
def init(self):
data_root = 'data'
os.makedirs(data_root, exist_ok=True)
node_dirs = [
os.path.join(data_root, f'1.{self.title}初阶'),
os.path.join(data_root, f'2.{self.title}中阶'),
os.path.join(data_root, f'3.{self.title}高阶'),
os.path.join(data_root, f'1.{self.title}初阶',
f"1.{self.title}入门", f"1.HelloWorld"),
]
for node_dir in node_dirs:
os.makedirs(node_dir, exist_ok=True)
md = []
emit_head(md)
emit_answer(md, None)
emit_options(md, None)
simple_list_md_dump(os.path.join(
node_dirs[len(node_dirs)-1], 'helloworld.md'), md)
self.walk()
self.init_readme()
with open('.gitignore', 'w', encoding='utf-8') as f:
f.write('\n'.join([
".vscode",
".idea",
".DS_Store",
"__pycache__",
"*.pyc",
"*.zip",
"*.out",
"bin/",
"debug/",
"release/",
]))
with open('requirements.txt', 'w', encoding='utf-8') as f:
f.write('\n'.join([
".pre_commit",
"skill-tree-parser",
]))
def init_readme(self):
md = [
f'# skill_tree_{self.name}',
f'',
f'`{self.title}技能树`是[技能森林](https://gitcode.net/csdn/skill_tree)的一部分。',
f'',
f'## 编辑环境初始化',
f'',
f'```',
f'pip install -r requirements.txt',
f'```',
f'',
f'## 目录结构说明',
f'技能树编辑仓库的 data 目录是主要的编辑目录,目录的结构是固定的',
f'',
f'* 技能树`骨架文件`:',
f' * 位置:`data/tree.json`',
f' * 说明:该文件是执行 `python main.py` 生成的,请勿人工编辑',
f'* 技能树`根节点`配置文件:',
f' * 位置:`data/config.json`',
f' * 说明:可编辑配置关键词等字段,其中 `node_id` 字段是生成的,请勿编辑',
f'* 技能树`难度节点`:',
f' * 位置:`data/xxx`,例如: `data/1.{self.title}初阶`',
f' * 说明:',
f' * 每个技能树有 3 个等级,目录前的序号是必要的,用来保持文件夹目录的顺序',
f' * 每个目录下有一个 `config.json` 可配置关键词信息,其中 `node_id` 字段是生成的,请勿编辑',
f'* 技能树`章节点`:',
f' * 位置:`data/xxx/xxx`,例如:`data/1.{self.title}初阶/1.{self.title}简介`',
f' * 说明:',
f' * 每个技能树的每个难度等级有 n 个章节,目录前的序号是必要的,用来保持文件夹目录的顺序',
f' * 每个目录下有一个 `config.json` 可配置关键词信息,其中 `node_id` 字段是生成的,请勿编辑',
f'* 技能树`知识节点`:',
f' * 位置:`data/xxx/xxx`,例如:`data/1.{self.title}初阶/1.{self.title}简介`',
f' * 说明:',
f' * 每个技能树的每章有 n 个知识节点,目录前的序号是必要的,用来保持文件夹目录的顺序',
f' * 每个目录下有一个 `config.json`',
f' * 其中 `node_id` 字段是生成的,请勿编辑',
f' * 其中 `keywords` 可配置关键字字段',
f' * 其中 `children` 可配置该`知识节点`下的子树结构信息,参考后面描述',
f' * 其中 `export` 可配置该`知识节点`下的导出习题信息,参考后面描述',
f'',
f'## `知识节点` 子树信息结构',
f'',
f'例如 `data/1.{self.title}初阶/1.{self.title}简介/1.HelloWorld/config.json` 里配置对该知识节点子树信息结构,这个配置是可选的:',
f'```json',
f'{{',
f' // ...',
f'',
f' "children": [',
f' {{',
f' "XX开发入门": {{',
f' "keywords": [',
f' "XX开发",',
f' ],',
f' "children": [],',
f' "keywords_must": [',
f' "XX"',
f' ],',
f' "keywords_forbid": []',
f' }}',
f' }}',
f' ],',
f'}}',
f'```',
f'',
f'## `知识节点` 的导出习题编辑',
f'',
f'例如 `data/1.{self.title}初阶/1.{self.title}简介/1.HelloWorld/config.json` 里配置对该知识节点导出的习题',
f'',
f'```json',
f'{{',
f' // ...',
f' "export": [',
f' "helloworld.json"',
f' ]',
f'}}',
f'```',
f'',
f'helloworld.json 的格式如下:',
f'```bash',
f'{{',
f' "type": "code_options",',
f' "author": "xxx",',
f' "source": "helloworld.md",',
f' "notebook_enable": false,',
f' "exercise_id": "xxx"',
f'}}',
f'```',
f'',
f'其中 ',
f'* "type": "code_options" 表示是一个选择题',
f'* "author" 可以放作者的 CSDN id,',
f'* "source" 指向了习题 MarkDown文件',
f'* "notebook_enable" 目前都是false',
f'* "exercise_id" 是工具生成的,不填',
f'',
f'',
f'习题格式模版如下:',
f'',
f'````mardown',
f'# {{标题}}',
f'',
f'{{习题描述}}',
f'',
f'以下关于上述游戏代码说法[正确/错误]的是?',
f'',
f'## 答案',
f'',
f'{{目标选项}}',
f'',
f'## 选项',
f'',
f'### A',
f'',
f'{{混淆选项1}}',
f'',
f'### B',
f'',
f'{{混淆选项2}}',
f'',
f'### C',
f'',
f'{{混淆选项3}}',
f'',
f'````',
f'',
f'## 技能树合成',
f'',
f'在根目录下执行 `python main.py` 会合成技能树文件,合成的技能树文件: `data/tree.json`',
f'* 合成过程中,会自动检查每个目录下 `config.json` 里的 `node_id` 是否存在,不存在则生成',
f'* 合成过程中,会自动检查每个知识点目录下 `config.json` 里的 `export` 里导出的习题配置,检查是否存在`exercise_id` 字段,如果不存在则生成',
f'* 在 节 目录下根据需要,可以添加一些子目录用来测试代码。',
f'* 开始游戏入门技能树构建之旅,GoodLuck! ',
]
simple_list_md_dump('README.md', md)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册