From 9e7c4030651625d6eb893c3fa1b08d04abb52c7f Mon Sep 17 00:00:00 2001
From: feilong <fanfeilong@outlook.com>
Date: Thu, 24 Feb 2022 20:48:12 +0800
Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96reademe?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 README.md                                     | 146 +++++++++++++++++-
 .../1.HelloOO/config.json"                    |   2 +-
 .../1.HelloOO/helloworld.json"                |   2 +-
 .../1.HelloOO/helloworld.md"                  |   0
 .../config.json"                              |   0
 5 files changed, 147 insertions(+), 3 deletions(-)
 rename "data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.OO\345\210\235\346\255\245/1.HelloOO/config.json" => "data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\237\272\347\241\200/1.HelloOO/config.json" (87%)
 rename "data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.OO\345\210\235\346\255\245/1.HelloOO/hello.json" => "data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\237\272\347\241\200/1.HelloOO/helloworld.json" (87%)
 rename "data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.OO\345\210\235\346\255\245/1.HelloOO/hello.md" => "data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\237\272\347\241\200/1.HelloOO/helloworld.md" (100%)
 rename "data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.OO\345\210\235\346\255\245/config.json" => "data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\237\272\347\241\200/config.json" (100%)

diff --git a/README.md b/README.md
index def1d6a..4360d80 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,147 @@
 # skill_tree_oo
 
-面向对象程序设计技能树
+`面向对象程序设计技能树` 是[技能森林](https://gitcode.net/csdn/skill_tree)的一部分。
+
+## 目录结构说明
+
+* 技能树`骨架文件`:
+  * 位置:`data/tree.json`
+  * 说明:该文件是执行 `python main.py` 生成的,请勿人工编辑
+* 技能树`根节点`配置文件:
+  * 位置:`data/config.json`
+  * 说明:可编辑配置关键词等字段,其中 `node_id` 字段是生成的,请勿编辑
+* 技能树`难度节点`:
+  * 位置:`data/xxx`,例如: `data/1.面向对象程序设计初阶`
+  * 说明:
+    * 每个技能树有 3 个等级,目录前的序号是必要的,用来保持文件夹目录的顺序
+    * 每个目录下有一个 `config.json` 可配置关键词信息,其中 `node_id` 字段是生成的,请勿编辑
+* 技能树`章节点`:
+  * 位置:`data/xxx/xxx`,例如:`data/1.面向对象程序设计初阶/1.面向对象程序设计基础`
+  * 说明:
+    * 每个技能树的每个难度等级有 n 个章节,目录前的序号是必要的,用来保持文件夹目录的顺序
+    * 每个目录下有一个 `config.json` 可配置关键词信息,其中 `node_id` 字段是生成的,请勿编辑
+* 技能树`知识节点`:
+  * 位置:`data/xxx/xxx/xxx`,例如:`data/1.面向对象程序设计初阶/1.面向对象程序设计基础/1.HelloOO`
+  * 说明:
+    * 每个技能树的每章有 `n` 个知识节点,目录前的序号是必要的,用来保持文件夹目录的顺序
+    * 每个目录下有一个 `config.json`
+      * 其中 `node_id` 字段是生成的,请勿编辑
+      * 其中 `keywords` 可配置关键字字段
+      * 其中 `children` 可配置该`知识节点`下的子树结构信息,参考后面描述
+      * 其中 `export` 可配置该`知识节点`下的导出习题信息,参考后面描述
+
+## `知识节点` 子树信息结构
+
+例如 `data/1.面向对象程序设计初阶/1.面向对象程序设计基础/1.HelloOO/config.json` 里配置对该知识节点子树信息结构:
+
+```json
+{
+  // ...
+
+  "children": [
+    // TODO ...
+  ],
+}
+```
+
+## `知识节点` 的导出习题编辑
+
+例如 `data/1.面向对象程序设计初阶/1.面向对象程序设计基础/1.HelloOO/config.json` 里配置对该知识节点导出的习题
+
+```json
+{
+  // ...
+  "export": [
+    "helloworld.json"
+  ]
+}
+```
+
+在 export 字段中,我们列出习题定义 json ,下面我们了解如何编写习题。
+
+## `知识节点` 的导出习题选项配置编辑
+
+目前我们支持使用 markdown 语法直接编辑习题和各选项。
+
+如前文内容,我们在知识节点下增加习题 `helloworld`的定义文件,即在`data/1.面向对象程序设计初阶/1.面向对象程序设计基础/1.HelloOO` 目录增加一个`helloworld.json`文件:
+
+```json
+{
+  "type": "code_options",
+  "author": "xxx",
+  "source": "helloworld.md",
+  "notebook_enable": false
+}
+```
+
+其中 type 字段目前都固定是 `code_options`,`notebook_enable` 字段决定这个习题是否生成对应的 `notebook` ,可以默认设置为false。根据具体情况写好其它字段,注意这里 `source` 的文件名,我们指定了一个 markdwon 文件。现在我们新建一个 `helloworld.md` 并编辑为:
+
+````markdown
+# Hello OO
+
+以下哪个是面向对象程序代码
+
+## 答案
+
+```cpp
+// C++
+class Object{
+    Object(){}
+    ~Object(){}
+    void test(){
+        std::cout<<"hello"<<std::endle;
+    }
+}
+
+int main(){
+    Object* o = new Object();
+    delete o;
+    return 0;
+}
+```
+
+## 选项
+
+### A
+
+```javascript
+var foo = function(){
+    return {
+
+    }
+}
+```
+
+### B
+
+```python
+def object():
+    return {}
+
+o = object()
+```
+
+### C
+
+```c
+int test(){
+    
+}
+
+int main(){
+    test();
+    return 0;
+}
+```
+
+````
+
+这是一个最基本的习题结构,它包含标题、答案、选项,注意这几个一级和二级标题必须填写正确,解释器会读取这几个标题。而选项的标题会被直接忽略掉,在
+最终生成的习题中不包含选项的三级标题,所以这个标题可以用来标注一些编辑信息,例如“此选项没有关闭文件连接”,“类型错误”等等。
+
+## 技能树合成
+
+在根目录下执行 `python main.py` 会合成技能树文件,合成的技能树文件: `data/tree.json`
+
+* 合成过程中,会自动检查每个目录下 `config.json` 里的 `node_id` 是否存在,不存在则生成
+* 合成过程中,会自动检查每个知识点目录下 `config.json` 里的 `export` 里导出的习题配置,检查是否存在`exercise_id` 字段,如果不存在则生成
diff --git "a/data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.OO\345\210\235\346\255\245/1.HelloOO/config.json" "b/data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\237\272\347\241\200/1.HelloOO/config.json"
similarity index 87%
rename from "data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.OO\345\210\235\346\255\245/1.HelloOO/config.json"
rename to "data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\237\272\347\241\200/1.HelloOO/config.json"
index 8fb0922..1649183 100644
--- "a/data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.OO\345\210\235\346\255\245/1.HelloOO/config.json"
+++ "b/data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\237\272\347\241\200/1.HelloOO/config.json"
@@ -3,7 +3,7 @@
   "keywords": [],
   "children": [],
   "export": [
-    "hello.json"
+    "helloworld.json"
   ],
   "keywords_must": [],
   "keywords_forbid": []
diff --git "a/data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.OO\345\210\235\346\255\245/1.HelloOO/hello.json" "b/data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\237\272\347\241\200/1.HelloOO/helloworld.json"
similarity index 87%
rename from "data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.OO\345\210\235\346\255\245/1.HelloOO/hello.json"
rename to "data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\237\272\347\241\200/1.HelloOO/helloworld.json"
index 26ddf9e..bef340d 100644
--- "a/data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.OO\345\210\235\346\255\245/1.HelloOO/hello.json"
+++ "b/data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\237\272\347\241\200/1.HelloOO/helloworld.json"
@@ -1,6 +1,6 @@
 {
   "type": "code_options",
-  "author": null,
+  "author": "",
   "source": "hello.md",
   "notebook_enable": false,
   "exercise_id": "d4e2302f452541b99f140996252d91a8"
diff --git "a/data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.OO\345\210\235\346\255\245/1.HelloOO/hello.md" "b/data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\237\272\347\241\200/1.HelloOO/helloworld.md"
similarity index 100%
rename from "data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.OO\345\210\235\346\255\245/1.HelloOO/hello.md"
rename to "data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\237\272\347\241\200/1.HelloOO/helloworld.md"
diff --git "a/data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.OO\345\210\235\346\255\245/config.json" "b/data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\237\272\347\241\200/config.json"
similarity index 100%
rename from "data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.OO\345\210\235\346\255\245/config.json"
rename to "data/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\210\235\351\230\266/1.\351\235\242\345\220\221\345\257\271\350\261\241\347\250\213\345\272\217\350\256\276\350\256\241\345\237\272\347\241\200/config.json"
-- 
GitLab