diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..cb7465f8291685dea5dab6d68ce5f188529e873a --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +.vscode +.idea +.DS_Store +__pycache__ +*.pyc +*.zip +*.out +bin/ +debug/ +release/ \ No newline at end of file diff --git a/README.md b/README.md index 1c577dbd088eadd3e039e2447f42ca2dc57e2217..f89a8287dc18ceb3ce1ad2097aebbf8cef204b83 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,152 @@ # skill_tree_go -Go æŠ€èƒ½æ ‘ \ No newline at end of file +`Goè¯è¨€æŠ€èƒ½æ ‘`是[技能森林](https://gitcode.net/csdn/skill_tree)的一部分。 + +## 编辑环境åˆå§‹åŒ– + +``` +pip install -r requirements.txt +``` + +## 目录结构说明 +æŠ€èƒ½æ ‘ç¼–è¾‘ä»“åº“çš„ data 目录是主è¦çš„编辑目录,目录的结构是固定的 + +* æŠ€èƒ½æ ‘`骨架文件`: + * ä½ç½®ï¼š`data/tree.json` + * 说明:该文件是执行 `python main.py` 生æˆçš„,请勿人工编辑 +* æŠ€èƒ½æ ‘`æ ¹èŠ‚ç‚¹`é…置文件: + * ä½ç½®ï¼š`data/config.json` + * 说明:å¯ç¼–辑é…置关键è¯ç‰å—æ®µï¼Œå…¶ä¸ `node_id` å—段是生æˆçš„,请勿编辑 +* æŠ€èƒ½æ ‘`难度节点`: + * ä½ç½®ï¼š`data/xxx`,例如: `data/1.Goè¯è¨€åˆé˜¶` + * 说明: + * æ¯ä¸ªæŠ€èƒ½æ ‘有 3 个ç‰çº§ï¼Œç›®å½•å‰çš„åºå·æ˜¯å¿…è¦çš„,用æ¥ä¿æŒæ–‡ä»¶å¤¹ç›®å½•çš„é¡ºåº + * æ¯ä¸ªç›®å½•ä¸‹æœ‰ä¸€ä¸ª `config.json` å¯é…置关键è¯ä¿¡æ¯ï¼Œå…¶ä¸ `node_id` å—段是生æˆçš„,请勿编辑 +* æŠ€èƒ½æ ‘`ç« èŠ‚ç‚¹`: + * ä½ç½®ï¼š`data/xxx/xxx`,例如:`data/1.Goè¯è¨€åˆé˜¶/1.Goè¯è¨€ç®€ä»‹` + * 说明: + * æ¯ä¸ªæŠ€èƒ½æ ‘çš„æ¯ä¸ªéš¾åº¦ç‰çº§æœ‰ n ä¸ªç« èŠ‚ï¼Œç›®å½•å‰çš„åºå·æ˜¯å¿…è¦çš„,用æ¥ä¿æŒæ–‡ä»¶å¤¹ç›®å½•çš„é¡ºåº + * æ¯ä¸ªç›®å½•ä¸‹æœ‰ä¸€ä¸ª `config.json` å¯é…置关键è¯ä¿¡æ¯ï¼Œå…¶ä¸ `node_id` å—段是生æˆçš„,请勿编辑 +* æŠ€èƒ½æ ‘`知识节点`: + * ä½ç½®ï¼š`data/xxx/xxx`,例如:`data/1.Goè¯è¨€åˆé˜¶/1.Goè¯è¨€ç®€ä»‹` + * 说明: + * æ¯ä¸ªæŠ€èƒ½æ ‘çš„æ¯ç« 有 n 个知识节点,目录å‰çš„åºå·æ˜¯å¿…è¦çš„,用æ¥ä¿æŒæ–‡ä»¶å¤¹ç›®å½•çš„é¡ºåº + * æ¯ä¸ªç›®å½•ä¸‹æœ‰ä¸€ä¸ª `config.json` + * å…¶ä¸ `node_id` å—段是生æˆçš„,请勿编辑 + * å…¶ä¸ `keywords` å¯é…置关键å—å—段 + * å…¶ä¸ `children` å¯é…置该`知识节点`下的åæ ‘ç»“æž„ä¿¡æ¯ï¼Œå‚考åŽé¢æè¿° + * å…¶ä¸ `export` å¯é…置该`知识节点`ä¸‹çš„å¯¼å‡ºä¹ é¢˜ä¿¡æ¯ï¼Œå‚考åŽé¢æè¿° + +## `知识节点` åæ ‘ä¿¡æ¯ç»“æž„ + +例如 `data/1.Goè¯è¨€åˆé˜¶/1.Goè¯è¨€ç®€ä»‹/1.HelloWorld/config.json` 里é…置对该知识节点åæ ‘ä¿¡æ¯ç»“构,这个é…置是å¯é€‰çš„: +```json +{ + // ... + + "children": [ + { + "XXå¼€å‘入门": { + "keywords": [ + "XXå¼€å‘", + ], + "children": [], + "keywords_must": [ + "XX" + ], + "keywords_forbid": [] + } + } + ], +} +``` + +## `知识节点` çš„å¯¼å‡ºä¹ é¢˜ç¼–è¾‘ + +例如 `data/1.Goè¯è¨€åˆé˜¶/1.Goè¯è¨€ç®€ä»‹/1.HelloWorld/config.json` 里é…ç½®å¯¹è¯¥çŸ¥è¯†èŠ‚ç‚¹å¯¼å‡ºçš„ä¹ é¢˜ + +```json +{ + // ... + "export": [ + "helloworld.json" + ] +} +``` + +helloworld.json çš„æ ¼å¼å¦‚下: +```bash +{ + "type": "code_options", + "author": "xxx", + "source": "helloworld.md", + "notebook_enable": false, + "exercise_id": "xxx" +} +``` + +å…¶ä¸ +* "type": "code_options" 表示是一个选择题 +* "author" å¯ä»¥æ”¾ä½œè€…çš„ CSDN id, +* "source" 指å‘äº†ä¹ é¢˜ MarkDown文件 +* "notebook_enable" ç›®å‰éƒ½æ˜¯false +* "exercise_id" 是工具生æˆçš„,ä¸å¡« + + +ä¹ é¢˜æ ¼å¼æ¨¡ç‰ˆå¦‚下: + +````mardown +# {æ ‡é¢˜} + +{ä¹ é¢˜æè¿°} + +以下关于上述游æˆä»£ç 说法[æ£ç¡®/错误]的是? + +## ç”案 + +{ç›®æ ‡é€‰é¡¹} + +## 选项 + +### A + +{混淆选项1} + +### B + +{混淆选项2} + +### C + +{混淆选项3} + +```` + +## æŠ€èƒ½æ ‘åˆæˆ + +åœ¨æ ¹ç›®å½•ä¸‹æ‰§è¡Œ `python main.py` 会åˆæˆæŠ€èƒ½æ ‘文件,åˆæˆçš„æŠ€èƒ½æ ‘æ–‡ä»¶: `data/tree.json` +* åˆæˆè¿‡ç¨‹ä¸ï¼Œä¼šè‡ªåŠ¨æ£€æŸ¥æ¯ä¸ªç›®å½•ä¸‹ `config.json` 里的 `node_id` 是å¦å˜åœ¨ï¼Œä¸å˜åœ¨åˆ™ç”Ÿæˆ +* åˆæˆè¿‡ç¨‹ä¸ï¼Œä¼šè‡ªåŠ¨æ£€æŸ¥æ¯ä¸ªçŸ¥è¯†ç‚¹ç›®å½•ä¸‹ `config.json` 里的 `export` é‡Œå¯¼å‡ºçš„ä¹ é¢˜é…置,检查是å¦å˜åœ¨`exercise_id` å—段,如果ä¸å˜åœ¨åˆ™ç”Ÿæˆ +* 在 节 ç›®å½•ä¸‹æ ¹æ®éœ€è¦ï¼Œå¯ä»¥æ·»åŠ 一些å目录用æ¥æµ‹è¯•ä»£ç 。 +* 开始游æˆå…¥é—¨æŠ€èƒ½æ ‘构建之旅,GoodLuck! + +## FAQ + +**难度目录是固定的么?** + +1. data/xxx 目录下的å目录是固定的åˆ/ä¸/高三个难度ç‰çº§ç›®å½• + +**å¦‚ä½•å¢žåŠ ç« ç›®å½•ï¼Ÿ** + +1. 在VSCode里打开项目仓库 +2. 在对应的难度ç‰çº§ç›®å½•æ–°å»ºç« 目录,例如在 data/1.xxxåˆé˜¶/ ä¸‹æ–°å»ºç« æ–‡ä»¶å¤¹ï¼Œdata/1.xxxåˆé˜¶/1.yyy +3. åœ¨é¡¹ç›®æ ¹ç›®å½•ä¸‹æ‰§è¡Œ python main.py 脚本,会自动生æˆç« çš„é…置文件 data/1.xxxåˆé˜¶/1.yyy/config.json + +**å¦‚ä½•å¢žåŠ èŠ‚ç›®å½•?**: +1. 直接在VSCode里创建文件夹,例如 "data/1.xxxåˆé˜¶/1.yyy/2.zzz" +2. é¡¹ç›®æ ¹ç›®å½•ä¸‹æ‰§è¡Œ python main.py 会自动为新增节创建é…置文件 data/1.xxxåˆé˜¶/1.yyy/2.zzz/config.json + +**å¦‚ä½•åœ¨èŠ‚ä¸‹æ–°å¢žä¸€ä¸ªä¹ é¢˜**: +3. 在"data/1.xxxåˆé˜¶/1.yyy/2.zzz" ç›®å½•ä¸‹æ·»åŠ ä¸€ä¸ª markdown 文件编辑,例如 yyy.mdï¼ŒæŒ‰ç…§ä¹ é¢˜markdownæ ¼å¼ç¼–è¾‘ä¹ é¢˜ã€‚ +4. md编辑完åŽï¼Œå¯ä»¥å†æ¬¡æ‰§è¡Œ python main.py 会自动生æˆåŒåçš„ yyy.json,并将 yyy.json æ·»åŠ åˆ°config.json çš„export数组里。 +5. yyy.json里的authorä¿¡æ¯æ”¾ä½œè€… CSDN ID。 \ No newline at end of file diff --git "a/data/1.Go\350\257\255\350\250\200\345\210\235\351\230\266/1.Go\350\257\255\350\250\200\345\205\245\351\227\250/1.HelloWorld/config.json" "b/data/1.Go\350\257\255\350\250\200\345\210\235\351\230\266/1.Go\350\257\255\350\250\200\345\205\245\351\227\250/1.HelloWorld/config.json" new file mode 100644 index 0000000000000000000000000000000000000000..bc9700047b79c69170180ad094260acca58abe54 --- /dev/null +++ "b/data/1.Go\350\257\255\350\250\200\345\210\235\351\230\266/1.Go\350\257\255\350\250\200\345\205\245\351\227\250/1.HelloWorld/config.json" @@ -0,0 +1,11 @@ +{ + "node_id": "go-e703e0c6253d4c4d99f6ddaa139ddd6d", + "keywords": [], + "children": [], + "export": [ + "helloworld.json" + ], + "keywords_must": [], + "keywords_forbid": [], + "group": 0 +} \ No newline at end of file diff --git "a/data/1.Go\350\257\255\350\250\200\345\210\235\351\230\266/1.Go\350\257\255\350\250\200\345\205\245\351\227\250/1.HelloWorld/helloworld.json" "b/data/1.Go\350\257\255\350\250\200\345\210\235\351\230\266/1.Go\350\257\255\350\250\200\345\205\245\351\227\250/1.HelloWorld/helloworld.json" new file mode 100644 index 0000000000000000000000000000000000000000..1da309100c3a285b649a0e09876aa524b82c0025 --- /dev/null +++ "b/data/1.Go\350\257\255\350\250\200\345\210\235\351\230\266/1.Go\350\257\255\350\250\200\345\205\245\351\227\250/1.HelloWorld/helloworld.json" @@ -0,0 +1,7 @@ +{ + "type": "code_options", + "author": null, + "source": "helloworld.md", + "notebook_enable": false, + "exercise_id": "4bc685eb97b042a196a815d97c40ff83" +} \ No newline at end of file diff --git "a/data/1.Go\350\257\255\350\250\200\345\210\235\351\230\266/1.Go\350\257\255\350\250\200\345\205\245\351\227\250/1.HelloWorld/helloworld.md" "b/data/1.Go\350\257\255\350\250\200\345\210\235\351\230\266/1.Go\350\257\255\350\250\200\345\205\245\351\227\250/1.HelloWorld/helloworld.md" new file mode 100644 index 0000000000000000000000000000000000000000..a447c184c7aaa9ee5f088c42158140caf4682c08 --- /dev/null +++ "b/data/1.Go\350\257\255\350\250\200\345\210\235\351\230\266/1.Go\350\257\255\350\250\200\345\205\245\351\227\250/1.HelloWorld/helloworld.md" @@ -0,0 +1,21 @@ +# {在æ¤å¡«å†™æ ‡é¢˜} + +{在æ¤å¡«å†™é¢˜ç›®æè¿°} + +## ç”案 + +{在æ¤å¡«å†™ç”案} + +## 选项 + +### A + +{在æ¤å¡«å†™é€‰é¡¹A} + +### B + +{在æ¤å¡«å†™é€‰é¡¹B} + +### C + +{在æ¤å¡«å†™é€‰é¡¹C} diff --git "a/data/1.Go\350\257\255\350\250\200\345\210\235\351\230\266/1.Go\350\257\255\350\250\200\345\205\245\351\227\250/config.json" "b/data/1.Go\350\257\255\350\250\200\345\210\235\351\230\266/1.Go\350\257\255\350\250\200\345\205\245\351\227\250/config.json" new file mode 100644 index 0000000000000000000000000000000000000000..dbf7fb7ee7170c03c7b5814eb508ff5f4910a1b6 --- /dev/null +++ "b/data/1.Go\350\257\255\350\250\200\345\210\235\351\230\266/1.Go\350\257\255\350\250\200\345\205\245\351\227\250/config.json" @@ -0,0 +1,7 @@ +{ + "node_id": "go-c6038f5c04c74b47854eea94c9d90b0e", + "keywords": [], + "keywords_must": [], + "keywords_forbid": [], + "group": 0 +} \ No newline at end of file diff --git "a/data/1.Go\350\257\255\350\250\200\345\210\235\351\230\266/config.json" "b/data/1.Go\350\257\255\350\250\200\345\210\235\351\230\266/config.json" new file mode 100644 index 0000000000000000000000000000000000000000..2e55576e1904c7e245819572193ccbc8e63a3565 --- /dev/null +++ "b/data/1.Go\350\257\255\350\250\200\345\210\235\351\230\266/config.json" @@ -0,0 +1,7 @@ +{ + "node_id": "go-2bf9c4df33054b06b4396b5f2d611134", + "keywords": [], + "keywords_must": [], + "keywords_forbid": [], + "group": 0 +} \ No newline at end of file diff --git "a/data/2.Go\350\257\255\350\250\200\344\270\255\351\230\266/config.json" "b/data/2.Go\350\257\255\350\250\200\344\270\255\351\230\266/config.json" new file mode 100644 index 0000000000000000000000000000000000000000..49e710a978d3902e2d5902d09f0c57e083c39802 --- /dev/null +++ "b/data/2.Go\350\257\255\350\250\200\344\270\255\351\230\266/config.json" @@ -0,0 +1,7 @@ +{ + "node_id": "go-5c91f7058d064bdb8b5e31911ded197f", + "keywords": [], + "keywords_must": [], + "keywords_forbid": [], + "group": 0 +} \ No newline at end of file diff --git "a/data/3.Go\350\257\255\350\250\200\351\253\230\351\230\266/config.json" "b/data/3.Go\350\257\255\350\250\200\351\253\230\351\230\266/config.json" new file mode 100644 index 0000000000000000000000000000000000000000..5cd1f846c378863a3f9b30fa2f6d31e2d84fcb36 --- /dev/null +++ "b/data/3.Go\350\257\255\350\250\200\351\253\230\351\230\266/config.json" @@ -0,0 +1,7 @@ +{ + "node_id": "go-23102d3a58ab448886569ff334f5561e", + "keywords": [], + "keywords_must": [], + "keywords_forbid": [], + "group": 0 +} \ No newline at end of file diff --git a/data/config.json b/data/config.json new file mode 100644 index 0000000000000000000000000000000000000000..c0abbca05181f325a95a8716a8910568aceb4d73 --- /dev/null +++ b/data/config.json @@ -0,0 +1,8 @@ +{ + "tree_name": "go", + "keywords": [], + "node_id": "go-049bed572e9f476a8ca281163c820b56", + "keywords_must": [], + "keywords_forbid": [], + "group": 0 +} \ No newline at end of file diff --git a/data/tree.json b/data/tree.json new file mode 100644 index 0000000000000000000000000000000000000000..2bd9cb24a9075d0482321d76fc47187b9c889513 --- /dev/null +++ b/data/tree.json @@ -0,0 +1,63 @@ +{ + "go": { + "node_id": "go-049bed572e9f476a8ca281163c820b56", + "keywords": [], + "children": [ + { + "Goè¯è¨€åˆé˜¶": { + "node_id": "go-2bf9c4df33054b06b4396b5f2d611134", + "keywords": [], + "children": [ + { + "Goè¯è¨€å…¥é—¨": { + "node_id": "go-c6038f5c04c74b47854eea94c9d90b0e", + "keywords": [], + "children": [ + { + "HelloWorld": { + "node_id": "go-e703e0c6253d4c4d99f6ddaa139ddd6d", + "keywords": [], + "children": [], + "keywords_must": [], + "keywords_forbid": [], + "group": 0 + } + } + ], + "keywords_must": [], + "keywords_forbid": [], + "group": 0 + } + } + ], + "keywords_must": [], + "keywords_forbid": [], + "group": 0 + } + }, + { + "Goè¯è¨€ä¸é˜¶": { + "node_id": "go-5c91f7058d064bdb8b5e31911ded197f", + "keywords": [], + "children": [], + "keywords_must": [], + "keywords_forbid": [], + "group": 0 + } + }, + { + "Goè¯è¨€é«˜é˜¶": { + "node_id": "go-23102d3a58ab448886569ff334f5561e", + "keywords": [], + "children": [], + "keywords_must": [], + "keywords_forbid": [], + "group": 0 + } + } + ], + "keywords_must": [], + "keywords_forbid": [], + "group": 0 + } +} \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000000000000000000000000000000000000..b99d065d1dd4982fc12f0b5d679fd27ace63b472 --- /dev/null +++ b/main.py @@ -0,0 +1,5 @@ +from skill_tree.tree import TreeWalker + +if __name__ == '__main__': + walker = TreeWalker("data", "go", "Goè¯è¨€", ignore_keywords=True) + walker.walk() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..0abd88a12cb668d836c3bb780e4e88573f4d1d81 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +.pre_commit +skill-tree-parser \ No newline at end of file