# 任务形式

目前，Learning Lab 支持以下 3 种任务形式：

- 单选
- 多选
- 答题

## 单选

要在课程中创建一个单选形式的任务，其格式为：

```bash
step1
    |---choice.md
    |---index.yml
```

其中 `choice.md` 格式为

```md
** 以下哪个不是 Markdown 的优点？**

( ) 专注你的文字内容而不是排版样式，安心写作 {{回答错误}}
( ) 轻松的导出 HTML、PDF 和本身的 .md 文件 {{回答错误}}
( ) 纯文本内容，兼容所有的文本编辑器与字处理软件 {{回答错误}}
( ) 随时修改你的文章版本，不必像字处理软件生成若干文件版本导致混乱 {{回答错误}}
( ) 可读、直观、学习成本低 {{回答错误}}
(x) 有大量的排版、字体设置操作 {{回答正确，Markdown 让我们更专注于文字内容而不是排版样式}}
( ) 相应的工具支持很好 {{回答错误}}

|| Markdown 有着代码语法简单、专注于撰写内容、排版清晰简洁等特点。 ||
```

其中：

- 题目名称，题目名称需由`**` 包裹起来
- 选项，选项需要由 `( ) `开头，如果是正确选项，则需要标记为 `(x) `
- 选项注释，选项注释是当学员在选择对应选项后课程给出的提示信息，需要跟在选项后，并由`{{` 包裹起来
- 提示，提示是当学员在单击题目右侧的 ？时系统给出的提示信息，需要由 `||` 包裹起来

对应 `index.yml` 的配置文件为

```yaml
step2:
  link: '{{chapter_1_issue}}'
#  description: "认识 Markdown"
  transitions:
    events: ['note_events']
    action:
      - type: choice
        with: 001_3_markdown_advantage.md
    to: step3
```

## 多选

要在课程中创建一个多选形式的任务，其格式为：

```bash
step1
    |--- choice.md
    |--- index.yml
```

其中 `choice.md` 格式为

```md
*** Markdown最适合做什么（多选）？**

(x) 写文档 {{正确}}
( ) 写程序 {{回答错误}}
(x) 写博客 {{正确}}
( ) 画图 {{回答错误}}

|| Markdown的设计初衷就是给程序员使用的文档写作工具，因此非常适合用来写文档、写博客。||
```

其中：

- 题目名称，多选的题目名称需由`***`开头，并由 `**` 结尾包裹起来
- 选项，选项需要由 `( ) `开头，如果是正确选项，则需要标记为 `(x) `
- 选项注释，选项注释是当学员在选择对应选项后课程给出的提示信息，需要跟在选项后，并由`{{` 包裹起来
- 提示，提示是当学员在单击题目右侧的 ？时系统给出的提示信息，需要由 `||` 包裹起来

对应 `index.yml` 的配置文件为

```yaml
step4:
  link: '{{chapter_1_issue}}'
#  description: "使用 Markdown 的误区"
  transitions:
    events: ['note_events']
    action:
      - type: choice
        with: 001_5_when_to_use_markdown.md
    to: step5

```

## 答题

答题的任务与单选/多选不同，在做出选择以及提交选项后，系统只会判断是否回答正确，不会进行相应的提示。

> 目前，答题任务在创建时，需要在创建 Issue 时指定 issue_type 为 `exam`

要在课程中创建一个答题形式的任务，其格式为：

```bash
step1
    |--- test.md
    |--- index.yml
    |--- result.yml
```

其中`test.md` 格式为：

```md
### 请完成以下测试，完成后点击提交按钮提交

((((( exam )))))
** 31. int i = 0; System.out.println(i++); 这段Java代码执行的输出结果是？ **

% ( ) A. 0 {{31-A}}
% ( ) B. 1 {{31-B}}
% ( ) C. 2 {{31-C}}
% ( ) D. 3 {{31-D}}

……

** 32. int i = 0; System.out.println(i++); 这段Java代码执行的输出结果是？ **

% ( ) A. 0 {{31-A}}
% ( ) B. 1 {{31-B}}
% ( ) C. 2 {{31-C}}
% ( ) D. 3 {{31-D}}

<<<<< submit >>>>>
((((( exam )))))
```

其中：

- 题目部分由```((((( exam )))))``` 包裹起来
- 每个题目均由 `**` 包裹起来
- 每个单选题的选项由 `% ( ) ` 开头
- 每个多选题的选项由 `% [ ] ` 开头
- 每个选项对应的 id 需要由 `{{题号-id}}`组成，该`id`对应 `result.yml` 中的选项
- `<<<<< submit >>>>>` 为提交按钮

对应的 `index.yml` 配置为：

```yaml
before: 
  link: '{{chapter_5_issue}}'
  transitions:
    events: ['note_events']
    action:
      - type: issue_comment.created
        with: 005_2_exam_question_1.md
    to: step1

step1: 
  link: '{{chapter_5_issue}}'
  description: "Part IV"
  transitions:
    events: ['exam_events']
    action: 
      - type: exam_result
        with: result.yml
      - type: issue_comment.created
        with: 005_3_part_1_end_1.md
    to: step2

step2:
  link: '{{chapter_5_issue}}'
#  description: "完成当前章节学习"
  transitions:
    events: ['close_issue']
    action:
      - type: create_issue
        title: "入学测试(五)"
        csdn_issue_type: 'exam'
        with: 006_1_exam_part_1.md
        store:
          chapter_6_issue: '{{result.data.html_url}}'
      - type: issue_comment.created
        with: 005_4_part_1_end_2.md
    to: end
```

其中：

- step1 是输出考试题目
- step2 是根据 `result.yml`进行结果校验
- step3 是创建考试，注意其中指定了 issue_type 为`exam`，即 `csdn_issue_type: 'exam'`

对应的 `result.yml` 格式为：

```yaml
31: A
32: A,B,C,D
```

其中：

- `31`表示选项对应的序号
- `:` 后面的表示正确选项，如果是多选，则多个正确选项需要由`,`分开