miyuan-editor 0.0.3
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/README.md +525 -0
- package/dist/core/index.cjs.js +40 -0
- package/dist/core/index.esm.js +4 -0
- package/dist/dist-5Q_Z9Ell.js +6390 -0
- package/dist/dist-5Q_Z9Ell.js.map +1 -0
- package/dist/dist-CMM6n8DO.cjs +4629 -0
- package/dist/dist-CMM6n8DO.cjs.map +1 -0
- package/dist/dist-CRSJDo2G.cjs +6617 -0
- package/dist/dist-CRSJDo2G.cjs.map +1 -0
- package/dist/dist-CZw77IJK.js +4612 -0
- package/dist/dist-CZw77IJK.js.map +1 -0
- package/dist/dist-CnVrDtsI.js +556 -0
- package/dist/dist-CnVrDtsI.js.map +1 -0
- package/dist/dist-rItBfhNb.cjs +591 -0
- package/dist/dist-rItBfhNb.cjs.map +1 -0
- package/dist/export-utils-CYaNoyVg.cjs +167 -0
- package/dist/export-utils-CYaNoyVg.cjs.map +1 -0
- package/dist/export-utils-DN0Gu8Vu.js +144 -0
- package/dist/export-utils-DN0Gu8Vu.js.map +1 -0
- package/dist/extension-BPFuYyzN.cjs +338 -0
- package/dist/extension-BPFuYyzN.cjs.map +1 -0
- package/dist/extension-Cl6x5MDR.js +321 -0
- package/dist/extension-Cl6x5MDR.js.map +1 -0
- package/dist/extensions/index.cjs.js +3462 -0
- package/dist/extensions/index.cjs.js.map +1 -0
- package/dist/extensions/index.esm.js +3412 -0
- package/dist/extensions/index.esm.js.map +1 -0
- package/dist/prompt-B4AOP8f_.js +24143 -0
- package/dist/prompt-B4AOP8f_.js.map +1 -0
- package/dist/prompt-CGLw2O21.cjs +25530 -0
- package/dist/prompt-CGLw2O21.cjs.map +1 -0
- package/dist/react/index.cjs.js +839 -0
- package/dist/react/index.cjs.js.map +1 -0
- package/dist/react/index.esm.js +820 -0
- package/dist/react/index.esm.js.map +1 -0
- package/dist/shortcut-panel-BskGXV8n.js +49468 -0
- package/dist/shortcut-panel-BskGXV8n.js.map +1 -0
- package/dist/shortcut-panel-yP4RPTFt.cjs +49563 -0
- package/dist/shortcut-panel-yP4RPTFt.cjs.map +1 -0
- package/dist/toc-extension-BESc0uEW.js +150 -0
- package/dist/toc-extension-BESc0uEW.js.map +1 -0
- package/dist/toc-extension-SRvSuskn.cjs +173 -0
- package/dist/toc-extension-SRvSuskn.cjs.map +1 -0
- package/dist/toolbar-config-Cgc9mV2v.js +243 -0
- package/dist/toolbar-config-Cgc9mV2v.js.map +1 -0
- package/dist/toolbar-config-Cjt_fPMi.cjs +260 -0
- package/dist/toolbar-config-Cjt_fPMi.cjs.map +1 -0
- package/dist/ui/index.cjs.js +18 -0
- package/dist/ui/index.esm.js +3 -0
- package/dist/vue/index.cjs.js +323 -0
- package/dist/vue/index.cjs.js.map +1 -0
- package/dist/vue/index.esm.js +307 -0
- package/dist/vue/index.esm.js.map +1 -0
- package/dist/vue2/index.cjs.js +323 -0
- package/dist/vue2/index.cjs.js.map +1 -0
- package/dist/vue2/index.esm.js +307 -0
- package/dist/vue2/index.esm.js.map +1 -0
- package/package.json +116 -0
package/README.md
ADDED
|
@@ -0,0 +1,525 @@
|
|
|
1
|
+
# @miyuan/editor
|
|
2
|
+
|
|
3
|
+
> 一个高扩展性的富文本编辑器引擎,支持多框架(React / Vue 3 / Vue 2)
|
|
4
|
+
|
|
5
|
+
[](http://npm.gzmiyuan.com:4873/)
|
|
6
|
+
[](https://www.typescriptlang.org/)
|
|
7
|
+
[](https://opensource.org/licenses/MIT)
|
|
8
|
+
|
|
9
|
+
## ✨ 特性
|
|
10
|
+
|
|
11
|
+
- 🎯 **Schema 驱动** - 所有节点类型通过 Schema 注册,插件可自由扩展
|
|
12
|
+
- 🔌 **组合式插件系统** - Extension 作为一等公民,声明式贡献节点、命令、快捷键
|
|
13
|
+
- 🔄 **事务化状态管理** - 不可变状态 + 事务描述修改,天然支持撤销/重做
|
|
14
|
+
- 📝 **多格式序列化** - JSON ↔ HTML ↔ Markdown ↔ PlainText 完整转换链
|
|
15
|
+
- 🖥️ **多框架支持** - 核心引擎框架无关,提供 React、Vue 3、Vue 2 适配层
|
|
16
|
+
- 🎨 **薄壳 UI 层** - UI 组件用纯 DOM 编写,每个框架仅提供薄壳挂载
|
|
17
|
+
|
|
18
|
+
## 📦 安装
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# 使用私有 registry
|
|
22
|
+
npm install @miyuan/editor --registry http://npm.gzmiyuan.com:4873/
|
|
23
|
+
|
|
24
|
+
# 或配置 .npmrc 后直接安装
|
|
25
|
+
npm install @miyuan/editor
|
|
26
|
+
|
|
27
|
+
# 或使用 yarn
|
|
28
|
+
yarn add @miyuan/editor --registry http://npm.gzmiyuan.com:4873/
|
|
29
|
+
|
|
30
|
+
# 或使用 pnpm
|
|
31
|
+
pnpm add @miyuan/editor --registry http://npm.gzmiyuan.com:4873/
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**配置私有 registry(推荐):**
|
|
35
|
+
|
|
36
|
+
在项目根目录创建 `.npmrc` 文件:
|
|
37
|
+
|
|
38
|
+
```ini
|
|
39
|
+
@miyuan:registry=http://npm.gzmiyuan.com:4873/
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
或在用户目录配置全局 registry:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
npm config set @miyuan:registry http://npm.gzmiyuan.com:4873/
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## 🚀 快速开始
|
|
49
|
+
|
|
50
|
+
### React 项目
|
|
51
|
+
|
|
52
|
+
```tsx
|
|
53
|
+
import { useEditor, EditorContent } from '@miyuan/editor/react'
|
|
54
|
+
import {
|
|
55
|
+
DocExtension,
|
|
56
|
+
TextExtension,
|
|
57
|
+
ParagraphExtension,
|
|
58
|
+
BoldExtension,
|
|
59
|
+
ItalicExtension,
|
|
60
|
+
HeadingExtension,
|
|
61
|
+
HistoryExtension,
|
|
62
|
+
} from '@miyuan/editor/extensions'
|
|
63
|
+
|
|
64
|
+
function MyEditor() {
|
|
65
|
+
const editor = useEditor({
|
|
66
|
+
extensions: [
|
|
67
|
+
DocExtension(),
|
|
68
|
+
TextExtension(),
|
|
69
|
+
ParagraphExtension(),
|
|
70
|
+
BoldExtension(),
|
|
71
|
+
ItalicExtension(),
|
|
72
|
+
HeadingExtension(),
|
|
73
|
+
HistoryExtension(),
|
|
74
|
+
],
|
|
75
|
+
content: '<p>开始编辑...</p>',
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
return (
|
|
79
|
+
<div>
|
|
80
|
+
<button onClick={() => editor.commands.bold()}>加粗</button>
|
|
81
|
+
<EditorContent editor={editor} />
|
|
82
|
+
</div>
|
|
83
|
+
)
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Vue 3 项目
|
|
88
|
+
|
|
89
|
+
```vue
|
|
90
|
+
<template>
|
|
91
|
+
<div>
|
|
92
|
+
<button @click="editor.commands.bold()">加粗</button>
|
|
93
|
+
<EditorContent :editor="editor" />
|
|
94
|
+
</div>
|
|
95
|
+
</template>
|
|
96
|
+
|
|
97
|
+
<script setup>
|
|
98
|
+
import { useEditor, EditorContent } from '@miyuan/editor/vue'
|
|
99
|
+
import {
|
|
100
|
+
DocExtension,
|
|
101
|
+
TextExtension,
|
|
102
|
+
ParagraphExtension,
|
|
103
|
+
BoldExtension,
|
|
104
|
+
HistoryExtension,
|
|
105
|
+
} from '@miyuan/editor/extensions'
|
|
106
|
+
|
|
107
|
+
const editor = useEditor({
|
|
108
|
+
extensions: [
|
|
109
|
+
DocExtension(),
|
|
110
|
+
TextExtension(),
|
|
111
|
+
ParagraphExtension(),
|
|
112
|
+
BoldExtension(),
|
|
113
|
+
HistoryExtension(),
|
|
114
|
+
],
|
|
115
|
+
content: '<p>开始编辑...</p>',
|
|
116
|
+
})
|
|
117
|
+
</script>
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## 📚 文档目录
|
|
121
|
+
|
|
122
|
+
- [架构设计](#架构设计)
|
|
123
|
+
- [核心概念](#核心概念)
|
|
124
|
+
- [扩展开发](#扩展开发)
|
|
125
|
+
- [API 参考](#api-参考)
|
|
126
|
+
- [序列化](#序列化)
|
|
127
|
+
- [开发指南](#开发指南)
|
|
128
|
+
|
|
129
|
+
## 🏗️ 架构设计
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
src/
|
|
133
|
+
├── core/ ← 编辑器内核(纯 TS,零框架依赖)
|
|
134
|
+
│ ├── extension.ts ← Extension 系统
|
|
135
|
+
│ ├── editor-view.ts ← EditorView 封装
|
|
136
|
+
│ ├── schema.ts ← Schema 编译
|
|
137
|
+
│ └── ...
|
|
138
|
+
├── extensions/ ← 官方扩展集合(纯 TS)
|
|
139
|
+
│ ├── doc-extension.ts
|
|
140
|
+
│ ├── mark-extensions.ts ← Bold, Italic, Link...
|
|
141
|
+
│ ├── node-extensions.ts ← Heading, List, CodeBlock...
|
|
142
|
+
│ └── behavior-extensions.ts ← History, Placeholder...
|
|
143
|
+
├── ui/ ← UI 纯 DOM 核心(一套代码)
|
|
144
|
+
├── react/ ← React 适配层
|
|
145
|
+
├── vue/ ← Vue 3 适配层
|
|
146
|
+
└── vue2/ ← Vue 2 适配层
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**依赖方向严格单向:** `ui → react/vue/vue2 → extensions → core`
|
|
150
|
+
|
|
151
|
+
## 🎓 核心概念
|
|
152
|
+
|
|
153
|
+
### Extension(扩展)
|
|
154
|
+
|
|
155
|
+
Extension 是编辑器功能的基本单元:
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
interface Extension {
|
|
159
|
+
name: string
|
|
160
|
+
type: 'node' | 'mark' | 'extension'
|
|
161
|
+
|
|
162
|
+
addNodes?(): Record<string, NodeSpec>
|
|
163
|
+
addMarks?(): Record<string, MarkSpec>
|
|
164
|
+
addCommands?(): Record<string, CommandFactory>
|
|
165
|
+
addKeyboardShortcuts?(): Record<string, Command>
|
|
166
|
+
addPlugins?(): Plugin[]
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Schema(模式)
|
|
171
|
+
|
|
172
|
+
Schema 定义文档结构:
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
const schema = new Schema({
|
|
176
|
+
nodes: {
|
|
177
|
+
doc: { content: 'block+' },
|
|
178
|
+
paragraph: { group: 'block', content: 'inline*' },
|
|
179
|
+
text: { group: 'inline' },
|
|
180
|
+
heading: {
|
|
181
|
+
group: 'block',
|
|
182
|
+
content: 'inline*',
|
|
183
|
+
attrs: { level: { default: 1 } }
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
marks: {
|
|
187
|
+
bold: {},
|
|
188
|
+
italic: {},
|
|
189
|
+
}
|
|
190
|
+
})
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Transaction(事务)
|
|
194
|
+
|
|
195
|
+
所有修改通过事务进行:
|
|
196
|
+
|
|
197
|
+
```typescript
|
|
198
|
+
const tr = state.tr
|
|
199
|
+
tr.insertText('Hello', 0, 0)
|
|
200
|
+
tr.addMark(0, 5, schema.marks.bold.create())
|
|
201
|
+
view.dispatch(tr)
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## 🔧 扩展开发
|
|
205
|
+
|
|
206
|
+
### 创建自定义节点
|
|
207
|
+
|
|
208
|
+
```typescript
|
|
209
|
+
import type { Extension } from '@miyuan/editor'
|
|
210
|
+
import type { NodeSpec } from 'prosemirror-model'
|
|
211
|
+
|
|
212
|
+
export function CalloutExtension(): Extension {
|
|
213
|
+
return {
|
|
214
|
+
name: 'callout',
|
|
215
|
+
type: 'node',
|
|
216
|
+
addNodes() {
|
|
217
|
+
return {
|
|
218
|
+
callout: {
|
|
219
|
+
group: 'block',
|
|
220
|
+
content: 'inline*',
|
|
221
|
+
attrs: {
|
|
222
|
+
type: { default: 'info' }, // info, warning, error
|
|
223
|
+
},
|
|
224
|
+
toDOM(node) {
|
|
225
|
+
return ['div', { class: `callout callout-${node.attrs.type}` }, 0]
|
|
226
|
+
},
|
|
227
|
+
parseDOM: [{
|
|
228
|
+
tag: 'div.callout',
|
|
229
|
+
getAttrs(dom) {
|
|
230
|
+
const el = dom as HTMLElement
|
|
231
|
+
const type = el.className.match(/callout-(\w+)/)?.[1] || 'info'
|
|
232
|
+
return { type }
|
|
233
|
+
},
|
|
234
|
+
}],
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
addCommands() {
|
|
239
|
+
return {
|
|
240
|
+
setCallout: (type: string) => (state, dispatch) => {
|
|
241
|
+
const nt = state.schema.nodes['callout']
|
|
242
|
+
if (!nt) return false
|
|
243
|
+
const tr = state.tr
|
|
244
|
+
tr.replaceSelectionWith(nt.create({ type }))
|
|
245
|
+
if (dispatch) dispatch(tr)
|
|
246
|
+
return true
|
|
247
|
+
},
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### 创建自定义 Mark
|
|
255
|
+
|
|
256
|
+
```typescript
|
|
257
|
+
export function HighlightExtension(): Extension {
|
|
258
|
+
return {
|
|
259
|
+
name: 'highlight',
|
|
260
|
+
type: 'mark',
|
|
261
|
+
addMarks() {
|
|
262
|
+
return {
|
|
263
|
+
highlight: {
|
|
264
|
+
attrs: { color: { default: '#ffff00' } },
|
|
265
|
+
toDOM(mark) {
|
|
266
|
+
return ['mark', { style: `background-color: ${mark.attrs.color}` }, 0]
|
|
267
|
+
},
|
|
268
|
+
parseDOM: [{
|
|
269
|
+
tag: 'mark',
|
|
270
|
+
getAttrs(dom) {
|
|
271
|
+
return { color: (dom as HTMLElement).style.backgroundColor || '#ffff00' }
|
|
272
|
+
},
|
|
273
|
+
}],
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
},
|
|
277
|
+
addCommands() {
|
|
278
|
+
return {
|
|
279
|
+
setHighlight: (color: string) => (state, dispatch) => {
|
|
280
|
+
const mt = state.schema.marks['highlight']
|
|
281
|
+
if (!mt) return false
|
|
282
|
+
const { from, to } = state.selection
|
|
283
|
+
if (from === to) return false
|
|
284
|
+
if (dispatch) {
|
|
285
|
+
dispatch(state.tr.addMark(from, to, mt.create({ color })))
|
|
286
|
+
}
|
|
287
|
+
return true
|
|
288
|
+
},
|
|
289
|
+
}
|
|
290
|
+
},
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
## 📖 API 参考
|
|
296
|
+
|
|
297
|
+
### React Hook
|
|
298
|
+
|
|
299
|
+
```typescript
|
|
300
|
+
interface UseEditorOptions {
|
|
301
|
+
extensions: Extension[]
|
|
302
|
+
content?: string | object
|
|
303
|
+
editable?: boolean
|
|
304
|
+
onUpdate?: (state: EditorState) => void
|
|
305
|
+
onSelectionChange?: (state: EditorState) => void
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
interface EditorHandle {
|
|
309
|
+
view: EditorView | null
|
|
310
|
+
state: EditorState | null
|
|
311
|
+
schema: Schema | null
|
|
312
|
+
commands: Record<string, CommandFactory>
|
|
313
|
+
}
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
### 命令系统
|
|
317
|
+
|
|
318
|
+
所有命令返回 `(state, dispatch) => boolean`:
|
|
319
|
+
|
|
320
|
+
```typescript
|
|
321
|
+
// 文本格式
|
|
322
|
+
editor.commands.bold()
|
|
323
|
+
editor.commands.italic()
|
|
324
|
+
editor.commands.underline()
|
|
325
|
+
editor.commands.strike()
|
|
326
|
+
editor.commands.code()
|
|
327
|
+
|
|
328
|
+
// 块级元素
|
|
329
|
+
editor.commands.heading(level: number)
|
|
330
|
+
editor.commands.paragraph()
|
|
331
|
+
editor.commands.blockquote()
|
|
332
|
+
editor.commands.bulletList()
|
|
333
|
+
editor.commands.orderedList()
|
|
334
|
+
editor.commands.taskList()
|
|
335
|
+
|
|
336
|
+
// 其他
|
|
337
|
+
editor.commands.undo()
|
|
338
|
+
editor.commands.redo()
|
|
339
|
+
editor.commands.setTextAlign(align: 'left' | 'center' | 'right')
|
|
340
|
+
editor.commands.setLineHeight(height: number)
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
## 🔄 序列化
|
|
344
|
+
|
|
345
|
+
### JSON
|
|
346
|
+
|
|
347
|
+
```typescript
|
|
348
|
+
import { nodeToJSON, nodeFromJSON } from '@miyuan/editor/serialization'
|
|
349
|
+
|
|
350
|
+
// 文档 → JSON
|
|
351
|
+
const json = nodeToJSON(state.doc)
|
|
352
|
+
|
|
353
|
+
// JSON → 文档
|
|
354
|
+
const doc = nodeFromJSON(schema, json)
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
### HTML
|
|
358
|
+
|
|
359
|
+
```typescript
|
|
360
|
+
import { toHTML, fromHTML } from '@miyuan/editor/serialization'
|
|
361
|
+
|
|
362
|
+
// 文档 → HTML
|
|
363
|
+
const html = toHTML(state.doc, schema)
|
|
364
|
+
|
|
365
|
+
// HTML → 文档
|
|
366
|
+
const doc = fromHTML('<h1>标题</h1><p>内容</p>', schema)
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
### Markdown
|
|
370
|
+
|
|
371
|
+
```typescript
|
|
372
|
+
import { toMarkdown, fromMarkdown } from '@miyuan/editor/serialization'
|
|
373
|
+
|
|
374
|
+
// 文档 → Markdown
|
|
375
|
+
const md = toMarkdown(state.doc, schema)
|
|
376
|
+
|
|
377
|
+
// Markdown → 文档
|
|
378
|
+
const doc = fromMarkdown('# 标题\n\n内容', schema)
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
### SerializationRegistry
|
|
382
|
+
|
|
383
|
+
```typescript
|
|
384
|
+
import { SerializationRegistry } from '@miyuan/editor/serialization'
|
|
385
|
+
|
|
386
|
+
const registry = new SerializationRegistry()
|
|
387
|
+
|
|
388
|
+
// 序列化
|
|
389
|
+
const json = registry.serialize(doc, 'json', schema)
|
|
390
|
+
const html = registry.serialize(doc, 'html', schema)
|
|
391
|
+
const md = registry.serialize(doc, 'markdown', schema)
|
|
392
|
+
|
|
393
|
+
// 解析
|
|
394
|
+
const docFromJson = registry.parse(json, 'json', schema)
|
|
395
|
+
const docFromHtml = registry.parse(html, 'html', schema)
|
|
396
|
+
const docFromMd = registry.parse(md, 'markdown', schema)
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
## 🛠️ 开发指南
|
|
400
|
+
|
|
401
|
+
### 本地开发
|
|
402
|
+
|
|
403
|
+
```bash
|
|
404
|
+
# 克隆项目
|
|
405
|
+
git clone https://github.com/your-org/miyuan-editor.git
|
|
406
|
+
cd miyuan-editor
|
|
407
|
+
|
|
408
|
+
# 安装依赖
|
|
409
|
+
npm install
|
|
410
|
+
|
|
411
|
+
# 启动开发服务器(Playground)
|
|
412
|
+
npm run dev
|
|
413
|
+
|
|
414
|
+
# 构建
|
|
415
|
+
npm run build
|
|
416
|
+
|
|
417
|
+
# 运行测试
|
|
418
|
+
npm test
|
|
419
|
+
|
|
420
|
+
# 类型检查
|
|
421
|
+
npm run typecheck
|
|
422
|
+
|
|
423
|
+
# 代码检查
|
|
424
|
+
npm run lint
|
|
425
|
+
npm run format
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
### 项目结构
|
|
429
|
+
|
|
430
|
+
```
|
|
431
|
+
miyuan-editor/
|
|
432
|
+
├── src/ # 源代码
|
|
433
|
+
│ ├── core/ # 核心引擎
|
|
434
|
+
│ ├── extensions/ # 官方扩展
|
|
435
|
+
│ ├── ui/ # UI 组件
|
|
436
|
+
│ ├── react/ # React 适配
|
|
437
|
+
│ ├── vue/ # Vue 3 适配
|
|
438
|
+
│ └── vue2/ # Vue 2 适配
|
|
439
|
+
├── tests/ # 单元测试
|
|
440
|
+
├── playground/ # 开发预览应用
|
|
441
|
+
├── package.json
|
|
442
|
+
├── tsconfig.json
|
|
443
|
+
├── vite.config.ts
|
|
444
|
+
└── vitest.config.ts
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
### 发布流程
|
|
448
|
+
|
|
449
|
+
```bash
|
|
450
|
+
# 1. 更新版本号
|
|
451
|
+
npm version patch # 或 minor, major
|
|
452
|
+
|
|
453
|
+
# 2. 构建
|
|
454
|
+
npm run build
|
|
455
|
+
|
|
456
|
+
# 3. 运行测试
|
|
457
|
+
npm test
|
|
458
|
+
|
|
459
|
+
# 4. 发布到私有 registry
|
|
460
|
+
npm publish --registry http://npm.gzmiyuan.com:4873/
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
## 📝 内置扩展
|
|
464
|
+
|
|
465
|
+
### 节点扩展
|
|
466
|
+
- `DocExtension` - 文档根节点
|
|
467
|
+
- `TextExtension` - 文本节点
|
|
468
|
+
- `ParagraphExtension` - 段落(支持对齐、缩进、行高)
|
|
469
|
+
- `HeadingExtension` - 标题 H1-H6
|
|
470
|
+
- `BlockquoteExtension` - 引用块
|
|
471
|
+
- `BulletListExtension` - 无序列表
|
|
472
|
+
- `OrderedListExtension` - 有序列表
|
|
473
|
+
- `TaskListExtension` - 任务列表
|
|
474
|
+
- `CodeBlockExtension` - 代码块
|
|
475
|
+
- `HorizontalRuleExtension` - 分割线
|
|
476
|
+
- `HardBreakExtension` - 换行
|
|
477
|
+
- `ImageExtension` - 图片
|
|
478
|
+
|
|
479
|
+
### 标记扩展
|
|
480
|
+
- `BoldExtension` - 加粗 (Ctrl+B)
|
|
481
|
+
- `ItalicExtension` - 斜体 (Ctrl+I)
|
|
482
|
+
- `CodeExtension` - 行内代码 (Ctrl+E)
|
|
483
|
+
- `StrikeExtension` - 删除线
|
|
484
|
+
- `UnderlineExtension` - 下划线 (Ctrl+U)
|
|
485
|
+
- `LinkExtension` - 链接
|
|
486
|
+
- `TextColorExtension` - 文字颜色
|
|
487
|
+
- `BackgroundColorExtension` - 背景颜色
|
|
488
|
+
- `FontSizeExtension` - 字体大小
|
|
489
|
+
|
|
490
|
+
### 行为扩展
|
|
491
|
+
- `HistoryExtension` - 撤销/重做 (Ctrl+Z / Ctrl+Y)
|
|
492
|
+
- `PlaceholderExtension` - 占位提示
|
|
493
|
+
- `ImageUploadExtension` - 图片上传
|
|
494
|
+
|
|
495
|
+
## 🤝 贡献指南
|
|
496
|
+
|
|
497
|
+
我们欢迎所有形式的贡献!
|
|
498
|
+
|
|
499
|
+
1. Fork 本仓库
|
|
500
|
+
2. 创建特性分支 (`git checkout -b feature/amazing-feature`)
|
|
501
|
+
3. 提交更改 (`git commit -m 'feat: add amazing feature'`)
|
|
502
|
+
4. 推送到分支 (`git push origin feature/amazing-feature`)
|
|
503
|
+
5. 提交 Pull Request
|
|
504
|
+
|
|
505
|
+
### 开发规范
|
|
506
|
+
|
|
507
|
+
- 使用 TypeScript strict 模式
|
|
508
|
+
- 遵循 ESLint 规则
|
|
509
|
+
- 为新功能添加测试
|
|
510
|
+
- 更新文档
|
|
511
|
+
|
|
512
|
+
## 📄 许可证
|
|
513
|
+
|
|
514
|
+
[MIT License](LICENSE)
|
|
515
|
+
|
|
516
|
+
## 🔗 相关链接
|
|
517
|
+
|
|
518
|
+
- [ProseMirror](https://prosemirror.net/) - 底层编辑器框架
|
|
519
|
+
- [私有 npm Registry](http://npm.gzmiyuan.com:4873/) - 包管理服务
|
|
520
|
+
- [示例项目](playground/) - Playground 开发预览应用
|
|
521
|
+
- [问题反馈](https://github.com/your-org/miyuan-editor/issues)
|
|
522
|
+
|
|
523
|
+
---
|
|
524
|
+
|
|
525
|
+
Made with ❤️ by miyuan Team
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
require("../prompt-CGLw2O21.cjs");
|
|
3
|
+
const require_dist = require("../dist-CRSJDo2G.cjs");
|
|
4
|
+
const require_extension = require("../extension-BPFuYyzN.cjs");
|
|
5
|
+
const require_dist$1 = require("../dist-rItBfhNb.cjs");
|
|
6
|
+
exports.AddMarkStep = require_dist.AddMarkStep;
|
|
7
|
+
exports.EditorState = require_dist.EditorState;
|
|
8
|
+
exports.EditorView = require_extension.EditorView;
|
|
9
|
+
exports.ExtensionManager = require_extension.ExtensionManager;
|
|
10
|
+
exports.Fragment = require_dist.Fragment;
|
|
11
|
+
exports.Mapping = require_dist.Mapping;
|
|
12
|
+
exports.Mark = require_dist.Mark;
|
|
13
|
+
exports.Node = require_dist.Node;
|
|
14
|
+
exports.Plugin = require_dist.Plugin;
|
|
15
|
+
exports.PluginKey = require_dist.PluginKey;
|
|
16
|
+
exports.RemoveMarkStep = require_dist.RemoveMarkStep;
|
|
17
|
+
exports.ReplaceStep = require_dist.ReplaceStep;
|
|
18
|
+
exports.ResolvedPos = require_dist.ResolvedPos;
|
|
19
|
+
exports.Schema = require_dist.Schema;
|
|
20
|
+
exports.Slice = require_dist.Slice;
|
|
21
|
+
exports.Step = require_dist.Step;
|
|
22
|
+
exports.StepMap = require_dist.StepMap;
|
|
23
|
+
exports.Transaction = require_dist.Transaction;
|
|
24
|
+
exports.Transform = require_dist.Transform;
|
|
25
|
+
exports.baseKeymap = require_dist.baseKeymap;
|
|
26
|
+
exports.deleteSelection = require_dist.deleteSelection;
|
|
27
|
+
exports.history = require_dist$1.history;
|
|
28
|
+
exports.joinBackward = require_dist.joinBackward;
|
|
29
|
+
exports.joinForward = require_dist.joinForward;
|
|
30
|
+
exports.keymap = require_extension.keymap;
|
|
31
|
+
exports.lift = require_dist.lift;
|
|
32
|
+
exports.liftListItem = require_dist$1.liftListItem;
|
|
33
|
+
exports.redo = require_dist$1.redo;
|
|
34
|
+
exports.selectAll = require_dist.selectAll;
|
|
35
|
+
exports.setBlockType = require_dist.setBlockType;
|
|
36
|
+
exports.sinkListItem = require_dist$1.sinkListItem;
|
|
37
|
+
exports.splitListItem = require_dist$1.splitListItem;
|
|
38
|
+
exports.toggleMark = require_dist.toggleMark;
|
|
39
|
+
exports.undo = require_dist$1.undo;
|
|
40
|
+
exports.wrapIn = require_dist.wrapIn;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { C as Step, I as ResolvedPos, L as Schema, M as Fragment, N as Mark, P as Node, R as Slice, S as ReplaceStep, T as Transform, _ as Transaction, a as lift, b as RemoveMarkStep, c as toggleMark, d as EditorState, i as joinForward, l as wrapIn, m as PluginKey, n as deleteSelection, o as selectAll, p as Plugin, r as joinBackward, s as setBlockType, t as baseKeymap, v as AddMarkStep, w as StepMap, y as Mapping } from "../dist-5Q_Z9Ell.js";
|
|
2
|
+
import { n as keymap, r as EditorView, t as ExtensionManager } from "../extension-Cl6x5MDR.js";
|
|
3
|
+
import { a as sinkListItem, i as liftListItem, n as redo, o as splitListItem, r as undo, t as history } from "../dist-CnVrDtsI.js";
|
|
4
|
+
export { AddMarkStep, EditorState, EditorView, ExtensionManager, Fragment, Mapping, Mark, Node, Plugin, PluginKey, RemoveMarkStep, ReplaceStep, ResolvedPos, Schema, Slice, Step, StepMap, Transaction, Transform, baseKeymap, deleteSelection, history, joinBackward, joinForward, keymap, lift, liftListItem, redo, selectAll, setBlockType, sinkListItem, splitListItem, toggleMark, undo, wrapIn };
|