eeed-editor 0.1.15 → 0.1.17

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.
Files changed (61) hide show
  1. package/README.md +619 -619
  2. package/dist/{_basePickBy-CEkd0XdC.mjs → _basePickBy-BauhmMSw.mjs} +2 -2
  3. package/dist/{_baseUniq-BT9YRDH6.mjs → _baseUniq-C78702zO.mjs} +1 -1
  4. package/dist/{arc-CrfAF6jV.mjs → arc-De-hRU45.mjs} +1 -1
  5. package/dist/{architecture-U656AL7Q-BXDyIjTd.mjs → architecture-U656AL7Q-BdKF_NW6.mjs} +1 -1
  6. package/dist/{architectureDiagram-VXUJARFQ-C0wRUEtM.mjs → architectureDiagram-VXUJARFQ-8rHItemK.mjs} +4 -4
  7. package/dist/{blockDiagram-VD42YOAC-a8uU2YD1.mjs → blockDiagram-VD42YOAC-DDNngXsc.mjs} +5 -5
  8. package/dist/{c4Diagram-YG6GDRKO-B4jru1i1.mjs → c4Diagram-YG6GDRKO-BA0qP3sm.mjs} +2 -2
  9. package/dist/{channel-Bf6TIAcE.mjs → channel-BBKs03X1.mjs} +1 -1
  10. package/dist/{chunk-4BX2VUAB-CesipSEy.mjs → chunk-4BX2VUAB-C5s4nTiZ.mjs} +1 -1
  11. package/dist/{chunk-55IACEB6-BfkXgkW7.mjs → chunk-55IACEB6-DLuzlPSW.mjs} +1 -1
  12. package/dist/{chunk-B4BG7PRW-rYl7scX0.mjs → chunk-B4BG7PRW-CoWS9hNA.mjs} +4 -4
  13. package/dist/{chunk-DI55MBZ5-KjxZkID3.mjs → chunk-DI55MBZ5-C5sdfkAX.mjs} +3 -3
  14. package/dist/{chunk-FMBD7UC4-CdoeuytN.mjs → chunk-FMBD7UC4-DC8SSRiv.mjs} +1 -1
  15. package/dist/{chunk-QN33PNHL-DFkMZx1g.mjs → chunk-QN33PNHL-CGHtUdC-.mjs} +1 -1
  16. package/dist/{chunk-QZHKN3VN-BkCoRwfe.mjs → chunk-QZHKN3VN-CYsoy5nb.mjs} +1 -1
  17. package/dist/{chunk-TZMSLE5B-aCc6iQoB.mjs → chunk-TZMSLE5B-Dwc0cUJp.mjs} +1 -1
  18. package/dist/{classDiagram-v2-WZHVMYZB-DovnAJJ-.mjs → classDiagram-2ON5EDUG-DgLoScnV.mjs} +2 -2
  19. package/dist/{classDiagram-2ON5EDUG-DovnAJJ-.mjs → classDiagram-v2-WZHVMYZB-DgLoScnV.mjs} +2 -2
  20. package/dist/{clone-Bgn0kKfR.mjs → clone-D2qgsAqB.mjs} +1 -1
  21. package/dist/{cose-bilkent-S5V4N54A-BK8vsbSg.mjs → cose-bilkent-S5V4N54A-DokBWk4w.mjs} +2 -2
  22. package/dist/{dagre-6UL2VRFP-DTKvQpBz.mjs → dagre-6UL2VRFP-Ck_JJN9r.mjs} +6 -6
  23. package/dist/{diagram-PSM6KHXK-DbeZS0lZ.mjs → diagram-PSM6KHXK-BgCzNpd4.mjs} +4 -4
  24. package/dist/{diagram-QEK2KX5R-B2wgkbJv.mjs → diagram-QEK2KX5R-BH4an5dX.mjs} +3 -3
  25. package/dist/{diagram-S2PKOQOG-9N97BhIm.mjs → diagram-S2PKOQOG--TVxNx6w.mjs} +3 -3
  26. package/dist/eeed-editor.es.js +2 -2
  27. package/dist/eeed-editor.umd.js +433 -426
  28. package/dist/{erDiagram-Q2GNP2WA-Be2naADX.mjs → erDiagram-Q2GNP2WA-DW5S6C_w.mjs} +4 -4
  29. package/dist/{flowDiagram-NV44I4VS-BCekSJyr.mjs → flowDiagram-NV44I4VS-rnzdFNNM.mjs} +5 -5
  30. package/dist/{ganttDiagram-LVOFAZNH-DLE0G_aQ.mjs → ganttDiagram-LVOFAZNH-D-ye3iGK.mjs} +3 -3
  31. package/dist/{gitGraph-F6HP7TQM-D_INUXWz.mjs → gitGraph-F6HP7TQM-DNznQ3AG.mjs} +1 -1
  32. package/dist/{gitGraphDiagram-NY62KEGX-CFP-tbN2.mjs → gitGraphDiagram-NY62KEGX-C1NfF0di.mjs} +4 -4
  33. package/dist/{graph-DVnQzTDU.mjs → graph-BFbl45LR.mjs} +2 -2
  34. package/dist/{index-Bg_uVi12.mjs → index-zJud9SQi.mjs} +8679 -8551
  35. package/dist/index.css +1 -1
  36. package/dist/info-NVLQJR56-C4a00L6C.mjs +5 -0
  37. package/dist/{infoDiagram-ER5ION4S-s2Yp71ql.mjs → infoDiagram-ER5ION4S-BLR23V5s.mjs} +2 -2
  38. package/dist/{journeyDiagram-XKPGCS4Q-CBa5wdie.mjs → journeyDiagram-XKPGCS4Q-ClYbP-t7.mjs} +4 -4
  39. package/dist/{kanban-definition-3W4ZIXB7-OcVTugCl.mjs → kanban-definition-3W4ZIXB7-QmJ2_kJS.mjs} +2 -2
  40. package/dist/{layout-mkZS9nxv.mjs → layout-DLf7xN8i.mjs} +4 -4
  41. package/dist/{linear-H2f9LXEG.mjs → linear-D5p8D5IT.mjs} +1 -1
  42. package/dist/{mermaid-parser.core-BOUdyKiu.mjs → mermaid-parser.core-DIiAjqh-.mjs} +11 -11
  43. package/dist/{mermaid.core-Detd19yK.mjs → mermaid.core-DTB5ADBi.mjs} +30 -30
  44. package/dist/{mindmap-definition-VGOIOE7T-C0Jrl77c.mjs → mindmap-definition-VGOIOE7T-D5_9dVmo.mjs} +3 -3
  45. package/dist/{packet-BFZMPI3H-XcF80dGc.mjs → packet-BFZMPI3H-DuBaSAZ3.mjs} +1 -1
  46. package/dist/pie-7BOR55EZ-CsNWzXqs.mjs +5 -0
  47. package/dist/{pieDiagram-ADFJNKIX-BKJCTnqK.mjs → pieDiagram-ADFJNKIX-cily-oHi.mjs} +4 -4
  48. package/dist/{quadrantDiagram-AYHSOK5B-CNpXyKC_.mjs → quadrantDiagram-AYHSOK5B-BhH6cKgk.mjs} +2 -2
  49. package/dist/{radar-NHE76QYJ-LVAmdxN5.mjs → radar-NHE76QYJ-L4NQJA18.mjs} +1 -1
  50. package/dist/{requirementDiagram-UZGBJVZJ-DKlo_g1y.mjs → requirementDiagram-UZGBJVZJ-Cyv8pMO0.mjs} +3 -3
  51. package/dist/{sankeyDiagram-TZEHDZUN-BlcFWxGM.mjs → sankeyDiagram-TZEHDZUN-BdWrPNQr.mjs} +1 -1
  52. package/dist/{sequenceDiagram-WL72ISMW-Br1vA5Su.mjs → sequenceDiagram-WL72ISMW-Kd0xWrcz.mjs} +3 -3
  53. package/dist/src/utils/htmlToMarkdown.d.ts +1 -2
  54. package/dist/{stateDiagram-FKZM4ZOC-Dn8r5dJ1.mjs → stateDiagram-FKZM4ZOC-CawxRfLn.mjs} +4 -4
  55. package/dist/{stateDiagram-v2-4FDKWEC3-Dn7F_OIh.mjs → stateDiagram-v2-4FDKWEC3-DIbT_ehp.mjs} +2 -2
  56. package/dist/{timeline-definition-IT6M3QCI-lEx0wVcX.mjs → timeline-definition-IT6M3QCI-vEvts_jB.mjs} +2 -2
  57. package/dist/{treemap-KMMF4GRG-Jr6yIZsF.mjs → treemap-KMMF4GRG-CA11U8yQ.mjs} +1 -1
  58. package/dist/{xychartDiagram-PRI3JC2R-DNJMbKy-.mjs → xychartDiagram-PRI3JC2R-BOhlz1mC.mjs} +2 -2
  59. package/package.json +100 -100
  60. package/dist/info-NVLQJR56-Bg8bOk4W.mjs +0 -5
  61. package/dist/pie-7BOR55EZ-BB0Yx1zG.mjs +0 -5
package/README.md CHANGED
@@ -1,619 +1,619 @@
1
- # eeed-editor
2
-
3
- `eeed-editor` 是一个面向业务文档编辑场景的 Vue 3 富文本编辑器,基于 Tiptap 构建,适合在后台系统、知识库、合同/报告编辑、审批表单、A4 文档和技术文档页面中使用。
4
-
5
- 它内置文档级编辑体验、A4 页面、大纲、代码块、数学公式、Mermaid、图片处理、表格、Markdown 粘贴、保存/上传回调,以及 Word 和 Markdown 导出能力。
6
-
7
- ## 特性
8
-
9
- - Vue 3 组件化接入
10
- - 只需 `import eeedEditor from "eeed-editor"`,样式会自动注入
11
- - 支持可编辑与只读预览
12
- - 支持普通文档、A4 文档、表单富文本、移动端精简工具栏等场景
13
- - 支持标题大纲、当前章节高亮、点击大纲定位
14
- - 支持代码块高亮与一键复制
15
- - 支持数学公式、Mermaid 图表、表格、图片、引用、分割线、任务列表
16
- - 支持 Markdown 内容初始化与 Markdown 粘贴
17
- - 支持保存、上传、内容变更三个业务回调
18
- - 支持导出 Word 与 Markdown
19
-
20
- ## 安装
21
-
22
- ```bash
23
- npm install eeed-editor
24
- ```
25
-
26
- 或者:
27
-
28
- ```bash
29
- pnpm add eeed-editor
30
- ```
31
-
32
- `vue` 和 `element-plus` 是 peer dependencies,请确保业务项目中已经安装:
33
-
34
- ```bash
35
- npm install vue element-plus
36
- ```
37
-
38
- ## 快速开始
39
-
40
- > 注意:`eeedEditor` 外层必须包一个稳定容器,并设置 `position: relative` 和明确的宽高。编辑器内部默认会根据父容器定位和计算高度,尤其是 A4 文档模式、工具栏固定布局、大纲滚动等场景。
41
-
42
- ```vue
43
- <template>
44
- <div class="editor-wrapper">
45
- <eeedEditor
46
- title="产品方案"
47
- :content="content"
48
- :config="config"
49
- :onSave="handleSave"
50
- :onUploadFile="handleUploadFile"
51
- :onChange="handleChange"
52
- />
53
- </div>
54
- </template>
55
-
56
- <script setup lang="ts">
57
- import { ref } from "vue";
58
- import eeedEditor from "eeed-editor";
59
-
60
- const content = ref("<h1>产品方案</h1><p>这里是正文内容。</p>");
61
-
62
- const latestHtml = ref("");
63
- const latestText = ref("");
64
- const latestMarkdown = ref("");
65
-
66
- const config = {
67
- mode: "doc",
68
- editable: true,
69
- doc: {
70
- page: {
71
- mode: "default",
72
- style: {
73
- position: "absolute",
74
- backgroundColor: "#f3f6f9",
75
- },
76
- },
77
- headerBar: {
78
- visible: true,
79
- home: { visible: true, icon: "home", path: "/" },
80
- export: { visible: true },
81
- title: { visible: true },
82
- },
83
- toolBar: {
84
- visible: true,
85
- align: "start",
86
- },
87
- },
88
- } as const;
89
-
90
- const handleSave = async (title: string, html: string) => {
91
- // 这里接入你的保存接口
92
- await Promise.resolve({ title, html });
93
- return true;
94
- };
95
-
96
- const handleUploadFile = async (file: File) => {
97
- const formData = new FormData();
98
- formData.append("file", file);
99
-
100
- // 替换成你的上传接口
101
- // const res = await fetch("/api/upload", { method: "POST", body: formData });
102
- // const data = await res.json();
103
- // return data.url;
104
-
105
- return URL.createObjectURL(file);
106
- };
107
-
108
- const handleChange = (html: string, text: string, markdown: string) => {
109
- latestHtml.value = html;
110
- latestText.value = text;
111
- latestMarkdown.value = markdown;
112
- };
113
- </script>
114
-
115
- <style scoped>
116
- .editor-wrapper {
117
- position: relative;
118
- width: 100%;
119
- height: 720px;
120
- }
121
- </style>
122
- ```
123
-
124
- ## Props
125
-
126
- | 名称 | 类型 | 必填 | 说明 |
127
- | --- | --- | --- | --- |
128
- | `title` | `string` | 否 | 文档标题,保存和导出时会使用 |
129
- | `content` | `string` | 否 | 编辑器内容,推荐传 HTML,也支持 Markdown 文本 |
130
- | `config` | `EditorConfig` | 否 | 编辑器模式、页面、头部栏、工具栏等配置 |
131
- | `onSave` | `(title: string, html: string) => boolean \| Promise<boolean>` | 否 | 保存回调,返回 `true` 时显示保存成功提示 |
132
- | `onUploadFile` | `(file: File) => string \| Promise<string>` | 否 | 文件上传回调,返回可访问的文件 URL |
133
- | `onChange` | `(html: string, text: string, markdown: string) => void` | 否 | 内容变更回调 |
134
-
135
- ## Config 类型
136
-
137
- ```ts
138
- type ToolBarItem =
139
- | "history"
140
- | "formatBrush"
141
- | "clearFormatting"
142
- | "fontFamily"
143
- | "heading"
144
- | "fontSize"
145
- | "fontColor"
146
- | "highlightColor"
147
- | "bold"
148
- | "italic"
149
- | "underline"
150
- | "strike"
151
- | "blockquote"
152
- | "horizontalRule"
153
- | "inlineCode"
154
- | "table"
155
- | "list"
156
- | "textAlign"
157
- | "indent"
158
- | "lineHeight"
159
- | "insert";
160
-
161
- type EditorConfig = {
162
- mode?: "doc";
163
- editable?: boolean;
164
- doc?: {
165
- page?: {
166
- mode?: "default" | "defaultA4" | "A4";
167
- style?: {
168
- position?: "absolute" | "relative";
169
- backgroundColor?: string;
170
- };
171
- };
172
- headerBar?: {
173
- visible?: boolean;
174
- home?: {
175
- visible?: boolean;
176
- icon?: "back" | "home";
177
- path?: string;
178
- };
179
- export?: {
180
- visible?: boolean;
181
- };
182
- title?: {
183
- visible?: boolean;
184
- };
185
- };
186
- toolBar?: {
187
- visible?: boolean;
188
- align?: "start" | "center";
189
- items?: ToolBarItem[];
190
- };
191
- };
192
- };
193
- ```
194
-
195
- ## 常用配置说明
196
-
197
- | 路径 | 默认值 | 说明 |
198
- | --- | --- | --- |
199
- | `mode` | `"doc"` | 当前主要支持文档模式 |
200
- | `editable` | `true` | 是否可编辑,设置为 `false` 时进入只读预览 |
201
- | `doc.page.mode` | `"default"` | 页面模式,可选普通文档、默认 A4、A4 文档 |
202
- | `doc.page.style.position` | `"absolute"` | 编辑器页面定位方式。默认要求父容器 `position: relative` |
203
- | `doc.page.style.backgroundColor` | `"#f3f6f9"` | 编辑区背景色 |
204
- | `doc.headerBar.visible` | `false` | 是否展示顶部标题栏 |
205
- | `doc.headerBar.home.visible` | `true` | 是否展示返回/首页按钮 |
206
- | `doc.headerBar.home.icon` | `"home"` | 顶部左侧图标,可选 `home` 或 `back` |
207
- | `doc.headerBar.home.path` | `"/"` | 点击返回/首页按钮后的跳转路径 |
208
- | `doc.headerBar.export.visible` | `true` | 是否展示导出入口 |
209
- | `doc.headerBar.title.visible` | `true` | 是否展示标题输入框 |
210
- | `doc.toolBar.visible` | `true` | 是否展示工具栏 |
211
- | `doc.toolBar.align` | `"start"` | 工具栏对齐方式,可选 `start`、`center` |
212
- | `doc.toolBar.items` | `undefined` | 精简工具栏配置,适合移动端或表单字段 |
213
-
214
- ## 业务回调
215
-
216
- ### onSave
217
-
218
- 点击保存或快捷键保存时触发。
219
-
220
- ```ts
221
- const handleSave = async (title: string, html: string) => {
222
- await saveDocument({
223
- title,
224
- content: html,
225
- });
226
-
227
- return true;
228
- };
229
- ```
230
-
231
- 说明:
232
-
233
- - `title` 是当前文档标题
234
- - `html` 是编辑器 HTML 内容
235
- - 返回 `true` 会显示保存成功提示
236
- - 返回 `false` 或抛出异常时不会显示成功提示
237
-
238
- ### onUploadFile
239
-
240
- 插入图片、粘贴图片或上传文件时触发。
241
-
242
- ```ts
243
- const handleUploadFile = async (file: File) => {
244
- const formData = new FormData();
245
- formData.append("file", file);
246
-
247
- const res = await fetch("/api/upload", {
248
- method: "POST",
249
- body: formData,
250
- });
251
- const data = await res.json();
252
-
253
- return data.url;
254
- };
255
- ```
256
-
257
- 说明:
258
-
259
- - 必须返回一个可访问的 URL
260
- - 如果没有传 `onUploadFile`,图片会尝试以 base64 方式插入
261
- - 生产环境建议接入自己的文件服务或对象存储
262
-
263
- ### onChange
264
-
265
- 编辑器内容变化时触发。
266
-
267
- ```ts
268
- const handleChange = (html: string, text: string, markdown: string) => {
269
- form.content = html;
270
- form.text = text;
271
- form.markdown = markdown;
272
- };
273
- ```
274
-
275
- 说明:
276
-
277
- - `html` 是完整 HTML 内容
278
- - `text` 是纯文本内容
279
- - `markdown` 是 Markdown 格式内容(v0.1.13+ 新增)
280
- - 如果业务侧需要自动保存,建议自行做 debounce
281
-
282
- ## 场景示例
283
-
284
- ### A4 文档编辑
285
-
286
- 适合合同、报告、方案、正式文档编辑。
287
-
288
- ```ts
289
- const config = {
290
- mode: "doc",
291
- editable: true,
292
- doc: {
293
- page: {
294
- mode: "A4",
295
- style: {
296
- position: "absolute",
297
- backgroundColor: "#eef2f7",
298
- },
299
- },
300
- headerBar: {
301
- visible: true,
302
- home: { visible: true, icon: "back", path: "/" },
303
- export: { visible: true },
304
- title: { visible: true },
305
- },
306
- toolBar: {
307
- visible: true,
308
- align: "center",
309
- },
310
- },
311
- } as const;
312
- ```
313
-
314
- ### 表单富文本字段
315
-
316
- 适合嵌入业务表单、审批表单、弹窗表单。
317
-
318
- ```ts
319
- const config = {
320
- mode: "doc",
321
- editable: true,
322
- doc: {
323
- page: {
324
- mode: "default",
325
- style: {
326
- position: "absolute",
327
- backgroundColor: "#ffffff",
328
- },
329
- },
330
- headerBar: {
331
- visible: false,
332
- },
333
- toolBar: {
334
- visible: true,
335
- align: "start",
336
- items: [
337
- "history",
338
- "heading",
339
- "bold",
340
- "italic",
341
- "underline",
342
- "fontColor",
343
- "list",
344
- "insert",
345
- ],
346
- },
347
- },
348
- } as const;
349
- ```
350
-
351
- ### 移动端精简编辑
352
-
353
- 适合手机端内容维护,只保留必要工具。
354
-
355
- ```ts
356
- const config = {
357
- mode: "doc",
358
- editable: true,
359
- doc: {
360
- page: {
361
- mode: "default",
362
- style: {
363
- position: "absolute",
364
- backgroundColor: "#ffffff",
365
- },
366
- },
367
- headerBar: {
368
- visible: false,
369
- },
370
- toolBar: {
371
- visible: true,
372
- align: "start",
373
- items: ["history", "bold", "italic", "underline", "list", "insert"],
374
- },
375
- },
376
- } as const;
377
- ```
378
-
379
- ### 只读预览
380
-
381
- 适合详情页、审批查看、归档文档展示。
382
-
383
- ```ts
384
- const config = {
385
- mode: "doc",
386
- editable: false,
387
- } as const;
388
- ```
389
-
390
- ### 技术文档
391
-
392
- 适合代码块、公式、Mermaid 图表、知识库文章。
393
-
394
- ```ts
395
- const content = `
396
- <h1>接口说明</h1>
397
- <p>这里是技术文档内容。</p>
398
- <pre><code class="language-typescript">const message: string = "hello";</code></pre>
399
- <p>行内公式:$a^2 + b^2 = c^2$</p>
400
- <pre><code class="language-mermaid">graph TD
401
- A[开始] --> B[结束]</code></pre>
402
- `;
403
- ```
404
-
405
- ## 内容格式
406
-
407
- `content` 推荐传 HTML:
408
-
409
- ```ts
410
- const content = "<h1>标题</h1><p>正文内容</p>";
411
- ```
412
-
413
- 也可以传 Markdown 文本,编辑器会自动转成 HTML:
414
-
415
- ```ts
416
- const content = `
417
- # 标题
418
-
419
- 这是一段 Markdown 内容。
420
-
421
- \`\`\`ts
422
- const value = "eeed-editor";
423
- \`\`\`
424
- `;
425
- ```
426
-
427
- ## 数学公式
428
-
429
- 支持行内公式和块级公式:
430
-
431
- ```html
432
- <p>行内公式:$a^2 + b^2 = c^2$</p>
433
-
434
- <p>块级公式:</p>
435
- <p>$$F(\omega) = \int_{-\infty}^{\infty} f(t) e^{-i\omega t} dt$$</p>
436
- ```
437
-
438
- ## 代码块
439
-
440
- 支持常见语言代码高亮,并提供复制按钮。
441
-
442
- ```html
443
- <pre><code class="language-typescript">import { ref } from "vue";
444
-
445
- const title = ref("eeed-editor");</code></pre>
446
- ```
447
-
448
- ## Mermaid
449
-
450
- 可以在技术文档场景中插入 Mermaid 图表内容:
451
-
452
- ```html
453
- <pre><code class="language-mermaid">graph TD
454
- A[需求] --> B[开发]
455
- B --> C[上线]</code></pre>
456
- ```
457
-
458
- ## 导出
459
-
460
- 当 `doc.headerBar.export.visible` 为 `true` 时,顶部栏会展示导出入口。
461
-
462
- 当前支持:
463
-
464
- - 导出 Word
465
- - 导出 Markdown
466
-
467
- ```ts
468
- const config = {
469
- mode: "doc",
470
- editable: true,
471
- doc: {
472
- headerBar: {
473
- visible: true,
474
- export: { visible: true },
475
- title: { visible: true },
476
- },
477
- },
478
- } as const;
479
- ```
480
-
481
- ## 大纲
482
-
483
- 在 A4 / defaultA4 文档模式下,编辑器会根据标题自动生成大纲。
484
-
485
- 支持:
486
-
487
- - 自动提取标题一到标题六
488
- - 点击大纲滚动到对应标题
489
- - 滚动时高亮当前章节
490
- - 空标题显示为“未命名标题”
491
- - 可收起/展开大纲
492
-
493
- ## 工具栏精简
494
-
495
- 通过 `doc.toolBar.items` 可以保留部分工具,适合移动端或表单场景。
496
-
497
- ```ts
498
- const config = {
499
- mode: "doc",
500
- editable: true,
501
- doc: {
502
- toolBar: {
503
- visible: true,
504
- align: "start",
505
- items: ["history", "bold", "italic", "underline", "list", "insert"],
506
- },
507
- },
508
- } as const;
509
- ```
510
-
511
- 可选工具项:
512
-
513
- ```ts
514
- [
515
- "history",
516
- "formatBrush",
517
- "clearFormatting",
518
- "fontFamily",
519
- "heading",
520
- "fontSize",
521
- "fontColor",
522
- "highlightColor",
523
- "bold",
524
- "italic",
525
- "underline",
526
- "strike",
527
- "blockquote",
528
- "horizontalRule",
529
- "inlineCode",
530
- "table",
531
- "list",
532
- "textAlign",
533
- "indent",
534
- "lineHeight",
535
- "insert",
536
- ]
537
- ```
538
-
539
- ## 样式说明
540
-
541
- 从当前版本开始,只需要:
542
-
543
- ```ts
544
- import eeedEditor from "eeed-editor";
545
- ```
546
-
547
- 组件样式会随 JS 自动注入页面,不需要再额外写:
548
-
549
- ```ts
550
- import "eeed-editor/dist/index.css";
551
- ```
552
-
553
- 为了兼容旧项目,包内仍然保留 `dist/index.css` 文件。
554
-
555
- ## 容器要求
556
-
557
- 编辑器依赖父容器计算布局,请确保外层容器稳定:
558
-
559
- ```css
560
- .editor-wrapper {
561
- position: relative;
562
- width: 100%;
563
- height: 720px;
564
- }
565
- ```
566
-
567
- 如果父容器没有明确高度,可能会出现:
568
-
569
- - 编辑器不可见
570
- - 工具栏和正文区域重叠
571
- - A4 页面定位异常
572
- - 大纲滚动区域异常
573
-
574
- ## 常见问题
575
-
576
- ### 为什么打开后高度不对?
577
-
578
- 请检查外层容器是否设置了 `position: relative` 和明确高度。
579
-
580
- ### 为什么保存成功没有提示?
581
-
582
- `onSave` 需要返回 `true`:
583
-
584
- ```ts
585
- const handleSave = async () => {
586
- await save();
587
- return true;
588
- };
589
- ```
590
-
591
- ### 为什么上传图片没有变成线上地址?
592
-
593
- 请传入 `onUploadFile`,并返回上传后的 URL。
594
-
595
- ### 为什么样式没有生效?
596
-
597
- 新版会自动注入样式。如果你使用了非常特殊的构建工具或 SSR 环境,可以临时手动引入:
598
-
599
- ```ts
600
- import "eeed-editor/dist/index.css";
601
- ```
602
-
603
- ## 浏览器支持
604
-
605
- 推荐在现代浏览器中使用:
606
-
607
- - Chrome / Edge 最新版
608
- - Firefox 最新版
609
- - Safari 最新版
610
-
611
- ## 链接
612
-
613
- - 官网:https://editor.eeed.cn
614
- - GitHub:https://github.com/zhangmingxin0120/eeed-editor
615
- - npm:https://www.npmjs.com/package/eeed-editor
616
-
617
- ## License
618
-
619
- MIT
1
+ # eeed-editor
2
+
3
+ `eeed-editor` 是一个面向业务文档编辑场景的 Vue 3 富文本编辑器,基于 Tiptap 构建,适合在后台系统、知识库、合同/报告编辑、审批表单、A4 文档和技术文档页面中使用。
4
+
5
+ 它内置文档级编辑体验、A4 页面、大纲、代码块、数学公式、Mermaid、图片处理、表格、Markdown 粘贴、保存/上传回调,以及 Word 和 Markdown 导出能力。
6
+
7
+ ## 特性
8
+
9
+ - Vue 3 组件化接入
10
+ - 只需 `import eeedEditor from "eeed-editor"`,样式会自动注入
11
+ - 支持可编辑与只读预览
12
+ - 支持普通文档、A4 文档、表单富文本、移动端精简工具栏等场景
13
+ - 支持标题大纲、当前章节高亮、点击大纲定位
14
+ - 支持代码块高亮与一键复制
15
+ - 支持数学公式、Mermaid 图表、表格、图片、引用、分割线、任务列表
16
+ - 支持 Markdown 内容初始化与 Markdown 粘贴
17
+ - 支持保存、上传、内容变更三个业务回调
18
+ - 支持导出 Word 与 Markdown
19
+
20
+ ## 安装
21
+
22
+ ```bash
23
+ npm install eeed-editor
24
+ ```
25
+
26
+ 或者:
27
+
28
+ ```bash
29
+ pnpm add eeed-editor
30
+ ```
31
+
32
+ `vue` 和 `element-plus` 是 peer dependencies,请确保业务项目中已经安装:
33
+
34
+ ```bash
35
+ npm install vue element-plus
36
+ ```
37
+
38
+ ## 快速开始
39
+
40
+ > 注意:`eeedEditor` 外层必须包一个稳定容器,并设置 `position: relative` 和明确的宽高。编辑器内部默认会根据父容器定位和计算高度,尤其是 A4 文档模式、工具栏固定布局、大纲滚动等场景。
41
+
42
+ ```vue
43
+ <template>
44
+ <div class="editor-wrapper">
45
+ <eeedEditor
46
+ title="产品方案"
47
+ :content="content"
48
+ :config="config"
49
+ :onSave="handleSave"
50
+ :onUploadFile="handleUploadFile"
51
+ :onChange="handleChange"
52
+ />
53
+ </div>
54
+ </template>
55
+
56
+ <script setup lang="ts">
57
+ import { ref } from "vue";
58
+ import eeedEditor from "eeed-editor";
59
+
60
+ const content = ref("<h1>产品方案</h1><p>这里是正文内容。</p>");
61
+
62
+ const latestHtml = ref("");
63
+ const latestText = ref("");
64
+ const latestMarkdown = ref("");
65
+
66
+ const config = {
67
+ mode: "doc",
68
+ editable: true,
69
+ doc: {
70
+ page: {
71
+ mode: "default",
72
+ style: {
73
+ position: "absolute",
74
+ backgroundColor: "#f3f6f9",
75
+ },
76
+ },
77
+ headerBar: {
78
+ visible: true,
79
+ home: { visible: true, icon: "home", path: "/" },
80
+ export: { visible: true },
81
+ title: { visible: true },
82
+ },
83
+ toolBar: {
84
+ visible: true,
85
+ align: "start",
86
+ },
87
+ },
88
+ } as const;
89
+
90
+ const handleSave = async (title: string, html: string) => {
91
+ // 这里接入你的保存接口
92
+ await Promise.resolve({ title, html });
93
+ return true;
94
+ };
95
+
96
+ const handleUploadFile = async (file: File) => {
97
+ const formData = new FormData();
98
+ formData.append("file", file);
99
+
100
+ // 替换成你的上传接口
101
+ // const res = await fetch("/api/upload", { method: "POST", body: formData });
102
+ // const data = await res.json();
103
+ // return data.url;
104
+
105
+ return URL.createObjectURL(file);
106
+ };
107
+
108
+ const handleChange = (html: string, text: string, markdown: string) => {
109
+ latestHtml.value = html;
110
+ latestText.value = text;
111
+ latestMarkdown.value = markdown;
112
+ };
113
+ </script>
114
+
115
+ <style scoped>
116
+ .editor-wrapper {
117
+ position: relative;
118
+ width: 100%;
119
+ height: 720px;
120
+ }
121
+ </style>
122
+ ```
123
+
124
+ ## Props
125
+
126
+ | 名称 | 类型 | 必填 | 说明 |
127
+ | --- | --- | --- | --- |
128
+ | `title` | `string` | 否 | 文档标题,保存和导出时会使用 |
129
+ | `content` | `string` | 否 | 编辑器内容,推荐传 HTML,也支持 Markdown 文本 |
130
+ | `config` | `EditorConfig` | 否 | 编辑器模式、页面、头部栏、工具栏等配置 |
131
+ | `onSave` | `(title: string, html: string) => boolean \| Promise<boolean>` | 否 | 保存回调,返回 `true` 时显示保存成功提示 |
132
+ | `onUploadFile` | `(file: File) => string \| Promise<string>` | 否 | 文件上传回调,返回可访问的文件 URL |
133
+ | `onChange` | `(html: string, text: string, markdown: string) => void` | 否 | 内容变更回调 |
134
+
135
+ ## Config 类型
136
+
137
+ ```ts
138
+ type ToolBarItem =
139
+ | "history"
140
+ | "formatBrush"
141
+ | "clearFormatting"
142
+ | "fontFamily"
143
+ | "heading"
144
+ | "fontSize"
145
+ | "fontColor"
146
+ | "highlightColor"
147
+ | "bold"
148
+ | "italic"
149
+ | "underline"
150
+ | "strike"
151
+ | "blockquote"
152
+ | "horizontalRule"
153
+ | "inlineCode"
154
+ | "table"
155
+ | "list"
156
+ | "textAlign"
157
+ | "indent"
158
+ | "lineHeight"
159
+ | "insert";
160
+
161
+ type EditorConfig = {
162
+ mode?: "doc";
163
+ editable?: boolean;
164
+ doc?: {
165
+ page?: {
166
+ mode?: "default" | "defaultA4" | "A4";
167
+ style?: {
168
+ position?: "absolute" | "relative";
169
+ backgroundColor?: string;
170
+ };
171
+ };
172
+ headerBar?: {
173
+ visible?: boolean;
174
+ home?: {
175
+ visible?: boolean;
176
+ icon?: "back" | "home";
177
+ path?: string;
178
+ };
179
+ export?: {
180
+ visible?: boolean;
181
+ };
182
+ title?: {
183
+ visible?: boolean;
184
+ };
185
+ };
186
+ toolBar?: {
187
+ visible?: boolean;
188
+ align?: "start" | "center";
189
+ items?: ToolBarItem[];
190
+ };
191
+ };
192
+ };
193
+ ```
194
+
195
+ ## 常用配置说明
196
+
197
+ | 路径 | 默认值 | 说明 |
198
+ | --- | --- | --- |
199
+ | `mode` | `"doc"` | 当前主要支持文档模式 |
200
+ | `editable` | `true` | 是否可编辑,设置为 `false` 时进入只读预览 |
201
+ | `doc.page.mode` | `"default"` | 页面模式,可选普通文档、默认 A4、A4 文档 |
202
+ | `doc.page.style.position` | `"absolute"` | 编辑器页面定位方式。默认要求父容器 `position: relative` |
203
+ | `doc.page.style.backgroundColor` | `"#f3f6f9"` | 编辑区背景色 |
204
+ | `doc.headerBar.visible` | `false` | 是否展示顶部标题栏 |
205
+ | `doc.headerBar.home.visible` | `true` | 是否展示返回/首页按钮 |
206
+ | `doc.headerBar.home.icon` | `"home"` | 顶部左侧图标,可选 `home` 或 `back` |
207
+ | `doc.headerBar.home.path` | `"/"` | 点击返回/首页按钮后的跳转路径 |
208
+ | `doc.headerBar.export.visible` | `true` | 是否展示导出入口 |
209
+ | `doc.headerBar.title.visible` | `true` | 是否展示标题输入框 |
210
+ | `doc.toolBar.visible` | `true` | 是否展示工具栏 |
211
+ | `doc.toolBar.align` | `"start"` | 工具栏对齐方式,可选 `start`、`center` |
212
+ | `doc.toolBar.items` | `undefined` | 精简工具栏配置,适合移动端或表单字段 |
213
+
214
+ ## 业务回调
215
+
216
+ ### onSave
217
+
218
+ 点击保存或快捷键保存时触发。
219
+
220
+ ```ts
221
+ const handleSave = async (title: string, html: string) => {
222
+ await saveDocument({
223
+ title,
224
+ content: html,
225
+ });
226
+
227
+ return true;
228
+ };
229
+ ```
230
+
231
+ 说明:
232
+
233
+ - `title` 是当前文档标题
234
+ - `html` 是编辑器 HTML 内容
235
+ - 返回 `true` 会显示保存成功提示
236
+ - 返回 `false` 或抛出异常时不会显示成功提示
237
+
238
+ ### onUploadFile
239
+
240
+ 插入图片、粘贴图片或上传文件时触发。
241
+
242
+ ```ts
243
+ const handleUploadFile = async (file: File) => {
244
+ const formData = new FormData();
245
+ formData.append("file", file);
246
+
247
+ const res = await fetch("/api/upload", {
248
+ method: "POST",
249
+ body: formData,
250
+ });
251
+ const data = await res.json();
252
+
253
+ return data.url;
254
+ };
255
+ ```
256
+
257
+ 说明:
258
+
259
+ - 必须返回一个可访问的 URL
260
+ - 如果没有传 `onUploadFile`,图片会尝试以 base64 方式插入
261
+ - 生产环境建议接入自己的文件服务或对象存储
262
+
263
+ ### onChange
264
+
265
+ 编辑器内容变化时触发。
266
+
267
+ ```ts
268
+ const handleChange = (html: string, text: string, markdown: string) => {
269
+ form.content = html;
270
+ form.text = text;
271
+ form.markdown = markdown;
272
+ };
273
+ ```
274
+
275
+ 说明:
276
+
277
+ - `html` 是完整 HTML 内容
278
+ - `text` 是纯文本内容
279
+ - `markdown` 是 Markdown 格式内容(v0.1.13+ 新增)
280
+ - 如果业务侧需要自动保存,建议自行做 debounce
281
+
282
+ ## 场景示例
283
+
284
+ ### A4 文档编辑
285
+
286
+ 适合合同、报告、方案、正式文档编辑。
287
+
288
+ ```ts
289
+ const config = {
290
+ mode: "doc",
291
+ editable: true,
292
+ doc: {
293
+ page: {
294
+ mode: "A4",
295
+ style: {
296
+ position: "absolute",
297
+ backgroundColor: "#eef2f7",
298
+ },
299
+ },
300
+ headerBar: {
301
+ visible: true,
302
+ home: { visible: true, icon: "back", path: "/" },
303
+ export: { visible: true },
304
+ title: { visible: true },
305
+ },
306
+ toolBar: {
307
+ visible: true,
308
+ align: "center",
309
+ },
310
+ },
311
+ } as const;
312
+ ```
313
+
314
+ ### 表单富文本字段
315
+
316
+ 适合嵌入业务表单、审批表单、弹窗表单。
317
+
318
+ ```ts
319
+ const config = {
320
+ mode: "doc",
321
+ editable: true,
322
+ doc: {
323
+ page: {
324
+ mode: "default",
325
+ style: {
326
+ position: "absolute",
327
+ backgroundColor: "#ffffff",
328
+ },
329
+ },
330
+ headerBar: {
331
+ visible: false,
332
+ },
333
+ toolBar: {
334
+ visible: true,
335
+ align: "start",
336
+ items: [
337
+ "history",
338
+ "heading",
339
+ "bold",
340
+ "italic",
341
+ "underline",
342
+ "fontColor",
343
+ "list",
344
+ "insert",
345
+ ],
346
+ },
347
+ },
348
+ } as const;
349
+ ```
350
+
351
+ ### 移动端精简编辑
352
+
353
+ 适合手机端内容维护,只保留必要工具。
354
+
355
+ ```ts
356
+ const config = {
357
+ mode: "doc",
358
+ editable: true,
359
+ doc: {
360
+ page: {
361
+ mode: "default",
362
+ style: {
363
+ position: "absolute",
364
+ backgroundColor: "#ffffff",
365
+ },
366
+ },
367
+ headerBar: {
368
+ visible: false,
369
+ },
370
+ toolBar: {
371
+ visible: true,
372
+ align: "start",
373
+ items: ["history", "bold", "italic", "underline", "list", "insert"],
374
+ },
375
+ },
376
+ } as const;
377
+ ```
378
+
379
+ ### 只读预览
380
+
381
+ 适合详情页、审批查看、归档文档展示。
382
+
383
+ ```ts
384
+ const config = {
385
+ mode: "doc",
386
+ editable: false,
387
+ } as const;
388
+ ```
389
+
390
+ ### 技术文档
391
+
392
+ 适合代码块、公式、Mermaid 图表、知识库文章。
393
+
394
+ ```ts
395
+ const content = `
396
+ <h1>接口说明</h1>
397
+ <p>这里是技术文档内容。</p>
398
+ <pre><code class="language-typescript">const message: string = "hello";</code></pre>
399
+ <p>行内公式:$a^2 + b^2 = c^2$</p>
400
+ <pre><code class="language-mermaid">graph TD
401
+ A[开始] --> B[结束]</code></pre>
402
+ `;
403
+ ```
404
+
405
+ ## 内容格式
406
+
407
+ `content` 推荐传 HTML:
408
+
409
+ ```ts
410
+ const content = "<h1>标题</h1><p>正文内容</p>";
411
+ ```
412
+
413
+ 也可以传 Markdown 文本,编辑器会自动转成 HTML:
414
+
415
+ ```ts
416
+ const content = `
417
+ # 标题
418
+
419
+ 这是一段 Markdown 内容。
420
+
421
+ \`\`\`ts
422
+ const value = "eeed-editor";
423
+ \`\`\`
424
+ `;
425
+ ```
426
+
427
+ ## 数学公式
428
+
429
+ 支持行内公式和块级公式:
430
+
431
+ ```html
432
+ <p>行内公式:$a^2 + b^2 = c^2$</p>
433
+
434
+ <p>块级公式:</p>
435
+ <p>$$F(\omega) = \int_{-\infty}^{\infty} f(t) e^{-i\omega t} dt$$</p>
436
+ ```
437
+
438
+ ## 代码块
439
+
440
+ 支持常见语言代码高亮,并提供复制按钮。
441
+
442
+ ```html
443
+ <pre><code class="language-typescript">import { ref } from "vue";
444
+
445
+ const title = ref("eeed-editor");</code></pre>
446
+ ```
447
+
448
+ ## Mermaid
449
+
450
+ 可以在技术文档场景中插入 Mermaid 图表内容:
451
+
452
+ ```html
453
+ <pre><code class="language-mermaid">graph TD
454
+ A[需求] --> B[开发]
455
+ B --> C[上线]</code></pre>
456
+ ```
457
+
458
+ ## 导出
459
+
460
+ 当 `doc.headerBar.export.visible` 为 `true` 时,顶部栏会展示导出入口。
461
+
462
+ 当前支持:
463
+
464
+ - 导出 Word
465
+ - 导出 Markdown
466
+
467
+ ```ts
468
+ const config = {
469
+ mode: "doc",
470
+ editable: true,
471
+ doc: {
472
+ headerBar: {
473
+ visible: true,
474
+ export: { visible: true },
475
+ title: { visible: true },
476
+ },
477
+ },
478
+ } as const;
479
+ ```
480
+
481
+ ## 大纲
482
+
483
+ 在 A4 / defaultA4 文档模式下,编辑器会根据标题自动生成大纲。
484
+
485
+ 支持:
486
+
487
+ - 自动提取标题一到标题六
488
+ - 点击大纲滚动到对应标题
489
+ - 滚动时高亮当前章节
490
+ - 空标题显示为“未命名标题”
491
+ - 可收起/展开大纲
492
+
493
+ ## 工具栏精简
494
+
495
+ 通过 `doc.toolBar.items` 可以保留部分工具,适合移动端或表单场景。
496
+
497
+ ```ts
498
+ const config = {
499
+ mode: "doc",
500
+ editable: true,
501
+ doc: {
502
+ toolBar: {
503
+ visible: true,
504
+ align: "start",
505
+ items: ["history", "bold", "italic", "underline", "list", "insert"],
506
+ },
507
+ },
508
+ } as const;
509
+ ```
510
+
511
+ 可选工具项:
512
+
513
+ ```ts
514
+ [
515
+ "history",
516
+ "formatBrush",
517
+ "clearFormatting",
518
+ "fontFamily",
519
+ "heading",
520
+ "fontSize",
521
+ "fontColor",
522
+ "highlightColor",
523
+ "bold",
524
+ "italic",
525
+ "underline",
526
+ "strike",
527
+ "blockquote",
528
+ "horizontalRule",
529
+ "inlineCode",
530
+ "table",
531
+ "list",
532
+ "textAlign",
533
+ "indent",
534
+ "lineHeight",
535
+ "insert",
536
+ ]
537
+ ```
538
+
539
+ ## 样式说明
540
+
541
+ 从当前版本开始,只需要:
542
+
543
+ ```ts
544
+ import eeedEditor from "eeed-editor";
545
+ ```
546
+
547
+ 组件样式会随 JS 自动注入页面,不需要再额外写:
548
+
549
+ ```ts
550
+ import "eeed-editor/dist/index.css";
551
+ ```
552
+
553
+ 为了兼容旧项目,包内仍然保留 `dist/index.css` 文件。
554
+
555
+ ## 容器要求
556
+
557
+ 编辑器依赖父容器计算布局,请确保外层容器稳定:
558
+
559
+ ```css
560
+ .editor-wrapper {
561
+ position: relative;
562
+ width: 100%;
563
+ height: 720px;
564
+ }
565
+ ```
566
+
567
+ 如果父容器没有明确高度,可能会出现:
568
+
569
+ - 编辑器不可见
570
+ - 工具栏和正文区域重叠
571
+ - A4 页面定位异常
572
+ - 大纲滚动区域异常
573
+
574
+ ## 常见问题
575
+
576
+ ### 为什么打开后高度不对?
577
+
578
+ 请检查外层容器是否设置了 `position: relative` 和明确高度。
579
+
580
+ ### 为什么保存成功没有提示?
581
+
582
+ `onSave` 需要返回 `true`:
583
+
584
+ ```ts
585
+ const handleSave = async () => {
586
+ await save();
587
+ return true;
588
+ };
589
+ ```
590
+
591
+ ### 为什么上传图片没有变成线上地址?
592
+
593
+ 请传入 `onUploadFile`,并返回上传后的 URL。
594
+
595
+ ### 为什么样式没有生效?
596
+
597
+ 新版会自动注入样式。如果你使用了非常特殊的构建工具或 SSR 环境,可以临时手动引入:
598
+
599
+ ```ts
600
+ import "eeed-editor/dist/index.css";
601
+ ```
602
+
603
+ ## 浏览器支持
604
+
605
+ 推荐在现代浏览器中使用:
606
+
607
+ - Chrome / Edge 最新版
608
+ - Firefox 最新版
609
+ - Safari 最新版
610
+
611
+ ## 链接
612
+
613
+ - 官网:https://editor.eeed.cn
614
+ - GitHub:https://github.com/zhangmingxin0120/eeed-editor
615
+ - npm:https://www.npmjs.com/package/eeed-editor
616
+
617
+ ## License
618
+
619
+ MIT