refactor: simplify DocDialog and move documentation to markdown body
Simplify the `DocDialog` component by removing hardcoded property tables and syntax blocks. Instead, rely on the raw markdown body provided in the `DocEntry` to render documentation content. This shifts the responsibility of formatting (syntax, props, etc.) from the component to the individual markdown files, allowing for more flexible and detailed documentation.
This commit is contained in:
parent
7cb28e631e
commit
99dd49b077
|
|
@ -162,73 +162,12 @@ const DocContent: Component<{ entry: AnyEntry }> = (props) => {
|
|||
|
||||
return (
|
||||
<div class="max-w-none">
|
||||
<h2 class="text-2xl font-bold text-gray-900 mb-2">
|
||||
<h2 class="text-2xl font-bold text-gray-900 mb-6">
|
||||
{e.icon} {e.title}
|
||||
<code class="ml-3 text-base font-mono bg-gray-100 px-2 py-0.5 rounded text-blue-700">
|
||||
:{e.tag}
|
||||
</code>
|
||||
</h2>
|
||||
|
||||
<p class="text-gray-600 mb-6">{e.description}</p>
|
||||
|
||||
<div class="mb-6">
|
||||
<h3 class="text-sm font-semibold text-gray-500 uppercase mb-2">
|
||||
基本语法
|
||||
</h3>
|
||||
<pre class="bg-gray-900 text-gray-100 px-4 py-3 rounded-lg text-sm overflow-x-auto">
|
||||
<code>{e.syntax}</code>
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<Show when={e.props.length > 0}>
|
||||
<div class="mb-6">
|
||||
<h3 class="text-sm font-semibold text-gray-500 uppercase mb-2">
|
||||
属性
|
||||
</h3>
|
||||
<table class="w-full text-sm border-collapse">
|
||||
<thead>
|
||||
<tr class="border-b border-gray-200">
|
||||
<th class="text-left py-2 pr-4 font-medium text-gray-600">
|
||||
属性
|
||||
</th>
|
||||
<th class="text-left py-2 pr-4 font-medium text-gray-600">
|
||||
类型
|
||||
</th>
|
||||
<th class="text-left py-2 pr-4 font-medium text-gray-600">
|
||||
默认值
|
||||
</th>
|
||||
<th class="text-left py-2 font-medium text-gray-600">说明</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<For each={e.props}>
|
||||
{(prop) => (
|
||||
<tr class="border-b border-gray-100">
|
||||
<td class="py-2 pr-4">
|
||||
<code class="bg-gray-100 px-1.5 py-0.5 rounded text-xs text-pink-700">
|
||||
{prop.name}
|
||||
</code>
|
||||
</td>
|
||||
<td class="py-2 pr-4">
|
||||
<code class="text-xs text-gray-600">{prop.type}</code>
|
||||
</td>
|
||||
<td class="py-2 pr-4 text-xs text-gray-400">
|
||||
{prop.default ?? "—"}
|
||||
</td>
|
||||
<td class="py-2 text-sm text-gray-600">{prop.desc}</td>
|
||||
</tr>
|
||||
)}
|
||||
</For>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</Show>
|
||||
|
||||
<div class="prose-sm max-w-none">
|
||||
<h3 class="text-sm font-semibold text-gray-500 uppercase mb-2">示例</h3>
|
||||
<div class="bg-gray-50 border border-gray-200 rounded-lg p-4 text-sm leading-relaxed whitespace-pre-wrap font-mono text-gray-800">
|
||||
{e.body}
|
||||
</div>
|
||||
<div class="text-sm leading-relaxed whitespace-pre-wrap text-gray-800">
|
||||
{e.body}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -4,16 +4,12 @@ export interface DocEntry {
|
|||
tag: string;
|
||||
icon: string;
|
||||
title: string;
|
||||
description: string;
|
||||
syntax: string;
|
||||
props: { name: string; type: string; default?: string; desc: string }[];
|
||||
/** Markdown body (everything after frontmatter ---) */
|
||||
/** Full markdown body (everything after frontmatter ---) */
|
||||
body: string;
|
||||
}
|
||||
|
||||
/** Splits frontmatter and markdown body from a raw .md string. */
|
||||
function parseFrontmatter(raw: string): Record<string, unknown> | null {
|
||||
// Handle CRLF line endings by normalizing to LF first
|
||||
const normalized = raw.replace(/\r\n/g, "\n");
|
||||
const match = normalized.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
|
||||
if (!match) return null;
|
||||
|
|
@ -27,7 +23,7 @@ function parseFrontmatter(raw: string): Record<string, unknown> | null {
|
|||
function getBody(raw: string): string {
|
||||
const normalized = raw.replace(/\r\n/g, "\n");
|
||||
const match = normalized.match(/^---\n[\s\S]*?\n---\n?([\s\S]*)$/);
|
||||
return match ? match[1] : raw;
|
||||
return (match ? match[1] : raw).trim();
|
||||
}
|
||||
|
||||
function parseEntry(raw: string): DocEntry | null {
|
||||
|
|
@ -37,9 +33,6 @@ function parseEntry(raw: string): DocEntry | null {
|
|||
tag: fm.tag as string,
|
||||
icon: fm.icon as string,
|
||||
title: fm.title as string,
|
||||
description: fm.description as string,
|
||||
syntax: fm.syntax as string,
|
||||
props: (fm.props as DocEntry["props"]) ?? [],
|
||||
body: getBody(raw),
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,9 +4,7 @@ export interface JournalDocEntry {
|
|||
tag: string;
|
||||
icon: string;
|
||||
title: string;
|
||||
description: string;
|
||||
syntax: string;
|
||||
props: { name: string; type: string; default?: string; desc: string }[];
|
||||
/** Full markdown body (everything after frontmatter ---) */
|
||||
body: string;
|
||||
}
|
||||
|
||||
|
|
@ -24,7 +22,7 @@ function parseFrontmatter(raw: string): Record<string, unknown> | null {
|
|||
function getBody(raw: string): string {
|
||||
const normalized = raw.replace(/\r\n/g, "\n");
|
||||
const match = normalized.match(/^---\n[\s\S]*?\n---\n?([\s\S]*)$/);
|
||||
return match ? match[1] : raw;
|
||||
return (match ? match[1] : raw).trim();
|
||||
}
|
||||
|
||||
function parseEntry(raw: string): JournalDocEntry | null {
|
||||
|
|
@ -34,9 +32,6 @@ function parseEntry(raw: string): JournalDocEntry | null {
|
|||
tag: fm.tag as string,
|
||||
icon: fm.icon as string,
|
||||
title: fm.title as string,
|
||||
description: fm.description as string,
|
||||
syntax: fm.syntax as string,
|
||||
props: (fm.props as JournalDocEntry["props"]) ?? [],
|
||||
body: getBody(raw),
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,20 +2,12 @@
|
|||
tag: journal-gm
|
||||
icon: 🎭
|
||||
title: 主持人指南
|
||||
description: 作为 GM 创建会话、管理玩家、使用动态表单和消息类型。
|
||||
syntax: '点击导航栏 📋 图标打开 Journal 面板'
|
||||
props:
|
||||
- name: 会话管理
|
||||
type: —
|
||||
desc: 创建、切换、删除会话;通过邀请链接添加玩家
|
||||
- name: 消息类型
|
||||
type: —
|
||||
desc: 发送叙述、掷骰、表单等多种消息类型
|
||||
- name: 动态表单
|
||||
type: —
|
||||
desc: 创建自定义表单收集玩家输入
|
||||
---
|
||||
|
||||
作为 GM 创建会话、管理玩家、使用命令与玩家互动。
|
||||
|
||||
点击顶部导航栏的 📋 按钮打开 Journal 面板。
|
||||
|
||||
## 快速开始
|
||||
|
||||
1. 点击顶部导航栏的 📋 按钮打开 Journal 面板
|
||||
|
|
@ -32,25 +24,20 @@ props:
|
|||
|
||||
玩家通过邀请链接加入后会自动以玩家身份连接。
|
||||
|
||||
## 消息类型
|
||||
## 消息与命令
|
||||
|
||||
Journal 支持多种消息类型,通过输入框上方的标签切换:
|
||||
Journal 使用斜杠命令来发送不同类型的消息。在输入框中输入命令,按 Enter 发送:
|
||||
|
||||
- **叙述**:普通的文字描述,用于推进剧情
|
||||
- **掷骰**:发送掷骰结果,可附带公式
|
||||
- **表单**:创建动态表单,收集玩家选择或输入
|
||||
- **聊天**:直接输入文字,按 Enter 发送普通叙述消息
|
||||
- **`/roll 表达式`**:掷骰或抽取火花表。传入骰子表达式(如 `/roll 3d6`)则掷骰;传入火花表键名(如 `/roll npc`)则抽取火花表
|
||||
- **`/link 路径#章节`**:发送可点击的文档链接
|
||||
- **`/set $key 值`**:设置变量值,支持数值、标签映射和随机标签
|
||||
|
||||
## 动态表单
|
||||
|
||||
表单消息允许你创建交互式问卷:
|
||||
|
||||
- 添加文本输入、选择框、复选框等字段
|
||||
- 玩家提交后,GM 可以看到汇总结果
|
||||
- 适用于投票、决策、角色创建等场景
|
||||
输入 `/` 后按 Tab 可打开命令补全下拉菜单。
|
||||
|
||||
## 撤回消息
|
||||
|
||||
GM 可以撤回自己发送的最新消息,点击消息旁的撤回按钮即可。
|
||||
GM 可以撤回自己发送的最新消息,点击消息卡片右上角的 × 按钮即可。
|
||||
|
||||
## 连接状态
|
||||
|
||||
|
|
@ -59,4 +46,4 @@ GM 可以撤回自己发送的最新消息,点击消息旁的撤回按钮即
|
|||
- 🔴 红色:连接错误
|
||||
- ⚪ 灰色:未连接
|
||||
|
||||
断开连接可点击标题栏的 ⏻ 按钮。
|
||||
断开连接可点击标题栏的 ⏻ 按钮。
|
||||
|
|
@ -2,27 +2,22 @@
|
|||
tag: journal-link
|
||||
icon: 🔗
|
||||
title: 链接命令
|
||||
description: 在 Journal 中发送可点击的文档链接,可指向特定章节。
|
||||
syntax: '/link 路径#章节'
|
||||
props:
|
||||
- name: 路径
|
||||
type: string
|
||||
desc: 文档路径(不含 .md 扩展名)
|
||||
- name: 章节
|
||||
type: string
|
||||
desc: 可选,文档中的章节标题
|
||||
---
|
||||
|
||||
在 Journal 中发送可点击的文档链接,可指向特定章节。
|
||||
|
||||
**语法:** `/link 路径#章节`
|
||||
|
||||
## 概述
|
||||
|
||||
`/link` 命令用于在 Journal 流中发送文档链接,点击后可在文章区域打开对应文档。
|
||||
|
||||
## 语法
|
||||
## 参数
|
||||
|
||||
```
|
||||
/link 路径
|
||||
/link 路径#章节
|
||||
```
|
||||
| 参数 | 类型 | 说明 |
|
||||
|---|---|---|
|
||||
| 路径 | string | 文档路径(不含 `.md` 扩展名) |
|
||||
| 章节 | string | 可选,文档中的章节标题 |
|
||||
|
||||
## 示例
|
||||
|
||||
|
|
@ -36,4 +31,4 @@ props:
|
|||
|
||||
- **GM**:可使用
|
||||
- **玩家**:不可使用
|
||||
- **观察者**:不可使用
|
||||
- **观察者**:不可使用
|
||||
|
|
|
|||
|
|
@ -2,20 +2,12 @@
|
|||
tag: journal-player
|
||||
icon: 🎲
|
||||
title: 玩家指南
|
||||
description: 作为玩家加入 GM 的会话,查看消息、提交表单、参与互动。
|
||||
syntax: '通过 GM 发送的邀请链接加入'
|
||||
props:
|
||||
- name: 加入方式
|
||||
type: —
|
||||
desc: 点击邀请链接自动加入,或手动输入名字和角色
|
||||
- name: 查看消息
|
||||
type: —
|
||||
desc: 实时查看 GM 和其他玩家的消息
|
||||
- name: 提交表单
|
||||
type: —
|
||||
desc: 填写 GM 发送的动态表单并提交
|
||||
---
|
||||
|
||||
作为玩家加入 GM 的会话,查看消息、使用 `/set` 命令设置变量、参与互动。
|
||||
|
||||
通过 GM 发送的邀请链接加入。
|
||||
|
||||
## 加入会话
|
||||
|
||||
有两种方式加入 GM 的会话:
|
||||
|
|
@ -38,20 +30,17 @@ GM 会发送一个包含 `?session=xxx&player=你的名字&autojoin=1` 的链接
|
|||
|
||||
- GM 发送的叙述消息
|
||||
- 掷骰结果
|
||||
- 火花表抽取结果
|
||||
- 其他玩家的消息
|
||||
- 动态表单
|
||||
|
||||
消息实时更新,无需刷新页面。
|
||||
|
||||
## 填写表单
|
||||
## 使用命令
|
||||
|
||||
当 GM 发送动态表单时:
|
||||
玩家可在输入框中使用以下命令:
|
||||
|
||||
1. 表单会显示在消息流中
|
||||
2. 根据表单类型填写(文本、选择、复选框等)
|
||||
3. 点击提交按钮发送你的回答
|
||||
|
||||
GM 可以看到所有玩家的提交结果。
|
||||
- **聊天**:直接输入文字,按 Enter 发送普通消息
|
||||
- **`/set $key 值`**:设置变量值,支持数值和标签映射
|
||||
|
||||
## 角色标识
|
||||
|
||||
|
|
@ -63,4 +52,5 @@ GM 可以看到所有玩家的提交结果。
|
|||
|
||||
- 玩家无法创建或切换会话
|
||||
- 玩家无法撤回消息
|
||||
- 断开连接后重新加入会保留之前的消息记录
|
||||
- 玩家无法使用 `/roll` 和 `/link` 命令
|
||||
- 在 CLI 模式下,断开连接后重新加入会保留之前的消息记录
|
||||
|
|
@ -1,28 +1,20 @@
|
|||
---
|
||||
tag: journal-roll
|
||||
icon: 🎲
|
||||
title: 掷骰与种子表命令
|
||||
description: 在 Journal 中掷骰或随机生成种子表内容。优先匹配种子表,否则作为骰子表达式处理。
|
||||
syntax: '/roll 骰子表达式 | 种子表键名'
|
||||
props:
|
||||
- name: 参数
|
||||
type: string
|
||||
desc: 骰子表达式(如 3d6、2d8kh1、d20+5)或已定义的种子表 slug
|
||||
title: 掷骰与火花表命令
|
||||
---
|
||||
|
||||
在 Journal 中掷骰或随机抽取火花表内容。优先匹配火花表,否则作为骰子表达式处理。
|
||||
|
||||
**语法:** `/roll 骰子表达式 | 火花表键名`
|
||||
|
||||
## 概述
|
||||
|
||||
`/roll` 命令用于掷骰或随机抽取种子表,并将结果同步到所有客户端。
|
||||
`/roll` 命令用于掷骰或随机抽取火花表,并将结果同步到所有客户端。
|
||||
|
||||
- 如果参数匹配已定义的**种子表** slug,则抽取并发布对应种子表的结果。
|
||||
- 如果参数匹配已定义的**火花表** slug,则抽取并发布对应火花表的结果。
|
||||
- 否则,作为**骰子表达式**求值并发布掷骰结果。
|
||||
|
||||
## 语法
|
||||
|
||||
```
|
||||
/roll 骰子表达式 | 种子表键名
|
||||
```
|
||||
|
||||
## 示例
|
||||
|
||||
### 掷骰
|
||||
|
|
@ -35,7 +27,7 @@ props:
|
|||
/roll 4d6k3
|
||||
```
|
||||
|
||||
### 种子表
|
||||
### 火花表
|
||||
|
||||
```
|
||||
/roll npc
|
||||
|
|
@ -53,12 +45,14 @@ props:
|
|||
| `1d20+5` | 1 个 20 面骰加 5 |
|
||||
| `4d6k3` | 4 个 6 面骰保留最高 3 个 |
|
||||
|
||||
## 种子表定义
|
||||
## 火花表定义
|
||||
|
||||
种子表在文档中通过 `:spark[CSV路径]` 指令或 spark 形状的 markdown 表格定义,CSV 文件的第一列表头为骰子公式(如 d6、d20),后续列为数据列。
|
||||
火花表在 markdown 文档中通过 `:spark[CSV路径]` 标记声明,系统扫描文档时自动发现。CSV 文件的第一列表头为骰子公式(如 `d6`、`d20`),后续列为数据列。
|
||||
|
||||
抽取时根据骰子公式投掷,查找对应行并将各列数据作为火花表结果发布。
|
||||
|
||||
## 权限
|
||||
|
||||
- **GM**:可使用
|
||||
- **玩家**:不可使用
|
||||
- **观察者**:不可使用
|
||||
- **观察者**:不可使用
|
||||
|
|
@ -10,7 +10,7 @@ props:
|
|||
desc: 在任意 .md 文档中使用 ```csv role=declare 代码块定义变量和标签
|
||||
- name: 命令
|
||||
type: —
|
||||
desc: /set $key expression | /set $key #tag1|#tag2|#tag3
|
||||
desc: /set $key expression | /set $key #tag1:count1;#tag2:count2
|
||||
- name: 权限
|
||||
type: —
|
||||
desc: GM 和玩家均可设置变量
|
||||
|
|
@ -21,23 +21,25 @@ props:
|
|||
变量系统允许你定义数值变量和标签,通过命令设置值,系统自动计算派生变量和标签效果。
|
||||
|
||||
核心概念:
|
||||
- **变量**(`$name`):存储数值或标签,通过 `/set` 命令修改
|
||||
- **标签**(`#tag`):当某个变量的值为 `#tag` 时,该标签被激活,触发相应的修饰效果
|
||||
- **变量**(`$name`):存储数值或标签映射,通过 `/set` 命令修改
|
||||
- **标签映射**(`#tag:count`):变量可以存储一个标签映射(如 `#warrior:2;#druid:1`),每个标签有一个计数值
|
||||
- **标签修饰符**:当变量中的标签计数值达到阈值时,修饰符生效
|
||||
- **声明**(`declare`):在 `role=declare` 代码块中定义派生变量和标签修饰符
|
||||
|
||||
## 代码块语法
|
||||
|
||||
```csv role=declare
|
||||
tag,key,expr
|
||||
,$hp,$con*5+$mod_hp
|
||||
,$ac,10+$dex
|
||||
#warrior,$mod_hp,20
|
||||
#warrior,$mod_str,1
|
||||
tag,threshold,key,expr
|
||||
,,$hp,$con*5+$mod_hp
|
||||
,,$ac,10+$dex
|
||||
#warrior,1,$mod_hp,20
|
||||
#warrior,2,$mod_str,1
|
||||
```
|
||||
|
||||
| 列 | 说明 |
|
||||
|---|---|
|
||||
| `tag` | 标签名(空表示普通变量声明) |
|
||||
| `threshold` | 激活阈值(可选,默认 `1`)。标签计数值 ≥ 阈值时激活 |
|
||||
| `key` | 变量名,以 `$` 开头 |
|
||||
| `expr` | 表达式,支持数字、`$var` 引用、骰子、算术、函数 |
|
||||
|
||||
|
|
@ -51,14 +53,18 @@ tag,key,expr
|
|||
,$ac,10+$dex
|
||||
```
|
||||
|
||||
**标签修饰符**(tag 非空):当 `#tag` 被激活时,`$key` 的当前值加上表达式的计算结果。
|
||||
**标签修饰符**(tag 非空):当源变量的标签映射中 `#tag` 的计数值 ≥ `threshold` 时,`$key` 加上表达式的计算结果。修饰符按阈值独立激活。
|
||||
|
||||
```csv role=declare
|
||||
tag,key,expr
|
||||
#warrior,$mod_hp,20
|
||||
#warrior,$mod_str,1
|
||||
tag,threshold,key,expr
|
||||
#warrior,1,$mod_hp,20
|
||||
#warrior,2,$mod_str,1
|
||||
```
|
||||
|
||||
上例中:
|
||||
- `#warrior` 计数 ≥ 1 时,`$mod_hp` 获得 +20
|
||||
- `#warrior` 计数 ≥ 2 时,`$mod_str` 获得 +1(需要更高等级)
|
||||
|
||||
## 表达式语法
|
||||
|
||||
支持以下表达式元素:
|
||||
|
|
@ -72,7 +78,7 @@ tag,key,expr
|
|||
| 函数 | `floor(x)`, `ceil(x)`, `round(x)` | 取整函数 |
|
||||
| 括号 | `(2+3)*4` | 分组 |
|
||||
|
||||
变量引用必须解析为数值,不能是标签值(`#warrior`)。如果引用的变量是标签类型,求值会报错。
|
||||
变量引用必须解析为数值,不能是标签映射值(`#warrior:1`)。如果引用的变量是标签类型,求值会报错。
|
||||
|
||||
## 命令
|
||||
|
||||
|
|
@ -81,7 +87,9 @@ tag,key,expr
|
|||
| 命令 | 示例 | 说明 |
|
||||
|---|---|---|
|
||||
| `/set $key expr` | `/set $str 16` | 设置变量为数值 |
|
||||
| `/set $key #tag` | `/set $class #warrior` | 设置变量为标签 |
|
||||
| `/set $key #tag` | `/set $class #warrior` | 设置单个标签(等价 `#warrior:1`) |
|
||||
| `/set $key #tag:count` | `/set $class #warrior:3` | 设置标签及计数值 |
|
||||
| `/set $key #t1:c1;#t2:c2` | `/set $class #warrior:2;#druid:1` | 设置多个标签 |
|
||||
| `/set $key #a\|#b\|#c` | `/set $class #w\|#d\|#s` | 随机选择一个标签 |
|
||||
|
||||
### 设置数值
|
||||
|
|
@ -93,16 +101,23 @@ tag,key,expr
|
|||
|
||||
设置后,依赖 `$con` 和 `$dex` 的派生变量(如 `$hp`、`$ac`)会自动重新计算。
|
||||
|
||||
### 设置标签
|
||||
### 设置标签映射
|
||||
|
||||
```
|
||||
/set $class #warrior
|
||||
```
|
||||
|
||||
当 `$class` 设置为 `#warrior` 时:
|
||||
1. `#warrior` 标签被激活
|
||||
2. 所有 `#warrior` 的修饰符生效:`$mod_hp += 20`,`$mod_str += 1`
|
||||
3. 依赖这些变量的派生变量自动重新计算
|
||||
等价于 `/set $class #warrior:1`。当 `$class` 的 `#warrior` 计数 ≥ 1 时:
|
||||
1. `#warrior` 修饰符中阈值 ≤ 1 的生效
|
||||
2. 如 `$mod_hp += 20`,依赖 `$mod_hp` 的派生变量自动重新计算
|
||||
|
||||
**多标签示例:**
|
||||
|
||||
```
|
||||
/set $class #warrior:2;#druid:1
|
||||
```
|
||||
|
||||
变量 `$class` 同时拥有 `#warrior` 计数 2 和 `#druid` 计数 1,两者的修饰符会同时生效(各自按阈值判断)。
|
||||
|
||||
### 随机标签
|
||||
|
||||
|
|
@ -110,27 +125,39 @@ tag,key,expr
|
|||
/set $class #warrior|#druid|#sorcerer|#wizard
|
||||
```
|
||||
|
||||
从给定标签中随机选择一个设置为变量值。
|
||||
从给定标签中随机选择一个,计数值为 1。
|
||||
|
||||
## 标签激活
|
||||
|
||||
标签的激活状态由变量的值决定:
|
||||
标签的激活状态由变量中标签映射的计数值决定:
|
||||
|
||||
- 如果**任何**变量的值为 `#tag`,该标签被激活
|
||||
- 如果**没有**变量的值为 `#tag`,该标签被停用
|
||||
- 如果变量的标签映射中 `#tag` 的计数值 = 0(或不存在),该标签停用
|
||||
- 计数值 ≥ 修饰符的 `threshold` 时,该修饰符激活
|
||||
- 计数值 < `threshold` 时,修饰符停用
|
||||
- 标签激活时,其修饰符**加到**目标变量上
|
||||
- 标签停用时,修饰符**从**目标变量中减去
|
||||
|
||||
一个变量只能存储一个值类型:数值或标签,不能同时存储两者。
|
||||
### 阈值机制
|
||||
|
||||
阈值允许同一标签产生不同层级的效果:
|
||||
|
||||
```csv role=declare
|
||||
tag,threshold,key,expr
|
||||
#warrior,1,$mod_hp,10
|
||||
#warrior,3,$mod_hp,20
|
||||
```
|
||||
|
||||
- `#warrior` 计数 1-2:`$mod_hp` +10
|
||||
- `#warrior` 计数 ≥ 3:`$mod_hp` +30(两个修饰符叠加)
|
||||
|
||||
一个变量可以存储多个标签(标签映射),支持多职业、混合属性等场景。
|
||||
|
||||
## 变量视图
|
||||
|
||||
在 Journal 面板顶部点击 **变量** 标签切换视图:
|
||||
在 Journal 面板顶部点击 **变量** 标签切换到变量视图,显示所有已定义的变量及其当前值。
|
||||
|
||||
- **激活标签**:显示当前激活的标签、激活来源和修饰效果
|
||||
- **声明变量**:显示由表达式定义的派生变量及其当前值
|
||||
- **直接设置**:显示通过 `/set` 直接赋值的变量
|
||||
- **标签变量**:显示当前值为标签的变量
|
||||
- 每行显示变量名和当前值,标签类型变量以紫色高亮显示
|
||||
- 鼠标悬停在变量行上,会弹出气泡显示:声明表达式(如有)和当前激活的标签修饰符(标签名、数值、来源变量)
|
||||
|
||||
## 文档模板
|
||||
|
||||
|
|
@ -148,20 +175,20 @@ tag,key,expr
|
|||
在文档中定义:
|
||||
|
||||
```csv role=declare
|
||||
tag,key,expr
|
||||
,$con,10
|
||||
,$dex,12
|
||||
,$hp,$con*5+$mod_hp
|
||||
,$ac,10+$dex
|
||||
#warrior,$mod_hp,20
|
||||
#warrior,$mod_str,1
|
||||
tag,threshold,key,expr
|
||||
,,$con,10
|
||||
,,$dex,12
|
||||
,,$hp,$con*5+$mod_hp
|
||||
,,$ac,10+$dex
|
||||
#warrior,1,$mod_hp,20
|
||||
#warrior,2,$mod_str,1
|
||||
```
|
||||
|
||||
在 Journal 中输入:
|
||||
|
||||
```
|
||||
/set $con 14
|
||||
/set $class #warrior
|
||||
/set $class #warrior:2
|
||||
```
|
||||
|
||||
结果:
|
||||
|
|
@ -169,8 +196,8 @@ tag,key,expr
|
|||
- `$dex = 12`
|
||||
- `$hp = 14*5 + 20 = 90`
|
||||
- `$ac = 10 + 12 = 22`
|
||||
- `$mod_hp = 20`(来自 `#warrior` 修饰符)
|
||||
- `$mod_str = 1`(来自 `#warrior` 修饰符)
|
||||
- `$mod_hp = 20`(来自 `#warrior` 修饰符,阈值 1,计数 2 ≥ 1)
|
||||
- `$mod_str = 1`(来自 `#warrior` 修饰符,阈值 2,计数 2 ≥ 2)
|
||||
|
||||
## 循环依赖
|
||||
|
||||
|
|
|
|||
|
|
@ -1,36 +1,28 @@
|
|||
---
|
||||
tag: journal-spark
|
||||
icon: 🎰
|
||||
title: 种子表命令
|
||||
description: 在 Journal 中随机生成种子表内容,用于生成随机遭遇、NPC、物品等。
|
||||
syntax: '/spark 种子表键名'
|
||||
props:
|
||||
- name: 种子表键名
|
||||
type: string
|
||||
desc: 在文档中通过 :spark[CSV路径] 指令定义的种子表 slug
|
||||
title: 火花表
|
||||
---
|
||||
|
||||
在 Journal 中通过 `/roll` 命令随机抽取火花表内容,用于生成随机遭遇、NPC、物品等。
|
||||
|
||||
**语法:** `/roll 火花表键名`
|
||||
|
||||
## 概述
|
||||
|
||||
`/spark` 命令用于从种子表中随机抽取一行并发布结果。种子表在 markdown 文档中通过 `:spark[CSV路径]` 指令定义。
|
||||
|
||||
## 语法
|
||||
|
||||
```
|
||||
/spark 种子表键名
|
||||
```
|
||||
火花表通过 `/roll` 命令触发:当参数匹配已定义的火花表 slug 时,自动抽取并发布结果,而非作为骰子表达式处理。
|
||||
|
||||
## 示例
|
||||
|
||||
```
|
||||
/spark npc
|
||||
/spark encounter
|
||||
/spark loot
|
||||
/roll npc
|
||||
/roll encounter
|
||||
/roll loot
|
||||
```
|
||||
|
||||
## 种子表定义
|
||||
## 火花表定义
|
||||
|
||||
种子表在文档中定义:
|
||||
火花表在 markdown 文档中通过 `:spark[CSV路径]` 标记声明,CSV 文件的第一列表头为骰子公式(如 `d6`、`d20`),后续列为数据列。系统扫描文档时自动发现这些标记。
|
||||
|
||||
```
|
||||
:spark[npc]
|
||||
|
|
@ -38,7 +30,7 @@ props:
|
|||
:spark[loot]
|
||||
```
|
||||
|
||||
CSV 文件的每一行对应种子表的一个条目,随机选取一行发布。
|
||||
抽取时根据骰子公式投掷,查找对应行并发布结果。
|
||||
|
||||
## 权限
|
||||
|
||||
|
|
|
|||
|
|
@ -2,15 +2,12 @@
|
|||
tag: md-bg
|
||||
icon: 🖼️
|
||||
title: 背景组件
|
||||
description: 设置背景图片或纯色作为文章卡片背景,支持多种适配方式。
|
||||
syntax: ':md-bg[#ff00dd]'
|
||||
props:
|
||||
- name: fit
|
||||
type: cover | contain | fill | none | scale-down
|
||||
default: cover
|
||||
desc: 背景适配方式(仅图片时生效)
|
||||
---
|
||||
|
||||
设置背景图片或纯色作为文章卡片背景,支持多种适配方式。
|
||||
|
||||
**语法:** `:md-bg[颜色或图片路径]{选项}`
|
||||
|
||||
**设置背景图:**
|
||||
:md-bg[./images/dungeon-bg.jpg]{fit="cover"}
|
||||
|
||||
|
|
@ -23,6 +20,12 @@ props:
|
|||
|
||||
支持图片路径或任意 CSS 颜色值(hex、rgb、颜色名等)。
|
||||
|
||||
## 属性
|
||||
|
||||
| 属性 | 类型 | 默认值 | 说明 |
|
||||
|---|---|---|---|
|
||||
| `fit` | `cover` \| `contain` \| `fill` \| `none` \| `scale-down` | `cover` | 背景适配方式(仅图片时生效) |
|
||||
|
||||
## 使用场景
|
||||
|
||||
用于营造场景氛围,如地牢、森林、城镇等不同环境的背景,或纯色区分不同主题。
|
||||
用于营造场景氛围,如地牢、森林、城镇等不同环境的背景,或纯色区分不同主题。
|
||||
|
|
|
|||
|
|
@ -2,19 +2,12 @@
|
|||
tag: md-border
|
||||
icon: 🖼️
|
||||
title: 边框组件
|
||||
description: 为文档卡片添加纯色或图片边框,支持指定边、样式和重复模式。
|
||||
syntax: ':md-border[#3b82f6]{.l .dashed}'
|
||||
props:
|
||||
- name: width
|
||||
type: string
|
||||
default: 纯色 .2mm,图片 2mm
|
||||
desc: 边框宽度
|
||||
- name: slice
|
||||
type: string
|
||||
default: '"10"'
|
||||
desc: border-image-slice(仅图片模式)
|
||||
---
|
||||
|
||||
为文档卡片添加纯色或图片边框,支持指定边、样式和重复模式。
|
||||
|
||||
**语法:** `:md-border[颜色或图片路径]{方位类 样式类 选项}`
|
||||
|
||||
**纯色左边框:**
|
||||
:md-border[#3b82f6]{.l}
|
||||
|
||||
|
|
@ -27,9 +20,45 @@ props:
|
|||
**左右图片竖条:**
|
||||
:md-border[./images/ornament.png]{.l .r .repeat}
|
||||
|
||||
边 class:`t` `b` `l` `r` `all`(默认)
|
||||
样式 class:`solid` `dashed` `dotted` `double`
|
||||
图片 class:`stretch` `repeat` `round` `space`
|
||||
## 方位类
|
||||
|
||||
| class | 说明 |
|
||||
|---|---|
|
||||
| `t` | 上边框 |
|
||||
| `b` | 下边框 |
|
||||
| `l` | 左边框 |
|
||||
| `r` | 右边框 |
|
||||
| `all` | 全部(默认) |
|
||||
|
||||
## 样式类
|
||||
|
||||
| class | 说明 |
|
||||
|---|---|
|
||||
| `solid` | 实线 |
|
||||
| `dashed` | 虚线 |
|
||||
| `dotted` | 点线 |
|
||||
| `double` | 双线 |
|
||||
| `groove` | 凹槽 |
|
||||
| `ridge` | 凸脊 |
|
||||
| `inset` | 内嵌 |
|
||||
| `outset` | 外凸 |
|
||||
| `none` | 无边框 |
|
||||
|
||||
## 图片类
|
||||
|
||||
| class | 说明 |
|
||||
|---|---|
|
||||
| `stretch` | 拉伸 |
|
||||
| `repeat` | 重复 |
|
||||
| `round` | 缩放 |
|
||||
| `space` | 间隔 |
|
||||
|
||||
## 属性
|
||||
|
||||
| 属性 | 类型 | 默认值 | 说明 |
|
||||
|---|---|---|---|
|
||||
| `width` | string | 纯色 `.2mm`,图片 `2mm` | 边框宽度 |
|
||||
| `slice` | string | `"10"` | `border-image-slice`(仅图片模式) |
|
||||
|
||||
## 使用场景
|
||||
|
||||
|
|
|
|||
|
|
@ -2,28 +2,56 @@
|
|||
tag: md-commander
|
||||
icon: 📋
|
||||
title: 命令追踪器
|
||||
description: 支持命令历史和游戏状态追踪,使用类 Emmet 语法创建追踪项。
|
||||
syntax: ':md-commander'
|
||||
props: []
|
||||
---
|
||||
|
||||
支持命令历史和游戏状态追踪,使用类 Emmet 语法创建追踪项,支持 CSV 命令模板加载。
|
||||
|
||||
**语法:** `:md-commander[./templates.csv]{选项}`
|
||||
|
||||
**追踪 NPC 血量和防御:**
|
||||
```
|
||||
track npc#john.dwarf.warrior[hp=4/4 ac=15 name="John"]
|
||||
```
|
||||
|
||||
**语法规则:**
|
||||
## 语法规则
|
||||
|
||||
- `#id` 设置 ID
|
||||
- `.class` 添加类别
|
||||
- `[attr=value]` 设置属性
|
||||
|
||||
**属性类型:**
|
||||
## 属性类型
|
||||
|
||||
| 格式 | 显示 |
|
||||
|---|---|
|
||||
| x/y | 进度条 |
|
||||
| `x/y` | 进度条 |
|
||||
| 整数 | 计数器 |
|
||||
| 文本 | 文本字段 |
|
||||
|
||||
## 视图模式
|
||||
|
||||
组件有两个标签页,通过顶部标签栏切换:
|
||||
|
||||
- **历史**:显示命令执行历史,点击可重新填入命令
|
||||
- **追踪**:显示当前追踪的所有项目,支持属性编辑、类管理、排序和删除
|
||||
|
||||
## 键盘快捷键
|
||||
|
||||
| 快捷键 | 说明 |
|
||||
|---|---|
|
||||
| `Enter` | 执行命令 |
|
||||
| `Tab` | 接受自动补全 |
|
||||
| `↑` / `↓` | 补全列表导航 / 命令历史导航 |
|
||||
| `Escape` | 关闭补全菜单 |
|
||||
|
||||
## 属性
|
||||
|
||||
| 属性 | 类型 | 默认值 | 说明 |
|
||||
|---|---|---|---|
|
||||
| `placeholder` | string | `"输入命令..."` | 输入框占位符 |
|
||||
| `class` | string | — | 额外 CSS 类 |
|
||||
| `height` | string | `"400px"` | 组件高度 |
|
||||
| `commandTemplates` | string | — | CSV 模板文件路径 |
|
||||
|
||||
## 使用场景
|
||||
|
||||
用于追踪战斗中的 NPC 血量、AC、状态等游戏信息。
|
||||
|
|
@ -2,24 +2,46 @@
|
|||
tag: md-deck
|
||||
icon: 🃏
|
||||
title: 卡牌组件
|
||||
description: 将 CSV 数据渲染为卡牌布局,支持自定义网格和图层的排版。
|
||||
syntax: ':md-deck[./cards.csv]{grid="5x8" layers="title:1,1-5,1f8 body:1,5-8,8f3"}'
|
||||
props:
|
||||
- name: grid
|
||||
type: string
|
||||
desc: 卡牌布局,格式 行x列
|
||||
- name: layers
|
||||
type: string
|
||||
desc: 图层定义,格式 字段:行,列-列,字号
|
||||
---
|
||||
|
||||
将 CSV 数据渲染为可打印的卡牌布局,支持自定义尺寸、网格、图层和双面排版。
|
||||
|
||||
**语法:** `:md-deck[./cards.csv]{选项}`
|
||||
|
||||
**基础卡牌:**
|
||||
:md-deck[./spells.csv]{grid="3x3"}
|
||||
|
||||
**多层卡牌:**
|
||||
:md-deck[./cards.csv]{grid="5x8" layers="title:1,1-5,1f8 body:1,5-8,8f3"}
|
||||
|
||||
CSV 包含 label 和显示字段列,通过图层定义控制各字段的位置和大小。
|
||||
CSV 包含数据字段列,通过图层定义控制各字段的位置、大小和对齐。
|
||||
|
||||
## 图层格式
|
||||
|
||||
`layers` 属性格式为 `字段:起始行,起始列-结束列,字号`,多个图层用空格分隔:
|
||||
|
||||
- **字段**:CSV 中的列名
|
||||
- **起始行,起始列-结束列**:图层在网格中的位置(1-based)
|
||||
- **字号**:末尾带 `f` 前缀,如 `f8` 表示 8mm
|
||||
|
||||
示例:`"title:1,1-5,1f8 body:1,5-8,8f3"` 表示 title 字段占第 1 行、第 1 到 5 列、字号 8mm;body 字段占第 1 行、第 5 到 8 列、字号 3mm。
|
||||
|
||||
## 属性
|
||||
|
||||
| 属性 | 类型 | 默认值 | 说明 |
|
||||
|---|---|---|---|
|
||||
| `grid` | string | — | 卡牌网格布局,格式 `行x列`(如 `"5x8"`) |
|
||||
| `gridW` | number | `5` | 网格列数 |
|
||||
| `gridH` | number | `8` | 网格行数 |
|
||||
| `size` | string | — | 卡牌尺寸,格式 `宽x高`(如 `"54x86"`,单位 mm) |
|
||||
| `sizeW` | number | `54` | 卡牌宽度(mm) |
|
||||
| `sizeH` | number | `86` | 卡牌高度(mm) |
|
||||
| `bleed` | number | `1` | 出血线(mm) |
|
||||
| `padding` | number | `2` | 内边距(mm) |
|
||||
| `shape` | string | `"rectangle"` | 卡牌形状(`rectangle` 等) |
|
||||
| `layers` | string | — | 正面图层定义 |
|
||||
| `backLayers` | string | — | 背面图层定义 |
|
||||
| `fixed` | boolean | `false` | 固定模式(只读不可编辑) |
|
||||
|
||||
## 使用场景
|
||||
|
||||
|
|
|
|||
|
|
@ -2,21 +2,25 @@
|
|||
tag: md-dice
|
||||
icon: 🎲
|
||||
title: 骰子组件
|
||||
description: 点击文字执行掷骰,可用于属性检定、伤害投掷等场景。
|
||||
syntax: ':md-dice[2d6+d8]{key="attack"}'
|
||||
props:
|
||||
- name: key
|
||||
type: string
|
||||
desc: URL 参数标识,结果记录到 ?dice-key=15
|
||||
---
|
||||
|
||||
点击骰子图标执行掷骰,点击文字重置为公式,可用于属性检定、伤害投掷等场景。
|
||||
|
||||
**语法:** `:md-dice[公式]{key="标识"}`
|
||||
|
||||
**攻击检定:** :md-dice[1d20+5]{key="attack"}
|
||||
|
||||
**伤害掷骰:** :md-dice[2d6+3]{key="damage"}
|
||||
|
||||
**优势检定:** :md-dice[2d20k1+5]{key="advantage"}
|
||||
|
||||
点击掷骰文字执行投掷,再次点击重置为公式。
|
||||
点击 🎲 图标执行投掷,显示结果;点击文字重置为原始公式。
|
||||
|
||||
## 属性
|
||||
|
||||
| 属性 | 类型 | 说明 |
|
||||
|---|---|---|
|
||||
| `key` | string | URL 参数标识,结果记录到 `?dice-key=15` |
|
||||
|
||||
## 使用场景
|
||||
|
||||
|
|
|
|||
|
|
@ -2,11 +2,12 @@
|
|||
tag: md-embed
|
||||
icon: 📄
|
||||
title: 嵌入组件
|
||||
description: 将另一个 Markdown 文件的内容内联嵌入到当前文档中。
|
||||
syntax: ':md-embed[./rules.md#combat]'
|
||||
props: []
|
||||
---
|
||||
|
||||
将另一个 Markdown 文件的内容内联嵌入到当前文档中。
|
||||
|
||||
**语法:** `:md-embed[路径#章节]{选项}`
|
||||
|
||||
**嵌入完整文档:**
|
||||
:md-embed[./rules.md]
|
||||
|
||||
|
|
@ -15,6 +16,12 @@ props: []
|
|||
|
||||
嵌入后内容直接在当前位置显示,包括其中的表格、骰子等组件也会正常渲染。
|
||||
|
||||
## 属性
|
||||
|
||||
| 属性 | 类型 | 默认值 | 说明 |
|
||||
|---|---|---|---|
|
||||
| `headingBase` | number | `0` | 提升嵌入内容中每一级标题的层级(如 `1` 将 `#` 提升为 `##`) |
|
||||
|
||||
## 使用场景
|
||||
|
||||
用于在文档中引用通用规则、重复使用的数据表格等。
|
||||
|
|
@ -2,22 +2,12 @@
|
|||
tag: md-font
|
||||
icon: 🔤
|
||||
title: 字体组件
|
||||
description: 设置整个文档的字体和文字颜色,支持 Google Fonts、emfont 和系统本地字体三种来源。
|
||||
syntax: ':md-font[Noto Sans SC]{source="google" weight="400" color="#ff00dd"}'
|
||||
props:
|
||||
- name: source
|
||||
type: google | emfont | local
|
||||
default: local
|
||||
desc: 字体来源
|
||||
- name: weight
|
||||
type: string
|
||||
default: '"400"'
|
||||
desc: 字体粗细
|
||||
- name: color
|
||||
type: string
|
||||
desc: 文字颜色(CSS 颜色值,如 #ff00dd、rgb(255,0,0))
|
||||
---
|
||||
|
||||
设置整个文档的字体和文字颜色,支持 Google Fonts、emfont 和系统本地字体三种来源。
|
||||
|
||||
**语法:** `:md-font[字体名]{选项}`
|
||||
|
||||
**Google 字体:**
|
||||
:md-font[Noto Sans SC]{source="google"}
|
||||
|
||||
|
|
@ -34,6 +24,14 @@ props:
|
|||
|
||||
字体和颜色将应用到整个文档卡片。
|
||||
|
||||
## 属性
|
||||
|
||||
| 属性 | 类型 | 默认值 | 说明 |
|
||||
|---|---|---|---|
|
||||
| `source` | `google` \| `emfont` \| `local` | `local` | 字体来源 |
|
||||
| `weight` | string | `"400"` | 字体粗细 |
|
||||
| `color` | string | — | 文字颜色(CSS 颜色值,如 `#ff00dd`、`rgb(255,0,0)`) |
|
||||
|
||||
## 使用场景
|
||||
|
||||
用于切换文档的显示字体和文字颜色,适配不同风格需求。
|
||||
用于切换文档的显示字体和文字颜色,适配不同风格需求。
|
||||
|
|
|
|||
|
|
@ -2,11 +2,12 @@
|
|||
tag: md-link
|
||||
icon: 🔗
|
||||
title: 链接组件
|
||||
description: 点击链接在当前页面内展开显示目标文章内容,支持章节定位。
|
||||
syntax: ':md-link[./rules.md#combat]'
|
||||
props: []
|
||||
---
|
||||
|
||||
点击链接在当前页面内展开显示目标文章内容,支持章节定位。
|
||||
|
||||
**语法:** `:md-link[路径#章节]`
|
||||
|
||||
**展开完整文档:**
|
||||
:md-link[./rules.md]
|
||||
|
||||
|
|
@ -17,4 +18,4 @@ props: []
|
|||
|
||||
## 使用场景
|
||||
|
||||
用于引用规则书章节、怪物数据、快速预览等场景。
|
||||
用于引用规则书章节、怪物数据、快速预览等场景。
|
||||
|
|
|
|||
|
|
@ -2,23 +2,12 @@
|
|||
tag: md-pins
|
||||
icon: 📍
|
||||
title: 标记组件
|
||||
description: 在地图或图片上添加可编辑或固定的位置标记,支持字母或数字标签。
|
||||
syntax: ':md-pins[./images/map.png]{pins="A:30,40 B:10,30" fixed}'
|
||||
props:
|
||||
- name: pins
|
||||
type: string
|
||||
default: '""'
|
||||
desc: 标记列表,格式 "A:x,y B:x,y"
|
||||
- name: fixed
|
||||
type: boolean
|
||||
default: "false"
|
||||
desc: 固定模式(只读不可编辑)
|
||||
- name: labelStart
|
||||
type: string
|
||||
default: '"A"'
|
||||
desc: 标签起始值,支持字母或数字
|
||||
---
|
||||
|
||||
在地图或图片上添加可编辑或固定的位置标记,支持字母或数字标签。
|
||||
|
||||
**语法:** `:md-pins[图片路径]{选项}`
|
||||
|
||||
**固定标记(只读):**
|
||||
:md-pins[./images/battle-map.png]{pins="A:25,50 B:75,30" fixed}
|
||||
|
||||
|
|
@ -28,7 +17,19 @@ props:
|
|||
**数字标签:**
|
||||
:md-pins[./images/dungeon.png]{labelStart="1"}
|
||||
|
||||
非 fixed 模式下点击图片添加标记,点击标记删除。
|
||||
非 `fixed` 模式下点击图片添加标记,点击标记删除。
|
||||
|
||||
## 复制坐标
|
||||
|
||||
非 `fixed` 模式下,图片右上角会显示 📋 复制按钮,点击可将所有标记的坐标复制到剪贴板,方便粘贴回文档的 `pins` 属性中。
|
||||
|
||||
## 属性
|
||||
|
||||
| 属性 | 类型 | 默认值 | 说明 |
|
||||
|---|---|---|---|
|
||||
| `pins` | string | `""` | 标记列表,格式 `A:x,y B:x,y` |
|
||||
| `fixed` | boolean | `false` | 固定模式(只读不可编辑) |
|
||||
| `labelStart` | string | `"A"` | 标签起始值,支持字母或数字 |
|
||||
|
||||
## 使用场景
|
||||
|
||||
|
|
|
|||
|
|
@ -2,17 +2,12 @@
|
|||
tag: md-table
|
||||
icon: 📊
|
||||
title: 表格组件
|
||||
description: 将 CSV 数据转换为可切换标签页的表格,支持随机抽取和变量引用。
|
||||
syntax: ':md-table[./data.csv]{roll=true remix=true}'
|
||||
props:
|
||||
- name: roll
|
||||
type: boolean
|
||||
desc: 显示随机切换按钮
|
||||
- name: remix
|
||||
type: boolean
|
||||
desc: 支持 {{prop}} 引用同行其他列
|
||||
---
|
||||
|
||||
将 CSV 数据转换为可切换标签页的表格,支持内联 CSV、随机抽取、加权随机和变量引用。
|
||||
|
||||
**语法:** `:md-table[./data.csv]{选项}`
|
||||
|
||||
**基础表格:**
|
||||
```markdown
|
||||
:md-table[./npcs.csv]
|
||||
|
|
@ -28,7 +23,39 @@ props:
|
|||
:md-table[./quests.csv]{roll=true remix=true}
|
||||
```
|
||||
|
||||
CSV 要求包含 label, body 列,可选 group 列分组。支持 YAML front matter 继承行属性。
|
||||
**内联 CSV(直接写入内容):**
|
||||
```markdown
|
||||
:md-table[label,body,group
|
||||
A,这是一段描述,第一章
|
||||
B,另一段描述,第二章]{}
|
||||
```
|
||||
|
||||
支持通过文件路径加载 CSV,也可以直接将 CSV 数据内联写在指令中。CSV 要求包含 `label`、`body` 列,可选 `group` 列分组。
|
||||
|
||||
## 分组
|
||||
|
||||
当 CSV 包含 `group` 列时,表格顶部会显示分组标签页,可切换查看不同分组的数据。
|
||||
|
||||
## 随机抽取
|
||||
|
||||
当 `roll=true` 时,表格顶部显示 🎲 随机按钮:
|
||||
- 普通随机:从所有行中均匀随机选取
|
||||
- **加权随机**:当 `label` 列全部为整数或整数范围格式(如 `1-3`)时,以 label 值为权重进行加权随机抽取
|
||||
|
||||
## 变量引用
|
||||
|
||||
当 `remix=true` 时,`body` 列中可使用 `{{prop}}` 语法引用同行其他列或 YAML front matter 中的数据。开启 `remix` 后每次随机抽取会从所有行中随机选取一行来解析变量。
|
||||
|
||||
## YAML Front Matter
|
||||
|
||||
CSV 文件可包含 YAML front matter(文件开头的 `---` 块),其中定义的属性可通过 `{{prop}}` 在 `body` 中引用。
|
||||
|
||||
## 属性
|
||||
|
||||
| 属性 | 类型 | 说明 |
|
||||
|---|---|---|
|
||||
| `roll` | boolean | 显示随机切换按钮 |
|
||||
| `remix` | boolean | 支持 `{{prop}}` 引用同行其他列 |
|
||||
|
||||
## 使用场景
|
||||
|
||||
|
|
|
|||
|
|
@ -2,16 +2,30 @@
|
|||
tag: md-yarn-spinner
|
||||
icon: 🧶
|
||||
title: 叙事线组件
|
||||
description: 展示 Yarn Spinner 格式的分支叙事结构,支持对话选择和分支。
|
||||
syntax: ':md-yarn-spinner[./story.yarn]'
|
||||
props: []
|
||||
---
|
||||
|
||||
展示 Yarn Spinner 格式的分支叙事结构,支持对话选择和分支。
|
||||
|
||||
**语法:** `:md-yarn-spinner[./story.yarn]{选项}`
|
||||
|
||||
**加载叙事文件:**
|
||||
:md-yarn-spinner[./story.yarn]
|
||||
|
||||
Yarn Spinner 是用于游戏对话系统的格式,支持选项、条件分支和变量。
|
||||
|
||||
## 交互方式
|
||||
|
||||
- **对话历史**:上半部分显示已进行的对话,说话者以蓝色粗体显示,命令以灰色斜体显示
|
||||
- **当前选项**:下半部分显示可选的对话选项,点击选项推进剧情
|
||||
- **⏩ 继续**:点击右上角继续按钮推进到下一段对话
|
||||
- **🔄 重新开始**:点击右上角重启按钮从头开始对话
|
||||
|
||||
## 属性
|
||||
|
||||
| 属性 | 类型 | 默认值 | 说明 |
|
||||
|---|---|---|---|
|
||||
| `start` | string | `"start"` | 起始节点名称 |
|
||||
|
||||
## 使用场景
|
||||
|
||||
用于互动故事、分支对话、冒险剧本等。
|
||||
Loading…
Reference in New Issue