# Markdown 编写说明
本文档介绍 TTRPG Tools 支持的 Markdown 扩展语法和组件用法。
## 基础语法
使用标准 Markdown 语法,支持以下扩展:
- [GFM](https://github.github.com/gfm/) - GitHub Flavored Markdown
- [marked-alert](https://github.com/Insidify/marked-alert) - 警告/提示块
- [marked-gfm-heading-id](https://github.com/markedjs/marked-gfm-heading-id) - 标题 ID
- [marked-directive](https://github.com/fengzilong/marked-directive) - 指令语法
## 指令语法
通过 `marked-directive` 支持自定义组件插入:
```markdown
:component-name[content]{key="value" another="test"}
```
### 语法说明
| 部分 | 说明 | 示例 |
|------|------|------|
| `:name` | 组件名称 | `:dice` |
| `[content]` | 内容参数 | `[2d6+d8]` |
| `{attrs}` | 属性对象 | `{key="attack"}` |
### 嵌套指令
```markdown
::: container
这里是容器内容
:dice[1d20]
:::
```
## 图标语法
使用简单的 `:icon-name` 语法插入图标:
```markdown
:attack :defense :potion :sword
```
图标会渲染为 `` 形式。
### 配置图标前缀
可通过 `iconPath` 属性指定图标目录:
```markdown
```
或使用空字符串禁用图标前缀:
```markdown
```
## 组件库
### 🎲 骰子组件 (md-dice)
```markdown
:dice[2d6+d8]
:dice[1d20+5]{key="attack"}
```
**功能:**
- 点击骰子图标执行掷骰
- 点击文本重置为公式
- `key` 属性将结果记录到 URL 参数中 (`?dice-attack=15`)
**属性:**
| 属性 | 类型 | 说明 |
|------|------|------|
| `key` | string | 用于 URL 参数记录的标识 |
**示例:**
```markdown
攻击检定 :dice[1d20+5]{key="attack"}
伤害掷骰 :dice[2d6+3]{key="damage"}
```
### 🔗 链接组件 (md-link)
```markdown
:link[./other-page.md]
:link[./rules.md#combat-section]
```
**功能:**
- 点击链接在当前页面内展开显示目标文章内容
- 支持 `#section` 语法显示特定章节
- 支持相对路径引用
**属性:**
| 属性 | 类型 | 说明 |
|------|------|------|
| (无) | - | 内容即为链接目标路径 |
**示例:**
```markdown
查看完整规则 :link[./rules.md]
查看战斗章节 :link[./rules.md#combat]
```
### 🖼️ 背景组件 (md-bg)
```markdown
:bg[./images/background.jpg]
:bg[./images/pattern.png]{fit="contain"}
```
**功能:**
- 将图片设置为当前文章卡片的背景
- 自动覆盖整个卡片区域
**属性:**
| 属性 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `fit` | `cover` \| `contain` \| `fill` \| `none` \| `scale-down` | `cover` | 背景适配方式 |
**示例:**
```markdown
:bg[./images/dungeon-bg.jpg]{fit="cover"}
# 地牢探险
这里是地牢的描述内容...
```
### 🪙 代币组件 (md-token)
```markdown
:md-token[./token-image.png]
:md-token[./hero.png]{size=60 defaultThickness=2.5}
```
**功能:**
- 将 2D 图片转换为 3D 打印模型
- 自动进行图像矢量追踪分层
- 支持预览和导出 STL 文件
**属性:**
| 属性 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `size` | number | `50` | 模型整体尺寸 (mm) |
| `defaultThickness` | number | `2` | 默认图层厚度 (mm) |
**使用流程:**
1. 引用图片(PNG/JPG 等)
2. 等待矢量追踪完成
3. 在设置面板调整图层厚度
4. 点击「生成 3D 模型」
5. 预览并下载 STL 文件
**示例:**
```markdown
:md-token[./images/warrior-token.png]
:md-token[./images/dragon.png]{size=75 defaultThickness=3}
```
### 🧶 叙事线组件 (md-yarn-spinner)
```markdown
:md-yarn-spinner[./story.yarn]{start="start"}
```
**功能:**
- 运行 Yarn Spinner 叙事脚本
- 显示对话历史和选项
- 支持命令和变量替换
**属性:**
| 属性 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `start` | string | `start` | 起始节点名称 |
**Yarn 文件格式:**
```yarn
title: start
tags:
colorID: 0
position: 0,0
---
NPC: 欢迎来到村庄!
玩家:谢谢![[继续]]
===
title: 继续
tags:
colorID: 0
position: 200,0
---
NPC: 有什么我可以帮你的吗?
-> 询问任务
最近有什么危险的任务吗?
-> 离开
再见!
[[结束]]
===
```
**示例:**
```markdown
:md-yarn-spinner[./dialogues/village-elder.yarn]
:md-yarn-spinner[./quest-branch.yarn]{start="intro"}
```
### 📋 命令追踪器 (md-commander)
```markdown
:md-commander
:md-commander[./commands.csv]{placeholder="输入命令..."}
```
**功能:**
- 命令历史视图
- 追踪器视图(角色状态、进度等)
- 支持 Emmet 简写语法
- 命令自动补全
**属性:**
| 属性 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `placeholder` | string | - | 输入框占位符 |
| `class` | string | - | 额外 CSS 类 |
| `height` | string | `400px` | 组件高度 |
| `commandTemplates` | string | - | CSV 模板文件路径 |
**追踪器命令语法:**
```
track npc#john.dwarf.warrior[hp=4/4 ac=15 name="John"]
```
**Emmet 简写语法:**
- `#id` - 设置 ID
- `.class` - 添加类别
- `[attr=value]` - 设置属性
**属性类型:**
| 类型 | 格式 | 显示 |
|------|------|------|
| `progress` | `x/y` | 进度条 (如 `hp=4/4`) |
| `count` | 整数 | 数字计数器 (如 `ac=15`) |
| `string` | 文本 | 文本字段 (如 `name="John"`) |
**内置命令:**
| 命令 | 说明 |
|------|------|
| `track` | 添加追踪项 |
| `remove` | 移除追踪项 |
| `update` | 更新属性 |
| `clear` | 清空追踪 |
**示例:**
```markdown
:md-commander
:md-commander{placeholder="输入 /help 查看命令"}
:md-commander[./my-commands.csv]
track enemy#goblin.soldier[hp=7/7 ac=12]
track ally#cleric[hp=24/24 spells=4/4]
```
### 📁 文件树 (FileTree)
文件树组件自动在侧边栏显示,无需手动插入。
**功能:**
- 自动扫描内容目录
- 显示文件层级结构
- 支持文件夹展开/收起
- 显示当前文件的标题导航
**目录结构示例:**
```
content/
├── index.md # 首页
├── rules/
│ ├── index.md # 规则首页
│ ├── combat.md # 战斗规则
│ └── magic.md # 魔法系统
└── characters/
└── npc-list.md # NPC 列表
```
侧边栏会自动显示:
- 📁 rules/
- 📄 combat.md
- 📄 magic.md
## YAML 标签
使用 ```yaml/tag 代码块创建自定义标签:
````markdown
```yaml/tag
tag: tag-name
class: custom-class
id: my-id
body: 标签内容
```
````
渲染为:
```html
标签内容
```
## Mermaid 图表
支持 mermaid 流程图:
````markdown
```mermaid
graph TD
A[开始] --> B{选择}
B -->|选项 1| C[结果 1]
B -->|选项 2| D[结果 2]
```
````
支持的图表类型:
- flowchart - 流程图
- sequenceDiagram - 时序图
- classDiagram - 类图
- stateDiagram - 状态图
- erDiagram - ER 图
- pie - 饼图
## 警告/提示块
```markdown
> [!NOTE]
> 这是一条备注
> [!TIP]
> 这是一条提示
> [!IMPORTANT]
> 这是重要信息
> [!WARNING]
> 这是警告信息
> [!CAUTION]
> 这是危险警告
```
## 文件引用
### 相对路径
```markdown
:table[./data.csv]
:deck[./cards/deck.csv]
:table[../shared/npcs.csv]

```
### 路径解析规则
- 所有路径相对于当前 Markdown 文件
- 支持 `.` 和 `..` 导航
- 自动处理 URL 编码
## 样式定制
### 使用 Tailwind 类
组件支持 Tailwind CSS 类:
```markdown
:dice[1d20]{class="text-red-500"}
```
### 自定义 CSS
```css
/* 在 styles.css 中添加 */
.md-dice {
@apply text-blue-600 hover:text-blue-800;
}
```
## 最佳实践
### 内容组织
```markdown
# 章节标题
这里是章节内容。
## 子章节
### 规则说明
:dice[2d6] 掷骰决定结果。
:table[./options.csv]{roll=true}
> [!TIP]
> 这是一个有用的提示。
```
### 性能优化
- 大型 CSV 文件使用 `group` 列分组
- 图片使用适当分辨率
- 避免过多嵌套组件
### 可访问性
- 为图片添加 `alt` 文本
- 使用语义化标题层级
- 确保颜色对比度