Skip to content

代码保护区

CommonMark 的围栏代码块和行内代码具有最高词法优先级,内部所有 DraMark 特殊标记失效。

保护范围

类型起始标记结束标记保护内容
围栏代码块```~~~同等长度/类型的围栏标记块内全部文本
行内代码`匹配的起始标记标记间全部文本

保护区内失效的语法

  • @ 角色声明
  • $$ 唱段标记
  • = 译配标记
  • <<...>> / <<<...>>> Tech Cue
  • % 注释标记
  • {} 动作提示

围栏代码块示例

dramark
```cpp
// 这里的所有 DraMark 标记都失效
template <typename T>
class RolePair {
    vector<vector<int>> matrix;  // 不触发 Tech Cue
};

void setup() {
    std::cout << "Hello, World! >>" << std::endl;  // 不触发 Tech Cue
}
```

带 info string

dramark
```javascript
// 代码块内 @ 不触发角色声明
function greet() {
    console.log("Hello @world");
}
```

```dramark
@角色  % 在代码块内,这是纯文本
台词...
```

行内代码示例

dramark
使用 `vector<vector<int>>` 定义矩阵。

按 `Ctrl + @` 快捷键。

价格是 `$50` 美元。

为什么需要代码保护区?

C++ 模板安全

cpp
vector<vector<int>> matrix;  // 在非保护区会解析错误

位移操作符

cpp
int value = 1 << 8;  // 在非保护区 << 被识别为 Tech Cue

包含特殊字符的技术文档

剧本中可能需要包含代码片段、配置示例等技术内容。

嵌套规则

围栏代码块内部

所有 DraMark Block 标记均不触发栈操作

dramark
```dramark
@角色  % 这是代码块内的纯文本,不是角色声明
---   % 这是代码块内的纯文本,不是场景分隔
```

行内代码内部

所有 DraMark 行内标记失效:

dramark
这是 `{动作}` 示例。 % 行内代码内的 {} 不触发动作提示

最佳实践

  1. 代码示例使用围栏代码块:确保技术内容正确显示
  2. 行内代码使用反引号:保护行内的特殊字符
  3. 不需要在代码块内转义:代码块内的 \@ 会显示为 \@

基于 MIT 许可发布