diff --git a/README.md b/README.md index e73dbf4f32d40a97e35be31771f38abfd7df2ed6..04eae5c4f81ec71b45e18fb267cf75f74d133c01 100644 --- a/README.md +++ b/README.md @@ -71,13 +71,27 @@ pip install -r requirement.txt ## `知识节点` 的导出习题选项配置编辑 -首先,在知识节点下增加一个习题代码,例如在 `data/1.web初阶/1.前端基础/1.客户端` 下增加一个`HelloWorld.web`代码: +首先,在知识节点下增加一个习题代码,例如在 `data/1.web初阶/1.前端基础/1.客户端` 下增加一个`HelloWorld.html`代码: ```web -// TODO + + + + just a test + + +

这是一个测试段落。

+ + + + + ``` -其次,增加一个同名的选项配置文件`HelloWorld.json`,目前有两种配置规则 +其次,增加一个同名的选项配置文件`HelloWorld.json`,目前有三种配置规则 **单行替换规则**: @@ -88,7 +102,9 @@ pip install -r requirement.txt ```json { - // TODO + "one_line": { + "document.write": ["document.print", "document.out", "document.printf"] + } } ``` @@ -96,17 +112,59 @@ pip install -r requirement.txt ```html // 变种代码1 -// TODO + + + + just a test + + +

这是一个测试段落。

+ + + + + ``` ```html // 变种代码2 -// TODO + + + + just a test + + +

这是一个测试段落。

+ + + + + ``` ```html // 变种代码3 -// TODO + + + + just a test + + +

这是一个测试段落。

+ + + + + ``` 这些变种代码将会作为技能树该知识点该代码选择题的选项。 @@ -120,7 +178,17 @@ pip install -r requirement.txt ```json { - // TODO + "mulitiline": [{ + " + + + +``` + +```html +// 变种代码2, 注意第2组替换规则,包含了两行替换 + + + + just a test + + +

这是一个测试段落。

+ + + + + +``` + +```html +// 变种代码3 + + + + just a test + + +

这是一个测试段落。

+ + + + + +``` + +## 预制的替换规则 + + * 配置由 `prepared` 字段制定的预制文件数组 + * 数组每一个元素是一个预制的代码文件的路径文件名 + + 例如: + +```json +{ + "prepared": [ + "HelloWord.1.html", + "HelloWord.2.html", + "HelloWord.3.html"] +} +``` + +同样,该配置将支持将源代码生成3个变种代码 + +```html +// HelloWord.1.html + + + just a test + + +

这是一个测试段落。

+ + + document.write(date()); + document.getElementById("test").innerHTML = "你好,csdn!"; + + + + ``` ```html // 变种代码2, 注意第2组替换规则,包含了两行替换 -// TODO + + + + just a test + + +

这是一个测试段落。

+ + + + + ``` ```html // 变种代码3 -// TODO + + + + just a test + + +

这是一个测试段落。

+ + + + + ``` +## 使用 markdown 编写习题 + +如前内容,我们在知识节点下增加一个习题配置,例如在 `data/1.web初阶/1.前端基础/1.客户端` 下增加一个`HelloWorld.json`代码: + +```json +{ + "type": "code_options", + "author": "刘鑫", + "source": "HelloWorld.md", + "exercise_id":"1190bb7834904da0b1f20915960714d5", + "notebook_enable": true +} +``` +其中 type 字段目前都固定是 `code_options`。exercise_id 可以不写,处理程序会自动填补这个数据。根据具体情况写好其它字段,注意这里 source 的文件名,我们指定了一个 markdwon 文件。现在我们新建一个 HelloWorld.md 并编辑为: + +````markdown +# Hello World + + +以下 `Hello World` html代码中,能够正确显示预期内容的是: + +## 答案 + +```html + + + + + just a test + + +

这是一个测试段落。

+ + + + + +``` + +## 选项 + +### A + +```html + + + + just a test + + +

这是一个测试段落。

+ + + document.write(date()); + document.getElementById("test").innerHTML = "你好,csdn!"; + + + + +``` + +### B + +```html + + + + + just a test + + +

这是一个测试段落。

+ + + + + +``` + +### C + +```html + + + + just a test + + +

这是一个测试段落。

+ + + + + + +``` + +```` + +这是一个最基本的习题结构,它包含标题、答案、选项,注意这几个一级和二级标题必须填写正确,解释器会读取这几个标题。而选项的标题会被直接忽略掉,在 +最终生成的习题中不包含选项的三级标题,所以这个标题可以用来标注一些编辑信息,例如“此选项没有关闭文件连接”,“类型错误”等等。 + + +## 增强信息 + +为了编写习题和生成 notebook 的需要,markdown 解释器支持两种模板能力,如果我们在答案之前,有一个名为 aop 的二级标题: + +````markdown + +## aop + +### before + +```html +document.write("do something before"); +``` + +### after + +```html +document.write("do something after"); +``` +```` + +那么在创建notebook的时候,before 会插入到源代码前一个单元,after 则会插入到源代码后。aop 章节可以只包含 before 或 after 中的某一个,也可以两个都有。 + +另一些情况下,我们可能需要把各个选项中重复的代码提取出来,建立一个模板,此时可以在答案之前建立一个名为 template 的二级标题,例如: + +````markdwon + +## template + +```html + + + + just a test + + +// 下面的 code 占位符会被替换成答案和选项代码 +$code + + + +``` + +```` + +注意这里的代码中,有一个 `$code` 占位符,它在管道程序处理过程中,会替换成答案和个选项内容中的代码。 + +在后续的数据处理流程中,markdown 会被编译为 prepared 类型的习题。 + + + ## 技能树合成 在根目录下执行 `python main.py` 会合成技能树文件,合成的技能树文件: `data/tree.json`