diff --git a/src/components/DocDialog.tsx b/src/components/DocDialog.tsx index cb7ab20..a2ec717 100644 --- a/src/components/DocDialog.tsx +++ b/src/components/DocDialog.tsx @@ -162,73 +162,12 @@ const DocContent: Component<{ entry: AnyEntry }> = (props) => { return (
-

+

{e.icon} {e.title} - - :{e.tag} -

-

{e.description}

- -
-

- 基本语法 -

-
-          {e.syntax}
-        
-
- - 0}> -
-

- 属性 -

- - - - - - - - - - - - {(prop) => ( - - - - - - - )} - - -
- 属性 - - 类型 - - 默认值 - 说明
- - {prop.name} - - - {prop.type} - - {prop.default ?? "—"} - {prop.desc}
-
-
- -
-

示例

-
- {e.body} -
+
+ {e.body}
); diff --git a/src/components/doc-data.ts b/src/components/doc-data.ts index e093c59..45d75e1 100644 --- a/src/components/doc-data.ts +++ b/src/components/doc-data.ts @@ -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 | 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 | 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), }; } diff --git a/src/components/journal-doc-data.ts b/src/components/journal-doc-data.ts index 6cbd567..1b1b1dd 100644 --- a/src/components/journal-doc-data.ts +++ b/src/components/journal-doc-data.ts @@ -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 | 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), }; } diff --git a/src/doc-entries/journal-gm.md b/src/doc-entries/journal-gm.md index 17a10bd..03146e0 100644 --- a/src/doc-entries/journal-gm.md +++ b/src/doc-entries/journal-gm.md @@ -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 可以撤回自己发送的最新消息,点击消息旁的撤回按钮即 - 🔴 红色:连接错误 - ⚪ 灰色:未连接 -断开连接可点击标题栏的 ⏻ 按钮。 +断开连接可点击标题栏的 ⏻ 按钮。 \ No newline at end of file diff --git a/src/doc-entries/journal-link.md b/src/doc-entries/journal-link.md index db58b12..de17a18 100644 --- a/src/doc-entries/journal-link.md +++ b/src/doc-entries/journal-link.md @@ -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**:可使用 - **玩家**:不可使用 -- **观察者**:不可使用 \ No newline at end of file +- **观察者**:不可使用 diff --git a/src/doc-entries/journal-player.md b/src/doc-entries/journal-player.md index 5d6b050..a7e5802 100644 --- a/src/doc-entries/journal-player.md +++ b/src/doc-entries/journal-player.md @@ -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 模式下,断开连接后重新加入会保留之前的消息记录 \ No newline at end of file diff --git a/src/doc-entries/journal-roll.md b/src/doc-entries/journal-roll.md index 06f4e19..c9da05b 100644 --- a/src/doc-entries/journal-roll.md +++ b/src/doc-entries/journal-roll.md @@ -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**:可使用 - **玩家**:不可使用 -- **观察者**:不可使用 +- **观察者**:不可使用 \ No newline at end of file diff --git a/src/doc-entries/journal-set.md b/src/doc-entries/journal-set.md index cb270ff..aa2b838 100644 --- a/src/doc-entries/journal-set.md +++ b/src/doc-entries/journal-set.md @@ -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) ## 循环依赖 diff --git a/src/doc-entries/journal-spark.md b/src/doc-entries/journal-spark.md index f60f689..dbb4fd1 100644 --- a/src/doc-entries/journal-spark.md +++ b/src/doc-entries/journal-spark.md @@ -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 文件的每一行对应种子表的一个条目,随机选取一行发布。 +抽取时根据骰子公式投掷,查找对应行并发布结果。 ## 权限 diff --git a/src/doc-entries/md-bg.md b/src/doc-entries/md-bg.md index b7af271..03abf12 100644 --- a/src/doc-entries/md-bg.md +++ b/src/doc-entries/md-bg.md @@ -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` | 背景适配方式(仅图片时生效) | + ## 使用场景 -用于营造场景氛围,如地牢、森林、城镇等不同环境的背景,或纯色区分不同主题。 \ No newline at end of file +用于营造场景氛围,如地牢、森林、城镇等不同环境的背景,或纯色区分不同主题。 diff --git a/src/doc-entries/md-border.md b/src/doc-entries/md-border.md index 143b3d9..5bb9d4e 100644 --- a/src/doc-entries/md-border.md +++ b/src/doc-entries/md-border.md @@ -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`(仅图片模式) | ## 使用场景 diff --git a/src/doc-entries/md-commander.md b/src/doc-entries/md-commander.md index 341a719..9d23688 100644 --- a/src/doc-entries/md-commander.md +++ b/src/doc-entries/md-commander.md @@ -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、状态等游戏信息。 \ No newline at end of file diff --git a/src/doc-entries/md-deck.md b/src/doc-entries/md-deck.md index bee174a..35bae8a 100644 --- a/src/doc-entries/md-deck.md +++ b/src/doc-entries/md-deck.md @@ -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` | 固定模式(只读不可编辑) | ## 使用场景 diff --git a/src/doc-entries/md-dice.md b/src/doc-entries/md-dice.md index b64abcf..39d9300 100644 --- a/src/doc-entries/md-dice.md +++ b/src/doc-entries/md-dice.md @@ -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` | ## 使用场景 diff --git a/src/doc-entries/md-embed.md b/src/doc-entries/md-embed.md index b748908..df3b06a 100644 --- a/src/doc-entries/md-embed.md +++ b/src/doc-entries/md-embed.md @@ -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` 将 `#` 提升为 `##`) | + ## 使用场景 用于在文档中引用通用规则、重复使用的数据表格等。 \ No newline at end of file diff --git a/src/doc-entries/md-font.md b/src/doc-entries/md-font.md index a326509..298648e 100644 --- a/src/doc-entries/md-font.md +++ b/src/doc-entries/md-font.md @@ -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)`) | + ## 使用场景 -用于切换文档的显示字体和文字颜色,适配不同风格需求。 \ No newline at end of file +用于切换文档的显示字体和文字颜色,适配不同风格需求。 diff --git a/src/doc-entries/md-link.md b/src/doc-entries/md-link.md index c5c44b5..f7277a5 100644 --- a/src/doc-entries/md-link.md +++ b/src/doc-entries/md-link.md @@ -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: [] ## 使用场景 -用于引用规则书章节、怪物数据、快速预览等场景。 \ No newline at end of file +用于引用规则书章节、怪物数据、快速预览等场景。 diff --git a/src/doc-entries/md-pins.md b/src/doc-entries/md-pins.md index 00cbda4..5fb7c81 100644 --- a/src/doc-entries/md-pins.md +++ b/src/doc-entries/md-pins.md @@ -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"` | 标签起始值,支持字母或数字 | ## 使用场景 diff --git a/src/doc-entries/md-table.md b/src/doc-entries/md-table.md index f081b2b..871d6b7 100644 --- a/src/doc-entries/md-table.md +++ b/src/doc-entries/md-table.md @@ -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}}` 引用同行其他列 | ## 使用场景 diff --git a/src/doc-entries/md-yarn-spinner.md b/src/doc-entries/md-yarn-spinner.md index f11a1da..1da2024 100644 --- a/src/doc-entries/md-yarn-spinner.md +++ b/src/doc-entries/md-yarn-spinner.md @@ -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"` | 起始节点名称 | + ## 使用场景 用于互动故事、分支对话、冒险剧本等。 \ No newline at end of file