# DSL 语法参考

使用 `wjx survey create-by-text --text "<DSL文本>"` 通过人类可读的文本格式创建问卷。

## 基本结构

```
问卷标题

可选的问卷描述（第一题前的空行后文本）

1. 题目文本[题型标签]
选项A
选项B

2. 另一个题目[题型标签]
选项C
选项D
```

**规则：**
- 第一行 = 问卷标题
- 第一题前的空行后文本 = 描述（可选）
- 题目之间用空行分隔
- 题号格式：`数字. 题目文本[标签]`
- 选填题：在标签后加 `（选填）`（**注意：必须用中文全角括号**）
- 仅支持方括号 `[...]` 包裹标签

## 题型标签

> **重要：DSL 解析器仅支持中文标签**，不支持英文标签。

### 选择类

| 标签 | 说明 | 别名 |
|------|------|------|
| `[单选题]` | 单选（默认题型，标签可省略） | — |
| `[下拉框]` | 下拉单选 | `[下拉单选]` |
| `[多选题]` | 多选 | — |
| `[判断题]` | 判断对错 | — |
| `[排序题]` | 拖拽排序选项 | — |

### 量表评分类

| 标签 | 说明 |
|------|------|
| `[量表题]` | 量表评分（选项用 `最小值~最大值` 格式，如 `1~5`，**必须使用半角波浪号 `~`**） |
| `[评分单选]` | 带评分的单选 |
| `[评分多选]` | 带评分的多选 |
| `[比重题]` | 百分比权重分配 |
| `[滑动条]` | 滑动条控件 |

### 填空类

| 标签 | 说明 | 别名 |
|------|------|------|
| `[填空题]` | 单个文本输入 | `[简答题]`、`[问答题]` |
| `[多项填空题]` | 多个填空。题目中**必须**包含 `{_}` 占位符 | — |
| `[考试多项填空]` | 考试版多项填空。题目中**必须**包含 `{_}` 占位符 | — |
| `[考试完形填空]` | 考试完形填空。题目中**必须**包含 `{_}` 占位符 | `[完形填空]` |

### 矩阵类

| 标签 | 说明 |
|------|------|
| `[矩阵题]` | 通用矩阵 |
| `[矩阵量表题]` | 矩阵 + 量表评分 |
| `[矩阵单选题]` | 矩阵 + 每行单选 |
| `[矩阵多选题]` | 矩阵 + 每行多选 |
| `[矩阵填空题]` | 矩阵 + 每行填空 |

### 其他类型

| 标签 | 说明 |
|------|------|
| `[文件上传]` | 文件上传字段 |
| `[绘图题]` | 绘图/签名 |
| `[段落说明]` | 说明文字（无题号）。**注意**：DSL 解析后会被自动过滤，不会出现在创建的问卷中（API 不支持段落类型） |
| `[多级下拉题]` | 级联下拉 |
| `[商品题]` | 商品选择 |
| `[情景题]` | 情景选择 |

## 矩阵题格式

矩阵题需要定义行（评价维度）。列可以用 `最小值~最大值` 简写，也可以用 `列：` 显式定义列标签。

### 简写格式（量表评分）

```
4. 请评价各维度[矩阵量表题]
行：
- 沟通能力
- 团队协作
- 管理水平

1~5
```

### 显式列定义

```
4. 请评价各维度[矩阵量表题]
行：
- 沟通能力
- 团队协作
- 管理水平
列：
- 非常不满意
- 不满意
- 一般
- 满意
- 非常满意
```

## 示例

### 客户满意度调查

```
客户满意度调查

请对我们的服务进行评价。

1. 总体满意度[下拉框]
非常满意
满意
一般
不满意

2. 工作环境评分[量表题]
1~5

3. 最看重的福利[多选题]
薪资
假期
培训
健康保险

4. 您的建议[填空题]（选填）
```

### 英语考试（使用 --type 6）

```
英语期中考试

请认真作答。

1. "go"的过去式是什么？[单选题]
Went
Gone
Going
Goed

2. 以下哪些是正确的英语句子？[多选题]
She is a student.
He go to school.
They are playing.
I has a book.

3. "太阳从西边升起"这句话是正确的。[判断题]
正确
错误

4. 请完成句子：She {_} to school every day.[填空题]

5. 填空：The {_} sat on the {_}.[考试多项填空]
```

创建命令：`wjx survey create-by-text --text "<上述文本>" --type 6`

## 投票问卷

投票问卷使用 `--type 3`，题目仍然使用普通题型标签：

```
最佳员工投票

请投出您的一票。

1. 最佳个人奖[单选题]
张三
李四
王五

2. 最佳团队（可多选）[多选题]
技术团队
设计团队
运营团队
```

命令：`wjx survey create-by-text --text "<上述文本>" --type 3`

**注意**：投票问卷的题目就是普通 `[单选题]`/`[多选题]`，不存在 `[投票单选题]` 标签。`--type 3` 控制问卷展示为投票样式，题型本身不变。

## 不支持的题型

以下题型**无法通过 DSL/API 创建**，遇到时应告知用户并建议替代方案：

| 题型 | 状态 | 替代方案 |
|------|------|---------|
| 签名题 | 不支持 | 用 `[绘图题]` 近似替代 |
| 地区题/省市区选择 | 不支持 | 用 `[多级下拉题]` 或网页端手动添加 |
| NPS 专用题 | 不支持 | 用 `[量表题]` + `0~10` 实现相同效果 |
| 自动每题一页 | 不支持 | 用 `=== 分页 ===` 在每题间手动分页 |
| 段落说明 | DSL 解析后被过滤 | API 不支持段落类型，内容不会出现在问卷中 |

## 限制

DSL 格式**不支持**以下功能：
- 分支逻辑（跳题规则）
- 验证规则（正则、长度限制）
- 评分权重
- 随机化设置

这些功能需要使用 JSONL 格式通过 `wjx survey create-by-json --file <jsonl>` 创建（覆盖 70+ 题型）。老命令 `wjx survey create --questions <json>` 仅向后兼容。详见 [survey-commands.md](survey-commands.md)。
