@blueking/chat-x 0.0.5 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ai-selection/ai-selection.vue.d.ts +2 -2
- package/dist/components/index.d.ts +2 -1
- package/dist/index.css +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/mcp/generated/docs/activity-message.md +428 -0
- package/dist/mcp/generated/docs/ai-image.md +227 -0
- package/dist/mcp/generated/docs/ai-loading.md +129 -0
- package/dist/mcp/generated/docs/ai-selection.md +436 -0
- package/dist/mcp/generated/docs/animation-text.md +199 -0
- package/dist/mcp/generated/docs/assistant-message.md +424 -0
- package/dist/mcp/generated/docs/chat-container.md +402 -0
- package/dist/mcp/generated/docs/chat-input.md +625 -0
- package/dist/mcp/generated/docs/cite-content.md +138 -0
- package/dist/mcp/generated/docs/code-content.md +199 -0
- package/dist/mcp/generated/docs/common-error-content.md +70 -0
- package/dist/mcp/generated/docs/constants.md +216 -0
- package/dist/mcp/generated/docs/content-render.md +238 -0
- package/dist/mcp/generated/docs/delete-tool.md +188 -0
- package/dist/mcp/generated/docs/desc-panel.md +139 -0
- package/dist/mcp/generated/docs/execution-summary.md +126 -0
- package/dist/mcp/generated/docs/file-content.md +300 -0
- package/dist/mcp/generated/docs/file-upload-btn.md +174 -0
- package/dist/mcp/generated/docs/flow-message.md +305 -0
- package/dist/mcp/generated/docs/highlight-keyword.md +144 -0
- package/dist/mcp/generated/docs/image-content.md +178 -0
- package/dist/mcp/generated/docs/image-preview-group.md +181 -0
- package/dist/mcp/generated/docs/image-preview.md +224 -0
- package/dist/mcp/generated/docs/info-message.md +124 -0
- package/dist/mcp/generated/docs/key-value-content.md +124 -0
- package/dist/mcp/generated/docs/latex-content.md +196 -0
- package/dist/mcp/generated/docs/loading-message.md +171 -0
- package/dist/mcp/generated/docs/markdown-content.md +186 -0
- package/dist/mcp/generated/docs/markdown-latex.md +208 -0
- package/dist/mcp/generated/docs/markdown-mermaid.md +250 -0
- package/dist/mcp/generated/docs/mermaid-content.md +185 -0
- package/dist/mcp/generated/docs/message-container.md +534 -0
- package/dist/mcp/generated/docs/message-render.md +329 -0
- package/dist/mcp/generated/docs/message-tools.md +376 -0
- package/dist/mcp/generated/docs/messages.md +472 -0
- package/dist/mcp/generated/docs/overflow-tips.md +209 -0
- package/dist/mcp/generated/docs/reasoning-message.md +233 -0
- package/dist/mcp/generated/docs/reference-content.md +132 -0
- package/dist/mcp/generated/docs/scroll-btn.md +155 -0
- package/dist/mcp/generated/docs/selection-footer.md +75 -0
- package/dist/mcp/generated/docs/shortcut-btn.md +202 -0
- package/dist/mcp/generated/docs/shortcut-btns.md +264 -0
- package/dist/mcp/generated/docs/shortcut-render.md +418 -0
- package/dist/mcp/generated/docs/text-content.md +74 -0
- package/dist/mcp/generated/docs/theme.md +388 -0
- package/dist/mcp/generated/docs/tool-btn.md +254 -0
- package/dist/mcp/generated/docs/tool-message.md +217 -0
- package/dist/mcp/generated/docs/toolcall-render.md +299 -0
- package/dist/mcp/generated/docs/use-animation-text.md +198 -0
- package/dist/mcp/generated/docs/use-clipboard.md +206 -0
- package/dist/mcp/generated/docs/use-command-selection.md +128 -0
- package/dist/mcp/generated/docs/use-container-scroll.md +56 -0
- package/dist/mcp/generated/docs/use-custom-tab.md +122 -0
- package/dist/mcp/generated/docs/use-global-config.md +154 -0
- package/dist/mcp/generated/docs/use-menu-keydown.md +164 -0
- package/dist/mcp/generated/docs/use-message-group.md +175 -0
- package/dist/mcp/generated/docs/use-observer-visible-list.md +189 -0
- package/dist/mcp/generated/docs/use-parent-scrolling.md +46 -0
- package/dist/mcp/generated/docs/user-feedback.md +229 -0
- package/dist/mcp/generated/docs/user-message.md +347 -0
- package/dist/mcp/generated/index.json +1311 -0
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.js +42 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.js +43 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/get-component-doc.d.ts +19 -0
- package/dist/mcp/tools/get-component-doc.js +60 -0
- package/dist/mcp/tools/get-component-doc.js.map +1 -0
- package/dist/mcp/tools/list-components.d.ts +35 -0
- package/dist/mcp/tools/list-components.js +147 -0
- package/dist/mcp/tools/list-components.js.map +1 -0
- package/dist/mcp/tools/search-docs.d.ts +14 -0
- package/dist/mcp/tools/search-docs.js +82 -0
- package/dist/mcp/tools/search-docs.js.map +1 -0
- package/dist/mcp/utils/doc-loader.d.ts +35 -0
- package/dist/mcp/utils/doc-loader.js +64 -0
- package/dist/mcp/utils/doc-loader.js.map +1 -0
- package/package.json +5 -7
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
<!-- AI SUMMARY -->
|
|
2
|
+
## 快速了解
|
|
3
|
+
|
|
4
|
+
markdownItLatex 为 markdown-it 插件,解析 $...$、$$...$$、\\(...\\)、\\[...\\] 为 math_inline / math_block token,可选 LatexOption.replaceAlignStart。 不负责渲染,KaTeX 在 LatexContent 中异步渲染。与 Markdown 管道、ContentRender 中的公式展示链路配合。
|
|
5
|
+
|
|
6
|
+
### 关联组件
|
|
7
|
+
- **latex-content** — 消费 math token 并 KaTeX 渲染
|
|
8
|
+
- **markdown-content** — Markdown 渲染管线
|
|
9
|
+
- **content-render** — 消息内容统一渲染入口
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
<!-- FULL DOC -->
|
|
13
|
+
|
|
14
|
+
# markdownItLatex LaTeX 解析插件
|
|
15
|
+
|
|
16
|
+
> **分类**:plugin
|
|
17
|
+
|
|
18
|
+
Markdown-it LaTeX 解析插件,用于解析 LaTeX 数学公式语法。
|
|
19
|
+
|
|
20
|
+
## 功能说明
|
|
21
|
+
|
|
22
|
+
此插件只负责解析 LaTeX 语法,将其转换为 `math_inline` 和 `math_block` token。实际的 KaTeX 渲染在 `LatexContent` 组件中完成。
|
|
23
|
+
|
|
24
|
+
## 支持的语法
|
|
25
|
+
|
|
26
|
+
| 语法 | 类型 | 示例 |
|
|
27
|
+
| --------- | -------- | ---------------------- |
|
|
28
|
+
| `$...$` | 行内公式 | `$E = mc^2$` |
|
|
29
|
+
| `$$...$$` | 块级公式 | `$$\sum_{i=1}^{n} i$$` |
|
|
30
|
+
| `\(...\)` | 行内公式 | `\(E = mc^2\)` |
|
|
31
|
+
| `\[...\]` | 块级公式 | `\[\sum_{i=1}^{n} i\]` |
|
|
32
|
+
|
|
33
|
+
## 基础用法
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
import MarkdownIt from 'markdown-it';
|
|
37
|
+
import { markdownItLatex } from '@blueking/chat-x';
|
|
38
|
+
|
|
39
|
+
const md = new MarkdownIt().use(markdownItLatex);
|
|
40
|
+
|
|
41
|
+
// 解析包含 LaTeX 的 Markdown
|
|
42
|
+
const tokens = md.parse(`
|
|
43
|
+
行内公式:$E = mc^2$
|
|
44
|
+
|
|
45
|
+
块级公式:
|
|
46
|
+
|
|
47
|
+
$$
|
|
48
|
+
\\int_0^\\infty e^{-x^2} dx = \\frac{\\sqrt{\\pi}}{2}
|
|
49
|
+
$$
|
|
50
|
+
`);
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## 配置选项
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
import MarkdownIt from 'markdown-it';
|
|
57
|
+
import { markdownItLatex, type LatexOption } from '@blueking/chat-x';
|
|
58
|
+
|
|
59
|
+
const options: LatexOption = {
|
|
60
|
+
replaceAlignStart: true, // 将 align* 替换为 aligned(KaTeX 不支持 align*)
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const md = new MarkdownIt().use(markdownItLatex, options);
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 配置项
|
|
67
|
+
|
|
68
|
+
| 属性名 | 类型 | 默认值 | 说明 |
|
|
69
|
+
| ----------------- | --------- | ------ | -------------------------------- |
|
|
70
|
+
| replaceAlignStart | `boolean` | `true` | 是否将 `align*` 替换为 `aligned` |
|
|
71
|
+
|
|
72
|
+
## Token 类型
|
|
73
|
+
|
|
74
|
+
插件会生成以下两种 token:
|
|
75
|
+
|
|
76
|
+
### math_inline
|
|
77
|
+
|
|
78
|
+
行内数学公式 token:
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
{
|
|
82
|
+
type: 'math_inline',
|
|
83
|
+
tag: 'math',
|
|
84
|
+
content: 'E = mc^2',
|
|
85
|
+
markup: '$',
|
|
86
|
+
meta: { displayMode: false }
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### math_block
|
|
91
|
+
|
|
92
|
+
块级数学公式 token:
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
{
|
|
96
|
+
type: 'math_block',
|
|
97
|
+
tag: 'math',
|
|
98
|
+
content: '\\sum_{i=1}^{n} i = \\frac{n(n+1)}{2}',
|
|
99
|
+
markup: '$$',
|
|
100
|
+
block: true,
|
|
101
|
+
map: [startLine, endLine]
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## 公式示例
|
|
106
|
+
|
|
107
|
+
### 基础公式
|
|
108
|
+
|
|
109
|
+
```markdown
|
|
110
|
+
行内公式:$E = mc^2$
|
|
111
|
+
|
|
112
|
+
块级公式:
|
|
113
|
+
|
|
114
|
+
$$
|
|
115
|
+
E = mc^2
|
|
116
|
+
$$
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### 复杂公式
|
|
120
|
+
|
|
121
|
+
```markdown
|
|
122
|
+
$$
|
|
123
|
+
\\frac{-b \\pm \\sqrt{b^2 - 4ac}}{2a}
|
|
124
|
+
$$
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### 矩阵
|
|
128
|
+
|
|
129
|
+
```markdown
|
|
130
|
+
$$
|
|
131
|
+
\\begin{pmatrix}
|
|
132
|
+
a & b \\\\
|
|
133
|
+
c & d
|
|
134
|
+
\\end{pmatrix}
|
|
135
|
+
$$
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### 多行公式
|
|
139
|
+
|
|
140
|
+
```markdown
|
|
141
|
+
$$
|
|
142
|
+
\\begin{aligned}
|
|
143
|
+
f(x) &= x^2 + 2x + 1 \\\\
|
|
144
|
+
&= (x + 1)^2
|
|
145
|
+
\\end{aligned}
|
|
146
|
+
$$
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## 转义处理
|
|
150
|
+
|
|
151
|
+
插件会正确处理转义的分隔符:
|
|
152
|
+
|
|
153
|
+
```markdown
|
|
154
|
+
这不是公式:\$100
|
|
155
|
+
|
|
156
|
+
这是公式:$x = 100$
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## 与 KaTeX 配合
|
|
160
|
+
|
|
161
|
+
渲染由 `LatexContent` 组件完成,使用 KaTeX 库:
|
|
162
|
+
|
|
163
|
+
```vue
|
|
164
|
+
<template>
|
|
165
|
+
<LatexContent :token="latexTokens" />
|
|
166
|
+
</template>
|
|
167
|
+
|
|
168
|
+
<script setup lang="ts">
|
|
169
|
+
import { LatexContent } from '@blueking/chat-x';
|
|
170
|
+
|
|
171
|
+
// latexTokens 是包含 math_inline 或 math_block 的 token 数组
|
|
172
|
+
</script>
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## KaTeX 支持说明
|
|
176
|
+
|
|
177
|
+
KaTeX 支持的功能:
|
|
178
|
+
|
|
179
|
+
- 大多数 LaTeX 数学符号
|
|
180
|
+
- 分数、根号、指数
|
|
181
|
+
- 矩阵和数组
|
|
182
|
+
- 括号和分隔符
|
|
183
|
+
- 希腊字母和运算符
|
|
184
|
+
- 上下标和大型运算符
|
|
185
|
+
|
|
186
|
+
KaTeX 限制:
|
|
187
|
+
|
|
188
|
+
- 不支持 `align*` 环境(插件会自动替换为 `aligned`)
|
|
189
|
+
- 部分 LaTeX 宏不支持
|
|
190
|
+
|
|
191
|
+
## 使用场景
|
|
192
|
+
|
|
193
|
+
- AI 数学问答
|
|
194
|
+
- 技术文档展示
|
|
195
|
+
- 教育类应用
|
|
196
|
+
- 科学计算结果展示
|
|
197
|
+
|
|
198
|
+
## 注意事项
|
|
199
|
+
|
|
200
|
+
1. **双反斜杠**:在 JavaScript 字符串中,`\` 需要写成 `\\`
|
|
201
|
+
2. **环境支持**:建议使用 `aligned` 替代 `align*`
|
|
202
|
+
3. **性能考虑**:KaTeX 渲染在组件中异步进行,避免阻塞主线程
|
|
203
|
+
|
|
204
|
+
## 关联组件
|
|
205
|
+
|
|
206
|
+
- [LatexContent](../components/atomic/latex-content.md) — KaTeX 渲染
|
|
207
|
+
- [MarkdownContent](../components/atomic/markdown-content.md) — Markdown 内容
|
|
208
|
+
- [ContentRender](../components/molecular/content-render.md) — 内容渲染
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
<!-- AI SUMMARY -->
|
|
2
|
+
## 快速了解
|
|
3
|
+
|
|
4
|
+
markdownItMermaid 为 markdown-it 插件,将 ```mermaid 代码块转为带 data-mermaid-code、data-mermaid-idx 的占位 DOM,便于前端挂载渲染。 实际绘图由 Mermaid 动态导入在 MermaidContent 中完成,支持流式场景节流与缓存。ContentRender 驱动完整消息 Markdown 流程。
|
|
5
|
+
|
|
6
|
+
### 关联组件
|
|
7
|
+
- **mermaid-content** — 解析占位并渲染图表
|
|
8
|
+
- **markdown-content** — Markdown fence 管线
|
|
9
|
+
- **content-render** — 消息块级内容渲染
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
<!-- FULL DOC -->
|
|
13
|
+
|
|
14
|
+
# markdownItMermaid Mermaid 解析插件
|
|
15
|
+
|
|
16
|
+
> **分类**:plugin
|
|
17
|
+
|
|
18
|
+
Markdown-it Mermaid 解析插件,用于解析 Mermaid 图表代码块。
|
|
19
|
+
|
|
20
|
+
## 功能说明
|
|
21
|
+
|
|
22
|
+
此插件将 Mermaid 代码块转换为特定的 HTML 结构,实际的 Mermaid 渲染在 `MermaidContent` 组件中完成。
|
|
23
|
+
|
|
24
|
+
## 支持的语法
|
|
25
|
+
|
|
26
|
+
````markdown
|
|
27
|
+
```mermaid
|
|
28
|
+
graph TD
|
|
29
|
+
A[开始] --> B[结束]
|
|
30
|
+
```
|
|
31
|
+
````
|
|
32
|
+
|
|
33
|
+
## 基础用法
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
import MarkdownIt from 'markdown-it';
|
|
37
|
+
import { markdownItMermaid } from '@blueking/chat-x';
|
|
38
|
+
|
|
39
|
+
const md = new MarkdownIt().use(markdownItMermaid);
|
|
40
|
+
|
|
41
|
+
const html = md.render(`
|
|
42
|
+
\`\`\`mermaid
|
|
43
|
+
graph TD
|
|
44
|
+
A[开始] --> B{判断}
|
|
45
|
+
B -->|是| C[处理]
|
|
46
|
+
B -->|否| D[结束]
|
|
47
|
+
C --> D
|
|
48
|
+
\`\`\`
|
|
49
|
+
`);
|
|
50
|
+
|
|
51
|
+
// 输出:
|
|
52
|
+
// <div class="mermaid-wrapper" data-mermaid-code="..." data-mermaid-idx="0"></div>
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## 渲染结果
|
|
56
|
+
|
|
57
|
+
插件会将 Mermaid 代码块转换为以下 HTML:
|
|
58
|
+
|
|
59
|
+
```html
|
|
60
|
+
<div
|
|
61
|
+
class="mermaid-wrapper"
|
|
62
|
+
data-mermaid-code="graph%20TD%0A%20%20%20%20A%5B%E5%BC%80%E5%A7%8B%5D%20--%3E%20B%5B%E7%BB%93%E6%9D%9F%5D"
|
|
63
|
+
data-mermaid-idx="0"
|
|
64
|
+
></div>
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
- `data-mermaid-code`: URL 编码后的 Mermaid 代码
|
|
68
|
+
- `data-mermaid-idx`: 代码块索引
|
|
69
|
+
|
|
70
|
+
## 支持的图表类型
|
|
71
|
+
|
|
72
|
+
### 流程图 (Flowchart)
|
|
73
|
+
|
|
74
|
+
````markdown
|
|
75
|
+
```mermaid
|
|
76
|
+
graph TD
|
|
77
|
+
A[开始] --> B{条件判断}
|
|
78
|
+
B -->|是| C[执行操作]
|
|
79
|
+
B -->|否| D[结束]
|
|
80
|
+
C --> D
|
|
81
|
+
```
|
|
82
|
+
````
|
|
83
|
+
|
|
84
|
+
### 时序图 (Sequence Diagram)
|
|
85
|
+
|
|
86
|
+
````markdown
|
|
87
|
+
```mermaid
|
|
88
|
+
sequenceDiagram
|
|
89
|
+
participant A as 客户端
|
|
90
|
+
participant B as 服务器
|
|
91
|
+
A->>B: 请求
|
|
92
|
+
B-->>A: 响应
|
|
93
|
+
```
|
|
94
|
+
````
|
|
95
|
+
|
|
96
|
+
### 甘特图 (Gantt Chart)
|
|
97
|
+
|
|
98
|
+
````markdown
|
|
99
|
+
```mermaid
|
|
100
|
+
gantt
|
|
101
|
+
title 项目计划
|
|
102
|
+
dateFormat YYYY-MM-DD
|
|
103
|
+
section 阶段1
|
|
104
|
+
任务1 :a1, 2024-01-01, 30d
|
|
105
|
+
任务2 :after a1, 20d
|
|
106
|
+
section 阶段2
|
|
107
|
+
任务3 :2024-02-01, 12d
|
|
108
|
+
```
|
|
109
|
+
````
|
|
110
|
+
|
|
111
|
+
### 类图 (Class Diagram)
|
|
112
|
+
|
|
113
|
+
````markdown
|
|
114
|
+
```mermaid
|
|
115
|
+
classDiagram
|
|
116
|
+
class Animal {
|
|
117
|
+
+name: string
|
|
118
|
+
+age: int
|
|
119
|
+
+makeSound()
|
|
120
|
+
}
|
|
121
|
+
class Dog {
|
|
122
|
+
+breed: string
|
|
123
|
+
+bark()
|
|
124
|
+
}
|
|
125
|
+
Animal <|-- Dog
|
|
126
|
+
```
|
|
127
|
+
````
|
|
128
|
+
|
|
129
|
+
### 状态图 (State Diagram)
|
|
130
|
+
|
|
131
|
+
````markdown
|
|
132
|
+
```mermaid
|
|
133
|
+
stateDiagram-v2
|
|
134
|
+
[*] --> 待处理
|
|
135
|
+
待处理 --> 处理中: 开始处理
|
|
136
|
+
处理中 --> 已完成: 处理完成
|
|
137
|
+
处理中 --> 失败: 处理失败
|
|
138
|
+
已完成 --> [*]
|
|
139
|
+
失败 --> 待处理: 重试
|
|
140
|
+
```
|
|
141
|
+
````
|
|
142
|
+
|
|
143
|
+
### 饼图 (Pie Chart)
|
|
144
|
+
|
|
145
|
+
````markdown
|
|
146
|
+
```mermaid
|
|
147
|
+
pie title 语言使用占比
|
|
148
|
+
"JavaScript" : 45
|
|
149
|
+
"TypeScript" : 35
|
|
150
|
+
"Python" : 15
|
|
151
|
+
"其他" : 5
|
|
152
|
+
```
|
|
153
|
+
````
|
|
154
|
+
|
|
155
|
+
### ER 图 (Entity Relationship)
|
|
156
|
+
|
|
157
|
+
````markdown
|
|
158
|
+
```mermaid
|
|
159
|
+
erDiagram
|
|
160
|
+
用户 ||--o{ 订单 : 创建
|
|
161
|
+
订单 ||--|{ 订单明细 : 包含
|
|
162
|
+
商品 ||--o{ 订单明细 : 包含于
|
|
163
|
+
```
|
|
164
|
+
````
|
|
165
|
+
|
|
166
|
+
## 与 MermaidContent 组件配合
|
|
167
|
+
|
|
168
|
+
实际渲染由 `MermaidContent` 组件完成:
|
|
169
|
+
|
|
170
|
+
```vue
|
|
171
|
+
<template>
|
|
172
|
+
<MermaidContent
|
|
173
|
+
:token="mermaidTokens"
|
|
174
|
+
@mounted="handleMounted"
|
|
175
|
+
/>
|
|
176
|
+
</template>
|
|
177
|
+
|
|
178
|
+
<script setup lang="ts">
|
|
179
|
+
import { MermaidContent } from '@blueking/chat-x';
|
|
180
|
+
|
|
181
|
+
// mermaidTokens 是包含 mermaid fence 的 token 数组
|
|
182
|
+
const handleMounted = ({ el }) => {
|
|
183
|
+
console.log('Mermaid 图表渲染完成:', el);
|
|
184
|
+
};
|
|
185
|
+
</script>
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## 流式渲染
|
|
189
|
+
|
|
190
|
+
组件支持流式渲染,在代码输入过程中实时更新图表:
|
|
191
|
+
|
|
192
|
+
````vue
|
|
193
|
+
<template>
|
|
194
|
+
<ContentRender
|
|
195
|
+
:content="streamingContent"
|
|
196
|
+
:status="MessageStatus.Streaming"
|
|
197
|
+
/>
|
|
198
|
+
</template>
|
|
199
|
+
|
|
200
|
+
<script setup lang="ts">
|
|
201
|
+
import { ref } from 'vue';
|
|
202
|
+
import { ContentRender, MessageStatus } from '@blueking/chat-x';
|
|
203
|
+
|
|
204
|
+
const streamingContent = ref('');
|
|
205
|
+
|
|
206
|
+
// 模拟流式输入 Mermaid 代码
|
|
207
|
+
const simulateStreaming = async () => {
|
|
208
|
+
const code = '```mermaid\ngraph TD\n A --> B\n```';
|
|
209
|
+
for (const char of code) {
|
|
210
|
+
await new Promise(r => setTimeout(r, 50));
|
|
211
|
+
streamingContent.value += char;
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
</script>
|
|
215
|
+
````
|
|
216
|
+
|
|
217
|
+
## 错误处理
|
|
218
|
+
|
|
219
|
+
当 Mermaid 代码语法错误时:
|
|
220
|
+
|
|
221
|
+
1. 插件仍会正常解析并输出 HTML
|
|
222
|
+
2. `MermaidContent` 组件会捕获渲染错误
|
|
223
|
+
3. 控制台会输出警告信息
|
|
224
|
+
4. 图表区域保持空白,不会影响其他内容
|
|
225
|
+
|
|
226
|
+
## 性能优化
|
|
227
|
+
|
|
228
|
+
- **节流渲染**:流式输入时使用 100ms 节流
|
|
229
|
+
- **代码缓存**:相同代码不会重复渲染
|
|
230
|
+
- **异步加载**:Mermaid 库按需动态导入
|
|
231
|
+
|
|
232
|
+
## 使用场景
|
|
233
|
+
|
|
234
|
+
- AI 生成的流程图说明
|
|
235
|
+
- 技术文档中的架构图
|
|
236
|
+
- 项目计划展示
|
|
237
|
+
- 数据关系可视化
|
|
238
|
+
|
|
239
|
+
## 注意事项
|
|
240
|
+
|
|
241
|
+
1. **异步渲染**:Mermaid 库是动态导入的,首次渲染可能有短暂延迟
|
|
242
|
+
2. **语法验证**:组件会先验证语法,无效代码不会尝试渲染
|
|
243
|
+
3. **SVG 输出**:渲染结果是 SVG,可以自由缩放
|
|
244
|
+
4. **样式覆盖**:可以通过 CSS 自定义图表样式
|
|
245
|
+
|
|
246
|
+
## 关联组件
|
|
247
|
+
|
|
248
|
+
- [MermaidContent](../components/atomic/mermaid-content.md) — Mermaid 渲染
|
|
249
|
+
- [MarkdownContent](../components/atomic/markdown-content.md) — Markdown 内容
|
|
250
|
+
- [ContentRender](../components/molecular/content-render.md) — 内容渲染
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
<!-- AI SUMMARY -->
|
|
2
|
+
## 快速了解
|
|
3
|
+
|
|
4
|
+
MermaidContent 将 info 为 mermaid 的 fence token 渲染为 SVG,模块级懒加载单例 Mermaid。 具备流式 throttle、错误静默与 SVG ID 随机化,避免多实例冲突。 由 MarkdownContent 在解析 mermaid 代码块时调用。
|
|
5
|
+
|
|
6
|
+
### 关联组件
|
|
7
|
+
- **markdown-content** — 解析 mermaid 类型 fence 代码块后传入 token
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
<!-- FULL DOC -->
|
|
11
|
+
|
|
12
|
+
# MermaidContent Mermaid 图表渲染
|
|
13
|
+
|
|
14
|
+
> **层级**:原子组件 · **功能域**:内容渲染
|
|
15
|
+
|
|
16
|
+
Markdown Token 层的 Mermaid 图表渲染原子组件,被 `MarkdownContent` 在检测到 mermaid fence token 时自动调用,通常无需手动引入。
|
|
17
|
+
|
|
18
|
+
核心能力:**按需懒加载 Mermaid**(动态 import 单例)、**三级去重跳过**(代码比对 → 语法校验 → SVG 比对)、**100ms throttle** 流式防抖、**错误静默**(parse 失败时保持上一次 SVG)。
|
|
19
|
+
|
|
20
|
+
## 组件结构与渲染流程
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
props.token(Token[])
|
|
24
|
+
│
|
|
25
|
+
├─ extractMermaidCode(tokens)
|
|
26
|
+
│ → 遍历找第一个 type==='fence' && info.trim()==='mermaid' && content 非空的 token
|
|
27
|
+
│ → 返回 content(无匹配返回空字符串)
|
|
28
|
+
│
|
|
29
|
+
└─ renderMermaid(throttle 100ms,leading + trailing)
|
|
30
|
+
│
|
|
31
|
+
├─ 1. newCode === lastMermaidCode → return(代码未变,跳过)
|
|
32
|
+
├─ 2. lastMermaidCode = newCode
|
|
33
|
+
├─ 3. getMermaidInstance() → 动态 import('mermaid') 单例,初始化一次
|
|
34
|
+
├─ 4. mermaid.parse(code, { suppressErrors: true })
|
|
35
|
+
│ → !isValid → return(语法无效,保持上次 SVG)
|
|
36
|
+
├─ 5. mermaid.render('mermaid-content-' + randomId, code) → { svg }
|
|
37
|
+
├─ 6. svgDomStr.value === svg → return(SVG 无变化,跳过)
|
|
38
|
+
└─ 7. svgDomStr.value = svg
|
|
39
|
+
nextTick → emit('mounted', { get el() { return mermaidContentRef.value } })
|
|
40
|
+
|
|
41
|
+
模板:
|
|
42
|
+
div.mermaid-content(:key="svgDomStr",v-html="svgDomStr")
|
|
43
|
+
注::key 绑定 svgDomStr,每次 SVG 变化会重建 div 而非就地 patch
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## 基础用法
|
|
47
|
+
|
|
48
|
+
```vue
|
|
49
|
+
<template>
|
|
50
|
+
<MermaidContent
|
|
51
|
+
:token="tokens"
|
|
52
|
+
@mounted="handleMounted"
|
|
53
|
+
/>
|
|
54
|
+
</template>
|
|
55
|
+
|
|
56
|
+
<script setup lang="ts">
|
|
57
|
+
import { MermaidContent } from '@blueking/chat-x';
|
|
58
|
+
import type { Token } from 'markdown-it';
|
|
59
|
+
|
|
60
|
+
const tokens: Token[] = [
|
|
61
|
+
{
|
|
62
|
+
type: 'fence',
|
|
63
|
+
tag: 'code',
|
|
64
|
+
info: 'mermaid',
|
|
65
|
+
content: `graph TD
|
|
66
|
+
A[开始] --> B{判断}
|
|
67
|
+
B -->|是| C[执行]
|
|
68
|
+
B -->|否| D[结束]`,
|
|
69
|
+
} as Token,
|
|
70
|
+
];
|
|
71
|
+
|
|
72
|
+
const handleMounted = ({ el }: { el: HTMLElement | null }) => {
|
|
73
|
+
// el 是 lazy getter,值为渲染后的 .mermaid-content 元素
|
|
74
|
+
console.log('渲染完成:', el);
|
|
75
|
+
};
|
|
76
|
+
</script>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## 支持的图表类型
|
|
80
|
+
|
|
81
|
+
### 时序图(Sequence Diagram)
|
|
82
|
+
|
|
83
|
+
### 甘特图(Gantt)
|
|
84
|
+
|
|
85
|
+
### 类图(Class Diagram)
|
|
86
|
+
|
|
87
|
+
### 状态图(State Diagram)
|
|
88
|
+
|
|
89
|
+
### 饼图(Pie Chart)
|
|
90
|
+
|
|
91
|
+
## 流式渲染
|
|
92
|
+
|
|
93
|
+
流式输入时 Mermaid 语法逐步完整,组件通过 throttle + `parse` 语法校验避免无效渲染:
|
|
94
|
+
|
|
95
|
+
```vue
|
|
96
|
+
<template>
|
|
97
|
+
<MermaidContent :token="streamingTokens" />
|
|
98
|
+
</template>
|
|
99
|
+
|
|
100
|
+
<script setup lang="ts">
|
|
101
|
+
import { ref } from 'vue';
|
|
102
|
+
import { MermaidContent } from '@blueking/chat-x';
|
|
103
|
+
|
|
104
|
+
const streamingTokens = ref([{ type: 'fence', tag: 'code', info: 'mermaid', content: '' }]);
|
|
105
|
+
|
|
106
|
+
const simulate = async () => {
|
|
107
|
+
const code = `graph TD\n A[开始] --> B[处理]\n B --> C[结束]`;
|
|
108
|
+
let content = '';
|
|
109
|
+
for (const char of code) {
|
|
110
|
+
await new Promise(r => setTimeout(r, 50));
|
|
111
|
+
content += char;
|
|
112
|
+
streamingTokens.value = [{ type: 'fence', tag: 'code', info: 'mermaid', content }];
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
</script>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**流式过程中的行为**:
|
|
119
|
+
|
|
120
|
+
| 阶段 | `parse` 结果 | 行为 |
|
|
121
|
+
| -------------------------- | ------------ | ----------------------------------------- |
|
|
122
|
+
| 代码未变化 | — | 三级去重第 1 关:直接跳过,不调用 Mermaid |
|
|
123
|
+
| 语法不完整(如 `graph T`) | `false` | 三级去重第 2 关:跳过渲染,保持上次 SVG |
|
|
124
|
+
| 语法完整,SVG 相同 | `true` | 三级去重第 3 关:跳过 DOM 更新 |
|
|
125
|
+
| 语法完整,SVG 变化 | `true` | 更新 SVG,触发 `mounted` 事件 |
|
|
126
|
+
|
|
127
|
+
## API
|
|
128
|
+
|
|
129
|
+
### Props
|
|
130
|
+
|
|
131
|
+
| 属性名 | 类型 | 必填 | 说明 |
|
|
132
|
+
| ------ | --------- | ---- | -------------------------------------------------------------------------------------------- |
|
|
133
|
+
| token | `Token[]` | ✓ | markdown-it Token 数组;组件自动从中提取第一个 `type==='fence' && info==='mermaid'` 的 token |
|
|
134
|
+
|
|
135
|
+
### Events
|
|
136
|
+
|
|
137
|
+
| 事件名 | 参数 | 触发时机 |
|
|
138
|
+
| ------- | ----------------------------- | ---------------------------------------------------------------------------------- |
|
|
139
|
+
| mounted | `{ el: HTMLElement \| null }` | SVG 更新后的 `nextTick`;`el` 为 lazy getter,返回当前 `.mermaid-content` 元素引用 |
|
|
140
|
+
|
|
141
|
+
### Token 结构
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
// 组件只识别 type === 'fence' 且 info.trim() === 'mermaid' 的 token
|
|
145
|
+
{
|
|
146
|
+
type: 'fence';
|
|
147
|
+
tag?: 'code'; // 可选
|
|
148
|
+
info: 'mermaid'; // 必须严格等于 'mermaid'(trim 后)
|
|
149
|
+
content: string; // Mermaid 图表定义语法
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## 性能与错误处理细节
|
|
154
|
+
|
|
155
|
+
### 单例 Mermaid 实例
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
// 模块级变量,所有 MermaidContent 实例共享同一个 mermaid 模块
|
|
159
|
+
let mermaidInstance: MermaidModule | null = null;
|
|
160
|
+
|
|
161
|
+
// 初始化时调用一次(suppressErrorRendering: true 抑制 Mermaid 内部错误 UI)
|
|
162
|
+
mermaidInstance.default.initialize({ suppressErrorRendering: true });
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
首次渲染因动态 import 会有约 200~500ms 的网络加载延迟,之后复用实例无额外开销。
|
|
166
|
+
|
|
167
|
+
### SVG ID 随机化
|
|
168
|
+
|
|
169
|
+
每次调用 `mermaid.render` 时生成随机 ID:
|
|
170
|
+
|
|
171
|
+
```typescript
|
|
172
|
+
mermaid.default.render('mermaid-content-' + Math.random().toString(36).substring(2, 15), code);
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
避免多个 MermaidContent 实例或同一实例多次渲染时 DOM ID 冲突。
|
|
176
|
+
|
|
177
|
+
### 错误静默
|
|
178
|
+
|
|
179
|
+
- `mermaid.parse` 失败(语法无效)→ `return`,不修改 `svgDomStr`,保持上次成功的 SVG
|
|
180
|
+
- `mermaid.render` 抛出异常 → `console.warn`,不修改 `svgDomStr`,保持上次成功的 SVG
|
|
181
|
+
- 两种情况下组件界面均无错误提示(静默降级)
|
|
182
|
+
|
|
183
|
+
## 关联组件
|
|
184
|
+
|
|
185
|
+
- [MarkdownContent](./markdown-content.md) — mermaid fence token 的来源与挂载
|