@data_wise/hyper-markdown 1.1.6 → 1.2.0
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/LICENSE +200 -200
- package/README.md +538 -538
- package/dist/hyper-markdown.css +1 -1
- package/dist/hyper-markdown.es.js +14483 -14420
- package/dist/hyper-markdown.umd.js +275 -359
- package/package.json +70 -70
- package/types/index.d.ts +46 -34
package/README.md
CHANGED
|
@@ -1,539 +1,539 @@
|
|
|
1
|
-
# @data_wise/hyper-markdown
|
|
2
|
-
|
|
3
|
-
一个功能强大的 Vue 3 Markdown 编辑器,支持 ECharts、Mermaid、KaTeX 和数据集等丰富功能。
|
|
4
|
-
|
|
5
|
-
## 安装
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npm install @data_wise/hyper-markdown
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
## CSS 导入
|
|
12
|
-
|
|
13
|
-
组件已经内置了所有必要的样式文件,您只需要在项目中导入一次CSS即可使用所有功能:
|
|
14
|
-
|
|
15
|
-
### 在 Vue 项目中导入
|
|
16
|
-
|
|
17
|
-
```javascript
|
|
18
|
-
import '@data_wise/hyper-markdown/dist/hyper-markdown.css'
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
### 完整使用示例
|
|
22
|
-
|
|
23
|
-
```vue
|
|
24
|
-
<template>
|
|
25
|
-
<div id="app">
|
|
26
|
-
<MarkdownEditor
|
|
27
|
-
:content="markdownContent"
|
|
28
|
-
:editable="true"
|
|
29
|
-
/>
|
|
30
|
-
</div>
|
|
31
|
-
</template>
|
|
32
|
-
|
|
33
|
-
<script>
|
|
34
|
-
import MarkdownEditor from '@data_wise/hyper-markdown'
|
|
35
|
-
import '@data_wise/hyper-markdown/dist/hyper-markdown.css' // 导入CSS
|
|
36
|
-
|
|
37
|
-
export default {
|
|
38
|
-
name: 'App',
|
|
39
|
-
components: {
|
|
40
|
-
MarkdownEditor
|
|
41
|
-
},
|
|
42
|
-
data() {
|
|
43
|
-
return {
|
|
44
|
-
markdownContent: '# 欢迎使用 Hyper Markdown'
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
</script>
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
### 包含的样式
|
|
52
|
-
|
|
53
|
-
导入的CSS文件包含以下所有必要的样式:
|
|
54
|
-
|
|
55
|
-
- **GitHub Markdown 样式** - 标准的Markdown渲染样式
|
|
56
|
-
- **KaTeX 数学公式样式** - 数学公式渲染支持
|
|
57
|
-
- **ECharts 图表样式** - 图表组件样式
|
|
58
|
-
- **Mermaid 流程图样式** - 流程图渲染样式
|
|
59
|
-
- **数据集表格样式** - 数据表格展示样式
|
|
60
|
-
- **自定义容器样式** - 警告、提示等容器样式
|
|
61
|
-
- **栅格布局样式** - 响应式布局支持
|
|
62
|
-
|
|
63
|
-
### 注意事项
|
|
64
|
-
|
|
65
|
-
- 只需要导入一次CSS文件,所有组件功能即可正常工作
|
|
66
|
-
- CSS文件已经过优化,所有样式都打包到单个文件中
|
|
67
|
-
- 无需额外配置或导入其他CSS文件
|
|
68
|
-
|
|
69
|
-
## 快速开始
|
|
70
|
-
|
|
71
|
-
### 组件属性
|
|
72
|
-
|
|
73
|
-
| 属性 | 类型 | 默认值 | 说明 |
|
|
74
|
-
|------|------|--------|------|
|
|
75
|
-
| `content` | String | `''` | Markdown 内容(支持 v-model) |
|
|
76
|
-
| `editable` | Boolean | `false` | 是否启用编辑模式 |
|
|
77
|
-
| `defaultShowEditor` | Boolean | `true` | 编辑器初始显示状态(仅在 editable 为 true 时有效) |
|
|
78
|
-
| `datasource` | Object | - | 数据源配置对象(可选) |
|
|
79
|
-
|
|
80
|
-
### 组件事件
|
|
81
|
-
|
|
82
|
-
| 事件名 | 参数 | 说明 |
|
|
83
|
-
|--------|------|------|
|
|
84
|
-
| `update:content` | `(content: string)` | 内容更新时触发 |
|
|
85
|
-
| `errors` | `(errors: Array)` | 渲染错误时触发,返回错误数组 |
|
|
86
|
-
|
|
87
|
-
#### 错误对象格式
|
|
88
|
-
|
|
89
|
-
```javascript
|
|
90
|
-
{
|
|
91
|
-
line: 10, // 错误所在行号
|
|
92
|
-
type: 'ECharts', // 错误类型:ECharts, Dataset, Mermaid, Container
|
|
93
|
-
message: '配置错误', // 错误描述
|
|
94
|
-
code: '```echarts...', // 相关代码片段
|
|
95
|
-
severity: 'error' // 错误级别
|
|
96
|
-
}
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
#### 错误收集说明
|
|
100
|
-
|
|
101
|
-
组件会自动收集以下类型的渲染错误:
|
|
102
|
-
|
|
103
|
-
- **ECharts 错误**:图表配置错误、数据格式错误等
|
|
104
|
-
- **Mermaid 错误**:流程图语法错误
|
|
105
|
-
- **Dataset 错误**:数据集格式错误、数据源查询失败等
|
|
106
|
-
- **Container 错误**:容器配置错误(如 cell 宽度超出范围)
|
|
107
|
-
|
|
108
|
-
错误会在渲染完成后自动收集,并通过 `@errors` 事件传递给外部。你可以:
|
|
109
|
-
|
|
110
|
-
1. **监听事件**:`@errors="handleErrors"` 实时获取错误
|
|
111
|
-
2. **主动获取**:`this.$refs.editor.getErrors()` 获取当前错误列表
|
|
112
|
-
|
|
113
|
-
### 基础用法
|
|
114
|
-
|
|
115
|
-
```vue
|
|
116
|
-
<template>
|
|
117
|
-
<div id="app">
|
|
118
|
-
<MarkdownEditor
|
|
119
|
-
:content="markdownContent"
|
|
120
|
-
:editable="true"
|
|
121
|
-
@errors="handleErrors"
|
|
122
|
-
/>
|
|
123
|
-
</div>
|
|
124
|
-
</template>
|
|
125
|
-
|
|
126
|
-
<script>
|
|
127
|
-
import MarkdownEditor from '@data_wise/hyper-markdown'
|
|
128
|
-
|
|
129
|
-
export default {
|
|
130
|
-
name: 'App',
|
|
131
|
-
components: {
|
|
132
|
-
MarkdownEditor
|
|
133
|
-
},
|
|
134
|
-
data() {
|
|
135
|
-
return {
|
|
136
|
-
markdownContent: '# 欢迎使用 Hyper Markdown'
|
|
137
|
-
}
|
|
138
|
-
},
|
|
139
|
-
methods: {
|
|
140
|
-
handleErrors(errors) {
|
|
141
|
-
// 处理渲染错误
|
|
142
|
-
if (errors.length > 0) {
|
|
143
|
-
console.log('发现渲染错误:', errors)
|
|
144
|
-
errors.forEach(error => {
|
|
145
|
-
console.error(`第 ${error.line} 行 [${error.type}]: ${error.message}`)
|
|
146
|
-
})
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
</script>
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
### 控制编辑器显示状态
|
|
155
|
-
|
|
156
|
-
```vue
|
|
157
|
-
<template>
|
|
158
|
-
<div id="app">
|
|
159
|
-
<!-- 默认隐藏编辑器,只显示预览 -->
|
|
160
|
-
<MarkdownEditor
|
|
161
|
-
:content="markdownContent"
|
|
162
|
-
:editable="true"
|
|
163
|
-
:default-show-editor="false"
|
|
164
|
-
/>
|
|
165
|
-
</div>
|
|
166
|
-
</template>
|
|
167
|
-
|
|
168
|
-
<script>
|
|
169
|
-
import MarkdownEditor from '@data_wise/hyper-markdown'
|
|
170
|
-
|
|
171
|
-
export default {
|
|
172
|
-
name: 'App',
|
|
173
|
-
components: {
|
|
174
|
-
MarkdownEditor
|
|
175
|
-
},
|
|
176
|
-
data() {
|
|
177
|
-
return {
|
|
178
|
-
markdownContent: '# 欢迎使用 Hyper Markdown'
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
</script>
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
### 使用数据源功能
|
|
186
|
-
|
|
187
|
-
要使用数据源查询功能,需要注入 `datasource` 属性:
|
|
188
|
-
|
|
189
|
-
```vue
|
|
190
|
-
<template>
|
|
191
|
-
<div id="app">
|
|
192
|
-
<MarkdownEditor
|
|
193
|
-
v-model:content="markdownContent"
|
|
194
|
-
:editable="true"
|
|
195
|
-
:datasource="datasource"
|
|
196
|
-
/>
|
|
197
|
-
</div>
|
|
198
|
-
</template>
|
|
199
|
-
|
|
200
|
-
<script>
|
|
201
|
-
import MarkdownEditor from '@data_wise/hyper-markdown'
|
|
202
|
-
import { datasource } from './utils/dataSource' // 导入数据源函数
|
|
203
|
-
|
|
204
|
-
export default {
|
|
205
|
-
name: 'App',
|
|
206
|
-
components: {
|
|
207
|
-
MarkdownEditor
|
|
208
|
-
},
|
|
209
|
-
data() {
|
|
210
|
-
return {
|
|
211
|
-
markdownContent: '# 欢迎使用 Hyper Markdown',
|
|
212
|
-
datasource: datasource // 注入数据源函数
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
</script>
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
## 数据源配置
|
|
220
|
-
|
|
221
|
-
### 数据源函数接口
|
|
222
|
-
|
|
223
|
-
`datasource` 对象必须包含以下函数:
|
|
224
|
-
|
|
225
|
-
```javascript
|
|
226
|
-
{
|
|
227
|
-
// 获取数据源数据
|
|
228
|
-
getDataSource(sourceId, sql, options) => Promise<Object>
|
|
229
|
-
|
|
230
|
-
// 获取数据源列表
|
|
231
|
-
getDataSourceList() => Array
|
|
232
|
-
|
|
233
|
-
// 清除数据缓存
|
|
234
|
-
clearDataSourceCache(sourceId) => void
|
|
235
|
-
|
|
236
|
-
// 测试数据源连接
|
|
237
|
-
testDataSourceConnection(sourceId) => Promise<boolean>
|
|
238
|
-
}
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
### 内置数据源
|
|
242
|
-
|
|
243
|
-
项目内置了以下模拟数据源:
|
|
244
|
-
|
|
245
|
-
- **sales_db** - 销售数据库(MySQL)
|
|
246
|
-
- **user_db** - 用户数据库(PostgreSQL)
|
|
247
|
-
- **finance_db** - 财务数据库(Oracle)
|
|
248
|
-
|
|
249
|
-
### 自定义数据源
|
|
250
|
-
|
|
251
|
-
您可以创建自定义数据源函数:
|
|
252
|
-
|
|
253
|
-
```javascript
|
|
254
|
-
// 自定义数据源函数示例
|
|
255
|
-
const customDatasource = {
|
|
256
|
-
async getDataSource(sourceId, sql, options = {}) {
|
|
257
|
-
// 实现数据获取逻辑
|
|
258
|
-
return {
|
|
259
|
-
source: [], // 数据数组
|
|
260
|
-
dimensions: [], // 维度字段
|
|
261
|
-
metadata: {
|
|
262
|
-
sourceId: sourceId,
|
|
263
|
-
sql: sql,
|
|
264
|
-
count: 0,
|
|
265
|
-
timestamp: new Date().toISOString()
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
},
|
|
269
|
-
|
|
270
|
-
getDataSourceList() {
|
|
271
|
-
return [
|
|
272
|
-
{
|
|
273
|
-
id: 'my_db',
|
|
274
|
-
name: '我的数据库',
|
|
275
|
-
type: 'mysql',
|
|
276
|
-
description: '自定义数据源'
|
|
277
|
-
}
|
|
278
|
-
]
|
|
279
|
-
},
|
|
280
|
-
|
|
281
|
-
clearDataSourceCache(sourceId = null) {
|
|
282
|
-
// 清除缓存逻辑
|
|
283
|
-
},
|
|
284
|
-
|
|
285
|
-
async testDataSourceConnection(sourceId) {
|
|
286
|
-
return true
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
```
|
|
290
|
-
|
|
291
|
-
## 特有插件语法
|
|
292
|
-
|
|
293
|
-
### 1. ECharts 图表
|
|
294
|
-
|
|
295
|
-
使用 `echarts` 代码块渲染图表:
|
|
296
|
-
|
|
297
|
-
````markdown
|
|
298
|
-
```echarts
|
|
299
|
-
{
|
|
300
|
-
"title": {
|
|
301
|
-
"text": "销售数据"
|
|
302
|
-
},
|
|
303
|
-
"xAxis": {
|
|
304
|
-
"type": "category",
|
|
305
|
-
"data": ["一月", "二月", "三月"]
|
|
306
|
-
},
|
|
307
|
-
"yAxis": {
|
|
308
|
-
"type": "value"
|
|
309
|
-
},
|
|
310
|
-
"series": [{
|
|
311
|
-
"data": [120, 200, 150],
|
|
312
|
-
"type": "bar"
|
|
313
|
-
}]
|
|
314
|
-
}
|
|
315
|
-
```
|
|
316
|
-
````
|
|
317
|
-
|
|
318
|
-
### 2. Mermaid 流程图
|
|
319
|
-
|
|
320
|
-
使用 `mermaid` 代码块渲染流程图:
|
|
321
|
-
|
|
322
|
-
````markdown
|
|
323
|
-
```mermaid
|
|
324
|
-
graph TD
|
|
325
|
-
A[开始] --> B{条件判断}
|
|
326
|
-
B -->|是| C[执行操作]
|
|
327
|
-
B -->|否| D[结束]
|
|
328
|
-
C --> D
|
|
329
|
-
```
|
|
330
|
-
````
|
|
331
|
-
|
|
332
|
-
### 3. 数据集功能
|
|
333
|
-
|
|
334
|
-
使用 `dataset` 代码块定义数据集:
|
|
335
|
-
|
|
336
|
-
````markdown
|
|
337
|
-
```dataset datasetId: sales_data
|
|
338
|
-
{
|
|
339
|
-
dimensions: ["产品", "2020", "2021", "2022"],
|
|
340
|
-
source: [
|
|
341
|
-
{产品: "产品A", 2020: 100, 2021: 120, 2022: 150},
|
|
342
|
-
{产品: "产品B", 2020: 80, 2021: 90, 2022: 110},
|
|
343
|
-
{产品: "产品C", 2020: 60, 2021: 70, 2022: 85}
|
|
344
|
-
]
|
|
345
|
-
}
|
|
346
|
-
```
|
|
347
|
-
|
|
348
|
-
然后在 ECharts 中使用数据集:
|
|
349
|
-
|
|
350
|
-
```echarts
|
|
351
|
-
{
|
|
352
|
-
dataset: dataset['sales_data'],
|
|
353
|
-
title: { text: "产品销售趋势" },
|
|
354
|
-
xAxis: { type: "category" },
|
|
355
|
-
yAxis: { type: "value" },
|
|
356
|
-
series: [{
|
|
357
|
-
type: "bar",
|
|
358
|
-
encode: { x: "产品", y: "2020" }
|
|
359
|
-
}]
|
|
360
|
-
}
|
|
361
|
-
```
|
|
362
|
-
````
|
|
363
|
-
|
|
364
|
-
#### ⚠️ 使用 dataset + encode 时的注意事项
|
|
365
|
-
|
|
366
|
-
使用 `dataset` + `encode` 时,formatter 必须用**函数形式**,字符串模板会显示 `[object Object]`:
|
|
367
|
-
|
|
368
|
-
````markdown
|
|
369
|
-
```echarts
|
|
370
|
-
{
|
|
371
|
-
dataset: dataset['sales_data'],
|
|
372
|
-
series: [{
|
|
373
|
-
type: "pie",
|
|
374
|
-
encode: { itemName: "产品", value: "销量" },
|
|
375
|
-
label: {
|
|
376
|
-
// ❌ 错误:formatter: "{b}: {c}次 ({d}%)"
|
|
377
|
-
// ✅ 正确:使用函数
|
|
378
|
-
formatter: function(params) {
|
|
379
|
-
return params.data['产品'] + ': ' + params.data['销量'] + '次 (' + params.percent + '%)';
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
}]
|
|
383
|
-
}
|
|
384
|
-
```
|
|
385
|
-
````
|
|
386
|
-
|
|
387
|
-
### 4. SQL 数据源查询
|
|
388
|
-
|
|
389
|
-
支持从数据源查询数据,需要先注入 `datasource` 属性:
|
|
390
|
-
|
|
391
|
-
#### 查询语法格式
|
|
392
|
-
|
|
393
|
-
支持两种格式的数据源查询:
|
|
394
|
-
|
|
395
|
-
**格式一:使用 datasourceId 指定数据源**
|
|
396
|
-
|
|
397
|
-
````markdown
|
|
398
|
-
```dataset datasetId: sql_query_1 datasourceId: sales_db
|
|
399
|
-
SELECT 产品, 年份, 销售额 FROM sales_data WHERE 销售额 > 100
|
|
400
|
-
```
|
|
401
|
-
````
|
|
402
|
-
|
|
403
|
-
**格式二:使用默认数据源(sales_db)**
|
|
404
|
-
|
|
405
|
-
````markdown
|
|
406
|
-
```dataset datasetId: sql_query_1
|
|
407
|
-
SELECT 产品, 年份, 销售额 FROM sales_data WHERE 销售额 > 100
|
|
408
|
-
```
|
|
409
|
-
````
|
|
410
|
-
|
|
411
|
-
#### 使用查询结果
|
|
412
|
-
|
|
413
|
-
查询结果会自动转换为标准数据集格式,可以在 ECharts 中使用:
|
|
414
|
-
|
|
415
|
-
```echarts
|
|
416
|
-
{
|
|
417
|
-
dataset: dataset['sql_query_1'],
|
|
418
|
-
title: { text: "产品销售趋势" },
|
|
419
|
-
xAxis: { type: "category" },
|
|
420
|
-
yAxis: { type: "value" },
|
|
421
|
-
series: [{
|
|
422
|
-
type: "bar",
|
|
423
|
-
encode: { x: "产品", y: "销售额" }
|
|
424
|
-
}]
|
|
425
|
-
}
|
|
426
|
-
```
|
|
427
|
-
|
|
428
|
-
#### 示例:完整的数据源查询
|
|
429
|
-
|
|
430
|
-
````markdown
|
|
431
|
-
```dataset datasetId: user_analysis datasourceId: user_db
|
|
432
|
-
SELECT 地区, 用户数, 活跃度 FROM user_data WHERE 用户数 > 1000 AND 活跃度 > 0.7
|
|
433
|
-
```
|
|
434
|
-
|
|
435
|
-
```echarts
|
|
436
|
-
{
|
|
437
|
-
dataset: dataset['user_analysis'],
|
|
438
|
-
title: { text: "用户分布分析" },
|
|
439
|
-
xAxis: { type: "category" },
|
|
440
|
-
yAxis: { type: "value" },
|
|
441
|
-
series: [{
|
|
442
|
-
type: "bar",
|
|
443
|
-
encode: { x: "地区", y: "用户数" }
|
|
444
|
-
}]
|
|
445
|
-
}
|
|
446
|
-
```
|
|
447
|
-
````
|
|
448
|
-
|
|
449
|
-
### 5. 栅格布局
|
|
450
|
-
|
|
451
|
-
使用 `cell` 容器创建响应式布局:
|
|
452
|
-
|
|
453
|
-
````markdown
|
|
454
|
-
::: cell 6
|
|
455
|
-
### 大单元格 (6格宽)
|
|
456
|
-
这是一个较大的单元格,宽度占6格
|
|
457
|
-
|
|
458
|
-
可以包含任何 Markdown 语法:
|
|
459
|
-
- 列表项
|
|
460
|
-
- 图片
|
|
461
|
-
- 代码等
|
|
462
|
-
:::
|
|
463
|
-
|
|
464
|
-
::: cell 3
|
|
465
|
-
### 中等单元格 (3格宽)
|
|
466
|
-
中等大小的单元格
|
|
467
|
-
|
|
468
|
-
```javascript
|
|
469
|
-
console.log('支持代码块');
|
|
470
|
-
```
|
|
471
|
-
:::
|
|
472
|
-
````
|
|
473
|
-
|
|
474
|
-
### 6. 自定义容器
|
|
475
|
-
|
|
476
|
-
支持多种自定义容器:
|
|
477
|
-
|
|
478
|
-
````markdown
|
|
479
|
-
::: warning
|
|
480
|
-
这是一个警告信息
|
|
481
|
-
:::
|
|
482
|
-
|
|
483
|
-
::: info
|
|
484
|
-
这是一个信息提示
|
|
485
|
-
:::
|
|
486
|
-
|
|
487
|
-
::: tip
|
|
488
|
-
这是一个小贴士
|
|
489
|
-
:::
|
|
490
|
-
|
|
491
|
-
::: danger
|
|
492
|
-
这是一个危险提示
|
|
493
|
-
:::
|
|
494
|
-
````
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
## 数据源使用注意事项
|
|
499
|
-
|
|
500
|
-
### 错误处理
|
|
501
|
-
|
|
502
|
-
当数据源查询失败时,会显示错误信息:
|
|
503
|
-
|
|
504
|
-
- **数据源未注入**:"数据源获取函数未注入,请确保已设置datasource属性"
|
|
505
|
-
- **数据源不存在**:"数据源不存在: {sourceId}"
|
|
506
|
-
- **SQL语法错误**:"SQL查询语句不能为空" 或 "数据源查询格式不正确"
|
|
507
|
-
|
|
508
|
-
### 缓存机制
|
|
509
|
-
|
|
510
|
-
数据源查询结果会自动缓存,避免重复查询:
|
|
511
|
-
|
|
512
|
-
- 相同查询条件会返回缓存结果
|
|
513
|
-
- 可以通过 `clearDataSourceCache()` 清除缓存
|
|
514
|
-
- 使用 `{forceRefresh: true}` 选项强制刷新
|
|
515
|
-
|
|
516
|
-
### 性能优化
|
|
517
|
-
|
|
518
|
-
- 数据源查询支持异步处理
|
|
519
|
-
- 支持延迟加载选项 `{delay: 500}`
|
|
520
|
-
- 内置数据源使用模拟数据,无网络请求
|
|
521
|
-
|
|
522
|
-
## 特性
|
|
523
|
-
|
|
524
|
-
- ✅ Vue 3 支持
|
|
525
|
-
- ✅ ECharts 图表渲染
|
|
526
|
-
- ✅ Mermaid 流程图支持
|
|
527
|
-
- ✅ KaTeX 数学公式
|
|
528
|
-
- ✅ 数据集表格展示
|
|
529
|
-
- ✅ 可编辑区域
|
|
530
|
-
- ✅ 自定义容器
|
|
531
|
-
- ✅ 响应式设计
|
|
532
|
-
- ✅ TypeScript 支持
|
|
533
|
-
- ✅ 数据源查询功能
|
|
534
|
-
- ✅ SQL 语法支持
|
|
535
|
-
- ✅ 数据缓存机制
|
|
536
|
-
|
|
537
|
-
## 许可证
|
|
538
|
-
|
|
1
|
+
# @data_wise/hyper-markdown
|
|
2
|
+
|
|
3
|
+
一个功能强大的 Vue 3 Markdown 编辑器,支持 ECharts、Mermaid、KaTeX 和数据集等丰富功能。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @data_wise/hyper-markdown
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## CSS 导入
|
|
12
|
+
|
|
13
|
+
组件已经内置了所有必要的样式文件,您只需要在项目中导入一次CSS即可使用所有功能:
|
|
14
|
+
|
|
15
|
+
### 在 Vue 项目中导入
|
|
16
|
+
|
|
17
|
+
```javascript
|
|
18
|
+
import '@data_wise/hyper-markdown/dist/hyper-markdown.css'
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### 完整使用示例
|
|
22
|
+
|
|
23
|
+
```vue
|
|
24
|
+
<template>
|
|
25
|
+
<div id="app">
|
|
26
|
+
<MarkdownEditor
|
|
27
|
+
:content="markdownContent"
|
|
28
|
+
:editable="true"
|
|
29
|
+
/>
|
|
30
|
+
</div>
|
|
31
|
+
</template>
|
|
32
|
+
|
|
33
|
+
<script>
|
|
34
|
+
import MarkdownEditor from '@data_wise/hyper-markdown'
|
|
35
|
+
import '@data_wise/hyper-markdown/dist/hyper-markdown.css' // 导入CSS
|
|
36
|
+
|
|
37
|
+
export default {
|
|
38
|
+
name: 'App',
|
|
39
|
+
components: {
|
|
40
|
+
MarkdownEditor
|
|
41
|
+
},
|
|
42
|
+
data() {
|
|
43
|
+
return {
|
|
44
|
+
markdownContent: '# 欢迎使用 Hyper Markdown'
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
</script>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### 包含的样式
|
|
52
|
+
|
|
53
|
+
导入的CSS文件包含以下所有必要的样式:
|
|
54
|
+
|
|
55
|
+
- **GitHub Markdown 样式** - 标准的Markdown渲染样式
|
|
56
|
+
- **KaTeX 数学公式样式** - 数学公式渲染支持
|
|
57
|
+
- **ECharts 图表样式** - 图表组件样式
|
|
58
|
+
- **Mermaid 流程图样式** - 流程图渲染样式
|
|
59
|
+
- **数据集表格样式** - 数据表格展示样式
|
|
60
|
+
- **自定义容器样式** - 警告、提示等容器样式
|
|
61
|
+
- **栅格布局样式** - 响应式布局支持
|
|
62
|
+
|
|
63
|
+
### 注意事项
|
|
64
|
+
|
|
65
|
+
- 只需要导入一次CSS文件,所有组件功能即可正常工作
|
|
66
|
+
- CSS文件已经过优化,所有样式都打包到单个文件中
|
|
67
|
+
- 无需额外配置或导入其他CSS文件
|
|
68
|
+
|
|
69
|
+
## 快速开始
|
|
70
|
+
|
|
71
|
+
### 组件属性
|
|
72
|
+
|
|
73
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
74
|
+
|------|------|--------|------|
|
|
75
|
+
| `content` | String | `''` | Markdown 内容(支持 v-model) |
|
|
76
|
+
| `editable` | Boolean | `false` | 是否启用编辑模式 |
|
|
77
|
+
| `defaultShowEditor` | Boolean | `true` | 编辑器初始显示状态(仅在 editable 为 true 时有效) |
|
|
78
|
+
| `datasource` | Object | - | 数据源配置对象(可选) |
|
|
79
|
+
|
|
80
|
+
### 组件事件
|
|
81
|
+
|
|
82
|
+
| 事件名 | 参数 | 说明 |
|
|
83
|
+
|--------|------|------|
|
|
84
|
+
| `update:content` | `(content: string)` | 内容更新时触发 |
|
|
85
|
+
| `errors` | `(errors: Array)` | 渲染错误时触发,返回错误数组 |
|
|
86
|
+
|
|
87
|
+
#### 错误对象格式
|
|
88
|
+
|
|
89
|
+
```javascript
|
|
90
|
+
{
|
|
91
|
+
line: 10, // 错误所在行号
|
|
92
|
+
type: 'ECharts', // 错误类型:ECharts, Dataset, Mermaid, Container
|
|
93
|
+
message: '配置错误', // 错误描述
|
|
94
|
+
code: '```echarts...', // 相关代码片段
|
|
95
|
+
severity: 'error' // 错误级别
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
#### 错误收集说明
|
|
100
|
+
|
|
101
|
+
组件会自动收集以下类型的渲染错误:
|
|
102
|
+
|
|
103
|
+
- **ECharts 错误**:图表配置错误、数据格式错误等
|
|
104
|
+
- **Mermaid 错误**:流程图语法错误
|
|
105
|
+
- **Dataset 错误**:数据集格式错误、数据源查询失败等
|
|
106
|
+
- **Container 错误**:容器配置错误(如 cell 宽度超出范围)
|
|
107
|
+
|
|
108
|
+
错误会在渲染完成后自动收集,并通过 `@errors` 事件传递给外部。你可以:
|
|
109
|
+
|
|
110
|
+
1. **监听事件**:`@errors="handleErrors"` 实时获取错误
|
|
111
|
+
2. **主动获取**:`this.$refs.editor.getErrors()` 获取当前错误列表
|
|
112
|
+
|
|
113
|
+
### 基础用法
|
|
114
|
+
|
|
115
|
+
```vue
|
|
116
|
+
<template>
|
|
117
|
+
<div id="app">
|
|
118
|
+
<MarkdownEditor
|
|
119
|
+
:content="markdownContent"
|
|
120
|
+
:editable="true"
|
|
121
|
+
@errors="handleErrors"
|
|
122
|
+
/>
|
|
123
|
+
</div>
|
|
124
|
+
</template>
|
|
125
|
+
|
|
126
|
+
<script>
|
|
127
|
+
import MarkdownEditor from '@data_wise/hyper-markdown'
|
|
128
|
+
|
|
129
|
+
export default {
|
|
130
|
+
name: 'App',
|
|
131
|
+
components: {
|
|
132
|
+
MarkdownEditor
|
|
133
|
+
},
|
|
134
|
+
data() {
|
|
135
|
+
return {
|
|
136
|
+
markdownContent: '# 欢迎使用 Hyper Markdown'
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
methods: {
|
|
140
|
+
handleErrors(errors) {
|
|
141
|
+
// 处理渲染错误
|
|
142
|
+
if (errors.length > 0) {
|
|
143
|
+
console.log('发现渲染错误:', errors)
|
|
144
|
+
errors.forEach(error => {
|
|
145
|
+
console.error(`第 ${error.line} 行 [${error.type}]: ${error.message}`)
|
|
146
|
+
})
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
</script>
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### 控制编辑器显示状态
|
|
155
|
+
|
|
156
|
+
```vue
|
|
157
|
+
<template>
|
|
158
|
+
<div id="app">
|
|
159
|
+
<!-- 默认隐藏编辑器,只显示预览 -->
|
|
160
|
+
<MarkdownEditor
|
|
161
|
+
:content="markdownContent"
|
|
162
|
+
:editable="true"
|
|
163
|
+
:default-show-editor="false"
|
|
164
|
+
/>
|
|
165
|
+
</div>
|
|
166
|
+
</template>
|
|
167
|
+
|
|
168
|
+
<script>
|
|
169
|
+
import MarkdownEditor from '@data_wise/hyper-markdown'
|
|
170
|
+
|
|
171
|
+
export default {
|
|
172
|
+
name: 'App',
|
|
173
|
+
components: {
|
|
174
|
+
MarkdownEditor
|
|
175
|
+
},
|
|
176
|
+
data() {
|
|
177
|
+
return {
|
|
178
|
+
markdownContent: '# 欢迎使用 Hyper Markdown'
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
</script>
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### 使用数据源功能
|
|
186
|
+
|
|
187
|
+
要使用数据源查询功能,需要注入 `datasource` 属性:
|
|
188
|
+
|
|
189
|
+
```vue
|
|
190
|
+
<template>
|
|
191
|
+
<div id="app">
|
|
192
|
+
<MarkdownEditor
|
|
193
|
+
v-model:content="markdownContent"
|
|
194
|
+
:editable="true"
|
|
195
|
+
:datasource="datasource"
|
|
196
|
+
/>
|
|
197
|
+
</div>
|
|
198
|
+
</template>
|
|
199
|
+
|
|
200
|
+
<script>
|
|
201
|
+
import MarkdownEditor from '@data_wise/hyper-markdown'
|
|
202
|
+
import { datasource } from './utils/dataSource' // 导入数据源函数
|
|
203
|
+
|
|
204
|
+
export default {
|
|
205
|
+
name: 'App',
|
|
206
|
+
components: {
|
|
207
|
+
MarkdownEditor
|
|
208
|
+
},
|
|
209
|
+
data() {
|
|
210
|
+
return {
|
|
211
|
+
markdownContent: '# 欢迎使用 Hyper Markdown',
|
|
212
|
+
datasource: datasource // 注入数据源函数
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
</script>
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## 数据源配置
|
|
220
|
+
|
|
221
|
+
### 数据源函数接口
|
|
222
|
+
|
|
223
|
+
`datasource` 对象必须包含以下函数:
|
|
224
|
+
|
|
225
|
+
```javascript
|
|
226
|
+
{
|
|
227
|
+
// 获取数据源数据
|
|
228
|
+
getDataSource(sourceId, sql, options) => Promise<Object>
|
|
229
|
+
|
|
230
|
+
// 获取数据源列表
|
|
231
|
+
getDataSourceList() => Array
|
|
232
|
+
|
|
233
|
+
// 清除数据缓存
|
|
234
|
+
clearDataSourceCache(sourceId) => void
|
|
235
|
+
|
|
236
|
+
// 测试数据源连接
|
|
237
|
+
testDataSourceConnection(sourceId) => Promise<boolean>
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### 内置数据源
|
|
242
|
+
|
|
243
|
+
项目内置了以下模拟数据源:
|
|
244
|
+
|
|
245
|
+
- **sales_db** - 销售数据库(MySQL)
|
|
246
|
+
- **user_db** - 用户数据库(PostgreSQL)
|
|
247
|
+
- **finance_db** - 财务数据库(Oracle)
|
|
248
|
+
|
|
249
|
+
### 自定义数据源
|
|
250
|
+
|
|
251
|
+
您可以创建自定义数据源函数:
|
|
252
|
+
|
|
253
|
+
```javascript
|
|
254
|
+
// 自定义数据源函数示例
|
|
255
|
+
const customDatasource = {
|
|
256
|
+
async getDataSource(sourceId, sql, options = {}) {
|
|
257
|
+
// 实现数据获取逻辑
|
|
258
|
+
return {
|
|
259
|
+
source: [], // 数据数组
|
|
260
|
+
dimensions: [], // 维度字段
|
|
261
|
+
metadata: {
|
|
262
|
+
sourceId: sourceId,
|
|
263
|
+
sql: sql,
|
|
264
|
+
count: 0,
|
|
265
|
+
timestamp: new Date().toISOString()
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
},
|
|
269
|
+
|
|
270
|
+
getDataSourceList() {
|
|
271
|
+
return [
|
|
272
|
+
{
|
|
273
|
+
id: 'my_db',
|
|
274
|
+
name: '我的数据库',
|
|
275
|
+
type: 'mysql',
|
|
276
|
+
description: '自定义数据源'
|
|
277
|
+
}
|
|
278
|
+
]
|
|
279
|
+
},
|
|
280
|
+
|
|
281
|
+
clearDataSourceCache(sourceId = null) {
|
|
282
|
+
// 清除缓存逻辑
|
|
283
|
+
},
|
|
284
|
+
|
|
285
|
+
async testDataSourceConnection(sourceId) {
|
|
286
|
+
return true
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
## 特有插件语法
|
|
292
|
+
|
|
293
|
+
### 1. ECharts 图表
|
|
294
|
+
|
|
295
|
+
使用 `echarts` 代码块渲染图表:
|
|
296
|
+
|
|
297
|
+
````markdown
|
|
298
|
+
```echarts
|
|
299
|
+
{
|
|
300
|
+
"title": {
|
|
301
|
+
"text": "销售数据"
|
|
302
|
+
},
|
|
303
|
+
"xAxis": {
|
|
304
|
+
"type": "category",
|
|
305
|
+
"data": ["一月", "二月", "三月"]
|
|
306
|
+
},
|
|
307
|
+
"yAxis": {
|
|
308
|
+
"type": "value"
|
|
309
|
+
},
|
|
310
|
+
"series": [{
|
|
311
|
+
"data": [120, 200, 150],
|
|
312
|
+
"type": "bar"
|
|
313
|
+
}]
|
|
314
|
+
}
|
|
315
|
+
```
|
|
316
|
+
````
|
|
317
|
+
|
|
318
|
+
### 2. Mermaid 流程图
|
|
319
|
+
|
|
320
|
+
使用 `mermaid` 代码块渲染流程图:
|
|
321
|
+
|
|
322
|
+
````markdown
|
|
323
|
+
```mermaid
|
|
324
|
+
graph TD
|
|
325
|
+
A[开始] --> B{条件判断}
|
|
326
|
+
B -->|是| C[执行操作]
|
|
327
|
+
B -->|否| D[结束]
|
|
328
|
+
C --> D
|
|
329
|
+
```
|
|
330
|
+
````
|
|
331
|
+
|
|
332
|
+
### 3. 数据集功能
|
|
333
|
+
|
|
334
|
+
使用 `dataset` 代码块定义数据集:
|
|
335
|
+
|
|
336
|
+
````markdown
|
|
337
|
+
```dataset datasetId: sales_data
|
|
338
|
+
{
|
|
339
|
+
dimensions: ["产品", "2020", "2021", "2022"],
|
|
340
|
+
source: [
|
|
341
|
+
{产品: "产品A", 2020: 100, 2021: 120, 2022: 150},
|
|
342
|
+
{产品: "产品B", 2020: 80, 2021: 90, 2022: 110},
|
|
343
|
+
{产品: "产品C", 2020: 60, 2021: 70, 2022: 85}
|
|
344
|
+
]
|
|
345
|
+
}
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
然后在 ECharts 中使用数据集:
|
|
349
|
+
|
|
350
|
+
```echarts
|
|
351
|
+
{
|
|
352
|
+
dataset: dataset['sales_data'],
|
|
353
|
+
title: { text: "产品销售趋势" },
|
|
354
|
+
xAxis: { type: "category" },
|
|
355
|
+
yAxis: { type: "value" },
|
|
356
|
+
series: [{
|
|
357
|
+
type: "bar",
|
|
358
|
+
encode: { x: "产品", y: "2020" }
|
|
359
|
+
}]
|
|
360
|
+
}
|
|
361
|
+
```
|
|
362
|
+
````
|
|
363
|
+
|
|
364
|
+
#### ⚠️ 使用 dataset + encode 时的注意事项
|
|
365
|
+
|
|
366
|
+
使用 `dataset` + `encode` 时,formatter 必须用**函数形式**,字符串模板会显示 `[object Object]`:
|
|
367
|
+
|
|
368
|
+
````markdown
|
|
369
|
+
```echarts
|
|
370
|
+
{
|
|
371
|
+
dataset: dataset['sales_data'],
|
|
372
|
+
series: [{
|
|
373
|
+
type: "pie",
|
|
374
|
+
encode: { itemName: "产品", value: "销量" },
|
|
375
|
+
label: {
|
|
376
|
+
// ❌ 错误:formatter: "{b}: {c}次 ({d}%)"
|
|
377
|
+
// ✅ 正确:使用函数
|
|
378
|
+
formatter: function(params) {
|
|
379
|
+
return params.data['产品'] + ': ' + params.data['销量'] + '次 (' + params.percent + '%)';
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}]
|
|
383
|
+
}
|
|
384
|
+
```
|
|
385
|
+
````
|
|
386
|
+
|
|
387
|
+
### 4. SQL 数据源查询
|
|
388
|
+
|
|
389
|
+
支持从数据源查询数据,需要先注入 `datasource` 属性:
|
|
390
|
+
|
|
391
|
+
#### 查询语法格式
|
|
392
|
+
|
|
393
|
+
支持两种格式的数据源查询:
|
|
394
|
+
|
|
395
|
+
**格式一:使用 datasourceId 指定数据源**
|
|
396
|
+
|
|
397
|
+
````markdown
|
|
398
|
+
```dataset datasetId: sql_query_1 datasourceId: sales_db
|
|
399
|
+
SELECT 产品, 年份, 销售额 FROM sales_data WHERE 销售额 > 100
|
|
400
|
+
```
|
|
401
|
+
````
|
|
402
|
+
|
|
403
|
+
**格式二:使用默认数据源(sales_db)**
|
|
404
|
+
|
|
405
|
+
````markdown
|
|
406
|
+
```dataset datasetId: sql_query_1
|
|
407
|
+
SELECT 产品, 年份, 销售额 FROM sales_data WHERE 销售额 > 100
|
|
408
|
+
```
|
|
409
|
+
````
|
|
410
|
+
|
|
411
|
+
#### 使用查询结果
|
|
412
|
+
|
|
413
|
+
查询结果会自动转换为标准数据集格式,可以在 ECharts 中使用:
|
|
414
|
+
|
|
415
|
+
```echarts
|
|
416
|
+
{
|
|
417
|
+
dataset: dataset['sql_query_1'],
|
|
418
|
+
title: { text: "产品销售趋势" },
|
|
419
|
+
xAxis: { type: "category" },
|
|
420
|
+
yAxis: { type: "value" },
|
|
421
|
+
series: [{
|
|
422
|
+
type: "bar",
|
|
423
|
+
encode: { x: "产品", y: "销售额" }
|
|
424
|
+
}]
|
|
425
|
+
}
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
#### 示例:完整的数据源查询
|
|
429
|
+
|
|
430
|
+
````markdown
|
|
431
|
+
```dataset datasetId: user_analysis datasourceId: user_db
|
|
432
|
+
SELECT 地区, 用户数, 活跃度 FROM user_data WHERE 用户数 > 1000 AND 活跃度 > 0.7
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
```echarts
|
|
436
|
+
{
|
|
437
|
+
dataset: dataset['user_analysis'],
|
|
438
|
+
title: { text: "用户分布分析" },
|
|
439
|
+
xAxis: { type: "category" },
|
|
440
|
+
yAxis: { type: "value" },
|
|
441
|
+
series: [{
|
|
442
|
+
type: "bar",
|
|
443
|
+
encode: { x: "地区", y: "用户数" }
|
|
444
|
+
}]
|
|
445
|
+
}
|
|
446
|
+
```
|
|
447
|
+
````
|
|
448
|
+
|
|
449
|
+
### 5. 栅格布局
|
|
450
|
+
|
|
451
|
+
使用 `cell` 容器创建响应式布局:
|
|
452
|
+
|
|
453
|
+
````markdown
|
|
454
|
+
::: cell 6
|
|
455
|
+
### 大单元格 (6格宽)
|
|
456
|
+
这是一个较大的单元格,宽度占6格
|
|
457
|
+
|
|
458
|
+
可以包含任何 Markdown 语法:
|
|
459
|
+
- 列表项
|
|
460
|
+
- 图片
|
|
461
|
+
- 代码等
|
|
462
|
+
:::
|
|
463
|
+
|
|
464
|
+
::: cell 3
|
|
465
|
+
### 中等单元格 (3格宽)
|
|
466
|
+
中等大小的单元格
|
|
467
|
+
|
|
468
|
+
```javascript
|
|
469
|
+
console.log('支持代码块');
|
|
470
|
+
```
|
|
471
|
+
:::
|
|
472
|
+
````
|
|
473
|
+
|
|
474
|
+
### 6. 自定义容器
|
|
475
|
+
|
|
476
|
+
支持多种自定义容器:
|
|
477
|
+
|
|
478
|
+
````markdown
|
|
479
|
+
::: warning
|
|
480
|
+
这是一个警告信息
|
|
481
|
+
:::
|
|
482
|
+
|
|
483
|
+
::: info
|
|
484
|
+
这是一个信息提示
|
|
485
|
+
:::
|
|
486
|
+
|
|
487
|
+
::: tip
|
|
488
|
+
这是一个小贴士
|
|
489
|
+
:::
|
|
490
|
+
|
|
491
|
+
::: danger
|
|
492
|
+
这是一个危险提示
|
|
493
|
+
:::
|
|
494
|
+
````
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
## 数据源使用注意事项
|
|
499
|
+
|
|
500
|
+
### 错误处理
|
|
501
|
+
|
|
502
|
+
当数据源查询失败时,会显示错误信息:
|
|
503
|
+
|
|
504
|
+
- **数据源未注入**:"数据源获取函数未注入,请确保已设置datasource属性"
|
|
505
|
+
- **数据源不存在**:"数据源不存在: {sourceId}"
|
|
506
|
+
- **SQL语法错误**:"SQL查询语句不能为空" 或 "数据源查询格式不正确"
|
|
507
|
+
|
|
508
|
+
### 缓存机制
|
|
509
|
+
|
|
510
|
+
数据源查询结果会自动缓存,避免重复查询:
|
|
511
|
+
|
|
512
|
+
- 相同查询条件会返回缓存结果
|
|
513
|
+
- 可以通过 `clearDataSourceCache()` 清除缓存
|
|
514
|
+
- 使用 `{forceRefresh: true}` 选项强制刷新
|
|
515
|
+
|
|
516
|
+
### 性能优化
|
|
517
|
+
|
|
518
|
+
- 数据源查询支持异步处理
|
|
519
|
+
- 支持延迟加载选项 `{delay: 500}`
|
|
520
|
+
- 内置数据源使用模拟数据,无网络请求
|
|
521
|
+
|
|
522
|
+
## 特性
|
|
523
|
+
|
|
524
|
+
- ✅ Vue 3 支持
|
|
525
|
+
- ✅ ECharts 图表渲染
|
|
526
|
+
- ✅ Mermaid 流程图支持
|
|
527
|
+
- ✅ KaTeX 数学公式
|
|
528
|
+
- ✅ 数据集表格展示
|
|
529
|
+
- ✅ 可编辑区域
|
|
530
|
+
- ✅ 自定义容器
|
|
531
|
+
- ✅ 响应式设计
|
|
532
|
+
- ✅ TypeScript 支持
|
|
533
|
+
- ✅ 数据源查询功能
|
|
534
|
+
- ✅ SQL 语法支持
|
|
535
|
+
- ✅ 数据缓存机制
|
|
536
|
+
|
|
537
|
+
## 许可证
|
|
538
|
+
|
|
539
539
|
MIT License
|