@mxmweb/rtext 1.0.1
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 +350 -0
- package/assets/style.css +1 -0
- package/core/converters/deserializers.d.ts +5 -0
- package/core/converters/slateConverters.d.ts +55 -0
- package/core/events.d.ts +61 -0
- package/core/types.d.ts +176 -0
- package/core/utils.d.ts +136 -0
- package/index.d.ts +2 -0
- package/index.js +12469 -0
- package/lib_enter.d.ts +7 -0
- package/package.json +20 -0
- package/vite.svg +1 -0
- package/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
- package/vs/base/common/worker/simpleWorker.nls.de.js +8 -0
- package/vs/base/common/worker/simpleWorker.nls.es.js +8 -0
- package/vs/base/common/worker/simpleWorker.nls.fr.js +8 -0
- package/vs/base/common/worker/simpleWorker.nls.it.js +8 -0
- package/vs/base/common/worker/simpleWorker.nls.ja.js +8 -0
- package/vs/base/common/worker/simpleWorker.nls.js +8 -0
- package/vs/base/common/worker/simpleWorker.nls.ko.js +8 -0
- package/vs/base/common/worker/simpleWorker.nls.ru.js +8 -0
- package/vs/base/common/worker/simpleWorker.nls.zh-cn.js +8 -0
- package/vs/base/common/worker/simpleWorker.nls.zh-tw.js +8 -0
- package/vs/base/worker/workerMain.js +27 -0
- package/vs/basic-languages/abap/abap.js +10 -0
- package/vs/basic-languages/apex/apex.js +10 -0
- package/vs/basic-languages/azcli/azcli.js +10 -0
- package/vs/basic-languages/bat/bat.js +10 -0
- package/vs/basic-languages/bicep/bicep.js +11 -0
- package/vs/basic-languages/cameligo/cameligo.js +10 -0
- package/vs/basic-languages/clojure/clojure.js +10 -0
- package/vs/basic-languages/coffee/coffee.js +10 -0
- package/vs/basic-languages/cpp/cpp.js +10 -0
- package/vs/basic-languages/csharp/csharp.js +10 -0
- package/vs/basic-languages/csp/csp.js +10 -0
- package/vs/basic-languages/css/css.js +12 -0
- package/vs/basic-languages/cypher/cypher.js +10 -0
- package/vs/basic-languages/dart/dart.js +10 -0
- package/vs/basic-languages/dockerfile/dockerfile.js +10 -0
- package/vs/basic-languages/ecl/ecl.js +10 -0
- package/vs/basic-languages/elixir/elixir.js +10 -0
- package/vs/basic-languages/flow9/flow9.js +10 -0
- package/vs/basic-languages/freemarker2/freemarker2.js +12 -0
- package/vs/basic-languages/fsharp/fsharp.js +10 -0
- package/vs/basic-languages/go/go.js +10 -0
- package/vs/basic-languages/graphql/graphql.js +10 -0
- package/vs/basic-languages/handlebars/handlebars.js +10 -0
- package/vs/basic-languages/hcl/hcl.js +10 -0
- package/vs/basic-languages/html/html.js +10 -0
- package/vs/basic-languages/ini/ini.js +10 -0
- package/vs/basic-languages/java/java.js +10 -0
- package/vs/basic-languages/javascript/javascript.js +10 -0
- package/vs/basic-languages/julia/julia.js +10 -0
- package/vs/basic-languages/kotlin/kotlin.js +10 -0
- package/vs/basic-languages/less/less.js +11 -0
- package/vs/basic-languages/lexon/lexon.js +10 -0
- package/vs/basic-languages/liquid/liquid.js +10 -0
- package/vs/basic-languages/lua/lua.js +10 -0
- package/vs/basic-languages/m3/m3.js +10 -0
- package/vs/basic-languages/markdown/markdown.js +10 -0
- package/vs/basic-languages/mdx/mdx.js +10 -0
- package/vs/basic-languages/mips/mips.js +10 -0
- package/vs/basic-languages/msdax/msdax.js +10 -0
- package/vs/basic-languages/mysql/mysql.js +10 -0
- package/vs/basic-languages/objective-c/objective-c.js +10 -0
- package/vs/basic-languages/pascal/pascal.js +10 -0
- package/vs/basic-languages/pascaligo/pascaligo.js +10 -0
- package/vs/basic-languages/perl/perl.js +10 -0
- package/vs/basic-languages/pgsql/pgsql.js +10 -0
- package/vs/basic-languages/php/php.js +10 -0
- package/vs/basic-languages/pla/pla.js +10 -0
- package/vs/basic-languages/postiats/postiats.js +10 -0
- package/vs/basic-languages/powerquery/powerquery.js +10 -0
- package/vs/basic-languages/powershell/powershell.js +10 -0
- package/vs/basic-languages/protobuf/protobuf.js +11 -0
- package/vs/basic-languages/pug/pug.js +10 -0
- package/vs/basic-languages/python/python.js +10 -0
- package/vs/basic-languages/qsharp/qsharp.js +10 -0
- package/vs/basic-languages/r/r.js +10 -0
- package/vs/basic-languages/razor/razor.js +10 -0
- package/vs/basic-languages/redis/redis.js +10 -0
- package/vs/basic-languages/redshift/redshift.js +10 -0
- package/vs/basic-languages/restructuredtext/restructuredtext.js +10 -0
- package/vs/basic-languages/ruby/ruby.js +10 -0
- package/vs/basic-languages/rust/rust.js +10 -0
- package/vs/basic-languages/sb/sb.js +10 -0
- package/vs/basic-languages/scala/scala.js +10 -0
- package/vs/basic-languages/scheme/scheme.js +10 -0
- package/vs/basic-languages/scss/scss.js +12 -0
- package/vs/basic-languages/shell/shell.js +10 -0
- package/vs/basic-languages/solidity/solidity.js +10 -0
- package/vs/basic-languages/sophia/sophia.js +10 -0
- package/vs/basic-languages/sparql/sparql.js +10 -0
- package/vs/basic-languages/sql/sql.js +10 -0
- package/vs/basic-languages/st/st.js +10 -0
- package/vs/basic-languages/swift/swift.js +13 -0
- package/vs/basic-languages/systemverilog/systemverilog.js +10 -0
- package/vs/basic-languages/tcl/tcl.js +10 -0
- package/vs/basic-languages/twig/twig.js +10 -0
- package/vs/basic-languages/typescript/typescript.js +10 -0
- package/vs/basic-languages/vb/vb.js +10 -0
- package/vs/basic-languages/wgsl/wgsl.js +307 -0
- package/vs/basic-languages/xml/xml.js +10 -0
- package/vs/basic-languages/yaml/yaml.js +10 -0
- package/vs/editor/editor.main.css +6 -0
- package/vs/editor/editor.main.js +745 -0
- package/vs/editor/editor.main.js.gz +0 -0
- package/vs/editor/editor.main.nls.de.js +31 -0
- package/vs/editor/editor.main.nls.es.js +31 -0
- package/vs/editor/editor.main.nls.fr.js +29 -0
- package/vs/editor/editor.main.nls.it.js +29 -0
- package/vs/editor/editor.main.nls.ja.js +31 -0
- package/vs/editor/editor.main.nls.js +29 -0
- package/vs/editor/editor.main.nls.ko.js +29 -0
- package/vs/editor/editor.main.nls.ru.js +31 -0
- package/vs/editor/editor.main.nls.zh-cn.js +31 -0
- package/vs/editor/editor.main.nls.zh-tw.js +29 -0
- package/vs/language/css/cssMode.js +13 -0
- package/vs/language/css/cssWorker.js +81 -0
- package/vs/language/css/cssWorker.js.gz +0 -0
- package/vs/language/html/htmlMode.js +13 -0
- package/vs/language/html/htmlWorker.js +453 -0
- package/vs/language/json/jsonMode.js +15 -0
- package/vs/language/json/jsonWorker.js +36 -0
- package/vs/language/typescript/tsMode.js +20 -0
- package/vs/language/typescript/tsWorker.js +37016 -0
- package/vs/language/typescript/tsWorker.js.gz +0 -0
- package/vs/loader.js +11 -0
- package/worker/pdf.worker.min.mjs +21 -0
package/README.md
ADDED
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
# @mxmweb/rtext - 统一富文本组件库
|
|
2
|
+
|
|
3
|
+
一个基于 slate.js 的统一富文本组件库,提供强大的富文本编辑和渲染功能,支持多种数据格式和虚拟滚动。
|
|
4
|
+
|
|
5
|
+
## 🚀 特性
|
|
6
|
+
|
|
7
|
+
- 📝 **统一富文本组件** - 支持编辑和渲染模式
|
|
8
|
+
- 🎨 **多种数据格式** - 支持 Slate、Markdown、HTML、Text 格式
|
|
9
|
+
- ⚡ **虚拟滚动** - 高性能大数据渲染
|
|
10
|
+
- 📦 **分段加载** - 支持动态内容加载
|
|
11
|
+
- 🎯 **主题定制** - 灵活的主题配置系统
|
|
12
|
+
- 📱 **响应式设计** - 支持不同尺寸和屏幕
|
|
13
|
+
- 🔧 **TypeScript** - 完整的类型支持
|
|
14
|
+
- 🎪 **代码块复制** - 一键复制代码内容
|
|
15
|
+
|
|
16
|
+
## 📦 安装
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install @mxmweb/rtext
|
|
20
|
+
# 或
|
|
21
|
+
yarn add @mxmweb/rtext
|
|
22
|
+
# 或
|
|
23
|
+
pnpm add @mxmweb/rtext
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## 🎯 核心组件
|
|
27
|
+
|
|
28
|
+
### UnifiedRichText - 统一富文本组件
|
|
29
|
+
|
|
30
|
+
核心的富文本组件,支持多种数据格式的编辑和渲染。
|
|
31
|
+
|
|
32
|
+
```tsx
|
|
33
|
+
import { UnifiedRichText, DataType } from '@mxmweb/rtext';
|
|
34
|
+
|
|
35
|
+
// 基本使用
|
|
36
|
+
<UnifiedRichText
|
|
37
|
+
dataSource={{
|
|
38
|
+
type: DataType.MARKDOWN,
|
|
39
|
+
content: '# Hello World\n\nThis is **bold** text.'
|
|
40
|
+
}}
|
|
41
|
+
isEditing={false}
|
|
42
|
+
theme={{
|
|
43
|
+
primaryColor: '#007bff',
|
|
44
|
+
backgroundColor: '#ffffff'
|
|
45
|
+
}}
|
|
46
|
+
/>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
#### Props
|
|
50
|
+
|
|
51
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
52
|
+
|------|------|--------|------|
|
|
53
|
+
| `dataSource` | `DataSource` | - | 数据源对象 |
|
|
54
|
+
| `isEditing` | `boolean` | `false` | 是否编辑模式 |
|
|
55
|
+
| `placeholder` | `string` | `'开始输入...'` | 占位符文本 |
|
|
56
|
+
| `size` | `'sm' \| 'md'` | `'md'` | 组件尺寸 |
|
|
57
|
+
| `theme` | `Theme` | `{}` | 主题配置 |
|
|
58
|
+
| `onChange` | `(content, type) => void` | - | 内容变化回调 |
|
|
59
|
+
| `onFocus` | `() => void` | - | 焦点回调 |
|
|
60
|
+
| `onBlur` | `() => void` | - | 失焦回调 |
|
|
61
|
+
|
|
62
|
+
### Markdownit - 高级 Markdown 渲染组件
|
|
63
|
+
|
|
64
|
+
基于 UnifiedRichText 的高级组件,提供虚拟滚动和分段加载功能。
|
|
65
|
+
|
|
66
|
+
```tsx
|
|
67
|
+
import { Markdownit } from '@mxmweb/rtext';
|
|
68
|
+
|
|
69
|
+
// 基本使用
|
|
70
|
+
<Markdownit
|
|
71
|
+
dataSource={{
|
|
72
|
+
type: DataType.MARKDOWN,
|
|
73
|
+
content: '# 标题\n\n内容...'
|
|
74
|
+
}}
|
|
75
|
+
enableVirtualScroll={true}
|
|
76
|
+
size="md"
|
|
77
|
+
theme={{
|
|
78
|
+
primaryColor: '#007bff',
|
|
79
|
+
backgroundColor: '#ffffff'
|
|
80
|
+
}}
|
|
81
|
+
/>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
#### Props
|
|
85
|
+
|
|
86
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
87
|
+
|------|------|--------|------|
|
|
88
|
+
| `dataSource` | `DataSource \| SegmentData[]` | - | 数据源 |
|
|
89
|
+
| `enableVirtualScroll` | `boolean` | `false` | 启用虚拟滚动 |
|
|
90
|
+
| `itemHeight` | `number` | `200` | 虚拟滚动项高度 |
|
|
91
|
+
| `preloadCount` | `number` | `5` | 预加载项数量 |
|
|
92
|
+
| `enableSegmentedLoading` | `boolean` | `false` | 启用分段加载 |
|
|
93
|
+
| `onLoadMore` | `(lastSegmentId) => Promise<SegmentData[]>` | - | 加载更多回调 |
|
|
94
|
+
| `isLoadingMore` | `boolean` | `false` | 是否正在加载 |
|
|
95
|
+
| `size` | `'sm' \| 'md'` | `'sm'` | 组件尺寸 |
|
|
96
|
+
| `theme` | `Theme` | `{}` | 主题配置 |
|
|
97
|
+
| `onChange` | `(content, type) => void` | - | 内容变化回调 |
|
|
98
|
+
| `onScroll` | `(scrollTop, scrollHeight) => void` | - | 滚动回调 |
|
|
99
|
+
| `onSegmentClick` | `(segmentId, segment) => void` | - | 分段点击回调 |
|
|
100
|
+
|
|
101
|
+
## 📚 数据类型
|
|
102
|
+
|
|
103
|
+
### DataType 枚举
|
|
104
|
+
|
|
105
|
+
```tsx
|
|
106
|
+
enum DataType {
|
|
107
|
+
SLATE = 'slate', // Slate.js 格式
|
|
108
|
+
MARKDOWN = 'markdown', // Markdown 格式
|
|
109
|
+
HTML = 'html', // HTML 格式
|
|
110
|
+
TEXT = 'text' // 纯文本格式
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### DataSource 接口
|
|
115
|
+
|
|
116
|
+
```tsx
|
|
117
|
+
interface DataSource {
|
|
118
|
+
type: DataType;
|
|
119
|
+
content: any;
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### SegmentData 接口
|
|
124
|
+
|
|
125
|
+
```tsx
|
|
126
|
+
interface SegmentData {
|
|
127
|
+
id: string;
|
|
128
|
+
content: string | CustomElement[];
|
|
129
|
+
type: DataType;
|
|
130
|
+
timestamp?: number;
|
|
131
|
+
metadata?: Record<string, any>;
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## 🎨 主题配置
|
|
136
|
+
|
|
137
|
+
### Theme 接口
|
|
138
|
+
|
|
139
|
+
```tsx
|
|
140
|
+
interface Theme {
|
|
141
|
+
primaryColor?: string; // 主色调
|
|
142
|
+
secondaryColor?: string; // 次要色调
|
|
143
|
+
backgroundColor?: string; // 背景色
|
|
144
|
+
textColor?: string; // 文本色
|
|
145
|
+
borderColor?: string; // 边框色
|
|
146
|
+
disabledBackground?: string; // 禁用背景色
|
|
147
|
+
hoverBackground?: string; // 悬停背景色
|
|
148
|
+
borderRadius?: string; // 圆角
|
|
149
|
+
padding?: string; // 内边距
|
|
150
|
+
margin?: string; // 外边距
|
|
151
|
+
minHeight?: string; // 最小高度
|
|
152
|
+
scrollbarTrack?: string; // 滚动条轨道色
|
|
153
|
+
scrollbarThumb?: string; // 滚动条滑块色
|
|
154
|
+
scrollbarThumbHover?: string; // 滚动条滑块悬停色
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## 🔧 高级功能
|
|
159
|
+
|
|
160
|
+
### 虚拟滚动
|
|
161
|
+
|
|
162
|
+
对于大量数据的渲染,启用虚拟滚动可以显著提升性能:
|
|
163
|
+
|
|
164
|
+
```tsx
|
|
165
|
+
<Markdownit
|
|
166
|
+
dataSource={largeDataArray}
|
|
167
|
+
enableVirtualScroll={true}
|
|
168
|
+
itemHeight={200}
|
|
169
|
+
preloadCount={5}
|
|
170
|
+
/>
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### 分段加载
|
|
174
|
+
|
|
175
|
+
支持动态加载内容,适用于聊天记录等场景:
|
|
176
|
+
|
|
177
|
+
```tsx
|
|
178
|
+
<Markdownit
|
|
179
|
+
dataSource={segments}
|
|
180
|
+
enableSegmentedLoading={true}
|
|
181
|
+
onLoadMore={async (lastSegmentId) => {
|
|
182
|
+
// 加载更多数据
|
|
183
|
+
return await fetchMoreData(lastSegmentId);
|
|
184
|
+
}}
|
|
185
|
+
isLoadingMore={loading}
|
|
186
|
+
/>
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### 代码块复制
|
|
190
|
+
|
|
191
|
+
代码块自动支持复制功能,点击右上角的复制按钮即可复制代码内容。
|
|
192
|
+
|
|
193
|
+
### 响应式表格
|
|
194
|
+
|
|
195
|
+
表格支持横向滚动,当内容超出容器宽度时自动显示滚动条。
|
|
196
|
+
|
|
197
|
+
## 📁 目录结构
|
|
198
|
+
|
|
199
|
+
```
|
|
200
|
+
src/
|
|
201
|
+
├── core/ # 核心组件
|
|
202
|
+
│ ├── UnifiedRichText.tsx # 统一富文本组件
|
|
203
|
+
│ ├── richElements/ # 富文本元素渲染
|
|
204
|
+
│ │ ├── index.tsx # 元素渲染逻辑
|
|
205
|
+
│ │ └── styles.tsx # 样式定义
|
|
206
|
+
│ ├── converters/ # 数据转换器
|
|
207
|
+
│ │ ├── slateConverters.ts
|
|
208
|
+
│ │ └── deserializers.ts
|
|
209
|
+
│ ├── types.ts # 类型定义
|
|
210
|
+
│ ├── utils.ts # 工具函数
|
|
211
|
+
│ └── events.ts # 事件处理
|
|
212
|
+
├── adopters/ # 业务适配器
|
|
213
|
+
│ └── Markdownit.tsx # Markdown 渲染组件
|
|
214
|
+
└── types/ # 全局类型定义
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## 🚀 快速开始
|
|
218
|
+
|
|
219
|
+
### 1. 基本渲染
|
|
220
|
+
|
|
221
|
+
```tsx
|
|
222
|
+
import { Markdownit, DataType } from '@mxmweb/rtext';
|
|
223
|
+
|
|
224
|
+
function App() {
|
|
225
|
+
const markdownContent = `
|
|
226
|
+
# 欢迎使用
|
|
227
|
+
|
|
228
|
+
这是一个 **Markdown** 内容示例。
|
|
229
|
+
|
|
230
|
+
## 功能特性
|
|
231
|
+
|
|
232
|
+
- ✅ 支持 Markdown 语法
|
|
233
|
+
- ✅ 代码高亮
|
|
234
|
+
- ✅ 表格渲染
|
|
235
|
+
- ✅ 图片显示
|
|
236
|
+
|
|
237
|
+
\`\`\`javascript
|
|
238
|
+
console.log('Hello World!');
|
|
239
|
+
\`\`\`
|
|
240
|
+
`;
|
|
241
|
+
|
|
242
|
+
return (
|
|
243
|
+
<Markdownit
|
|
244
|
+
dataSource={{
|
|
245
|
+
type: DataType.MARKDOWN,
|
|
246
|
+
content: markdownContent
|
|
247
|
+
}}
|
|
248
|
+
size="md"
|
|
249
|
+
theme={{
|
|
250
|
+
primaryColor: '#007bff',
|
|
251
|
+
backgroundColor: '#ffffff'
|
|
252
|
+
}}
|
|
253
|
+
/>
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### 2. 编辑模式
|
|
259
|
+
|
|
260
|
+
```tsx
|
|
261
|
+
import { UnifiedRichText, DataType } from '@mxmweb/rtext';
|
|
262
|
+
|
|
263
|
+
function Editor() {
|
|
264
|
+
const [content, setContent] = useState({
|
|
265
|
+
type: DataType.SLATE,
|
|
266
|
+
content: [{ type: 'paragraph', children: [{ text: '' }] }]
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
return (
|
|
270
|
+
<UnifiedRichText
|
|
271
|
+
dataSource={content}
|
|
272
|
+
isEditing={true}
|
|
273
|
+
onChange={(newContent, type) => {
|
|
274
|
+
setContent({ type, content: newContent });
|
|
275
|
+
}}
|
|
276
|
+
placeholder="开始编写..."
|
|
277
|
+
/>
|
|
278
|
+
);
|
|
279
|
+
}
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
### 3. 虚拟滚动
|
|
283
|
+
|
|
284
|
+
```tsx
|
|
285
|
+
function VirtualScrollExample() {
|
|
286
|
+
const segments = [
|
|
287
|
+
{ id: '1', content: '# 第一段\n内容...', type: DataType.MARKDOWN },
|
|
288
|
+
{ id: '2', content: '# 第二段\n内容...', type: DataType.MARKDOWN },
|
|
289
|
+
// ... 更多数据
|
|
290
|
+
];
|
|
291
|
+
|
|
292
|
+
return (
|
|
293
|
+
<Markdownit
|
|
294
|
+
dataSource={segments}
|
|
295
|
+
enableVirtualScroll={true}
|
|
296
|
+
itemHeight={200}
|
|
297
|
+
height="600px"
|
|
298
|
+
onScroll={(scrollTop, scrollHeight) => {
|
|
299
|
+
console.log('滚动位置:', scrollTop);
|
|
300
|
+
}}
|
|
301
|
+
/>
|
|
302
|
+
);
|
|
303
|
+
}
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
## 🔧 开发指南
|
|
307
|
+
|
|
308
|
+
### 环境要求
|
|
309
|
+
|
|
310
|
+
- Node.js >= 18
|
|
311
|
+
- React >= 18
|
|
312
|
+
- TypeScript >= 4.9
|
|
313
|
+
|
|
314
|
+
### 本地开发
|
|
315
|
+
|
|
316
|
+
```bash
|
|
317
|
+
# 克隆仓库
|
|
318
|
+
git clone <repository-url>
|
|
319
|
+
cd base/slate
|
|
320
|
+
|
|
321
|
+
# 安装依赖
|
|
322
|
+
pnpm install
|
|
323
|
+
|
|
324
|
+
# 启动开发服务器
|
|
325
|
+
pnpm dev
|
|
326
|
+
|
|
327
|
+
# 构建
|
|
328
|
+
pnpm build
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
### 代码规范
|
|
332
|
+
|
|
333
|
+
- 使用 TypeScript 编写代码
|
|
334
|
+
- 遵循 ESLint 和 Prettier 配置
|
|
335
|
+
- 编写清晰的组件文档
|
|
336
|
+
- 添加必要的类型定义
|
|
337
|
+
|
|
338
|
+
## 📄 许可证
|
|
339
|
+
|
|
340
|
+
MIT
|
|
341
|
+
|
|
342
|
+
## 🤝 贡献
|
|
343
|
+
|
|
344
|
+
欢迎提交 Issue 和 Pull Request!
|
|
345
|
+
|
|
346
|
+
在提交代码前,请确保:
|
|
347
|
+
1. 代码符合项目规范
|
|
348
|
+
2. 添加了必要的测试
|
|
349
|
+
3. 更新了相关文档
|
|
350
|
+
4. 提交信息符合规范
|
package/assets/style.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-ease:initial}}:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-gray-50:oklch(98.5% .002 247.839);--color-gray-200:oklch(92.8% .006 264.531);--spacing:.25rem;--ease-in:cubic-bezier(.4,0,1,1);--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::-moz-placeholder{opacity:1}::placeholder{opacity:1}@supports (not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::-moz-placeholder{color:currentColor}::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::-moz-placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.end-1{inset-inline-end:calc(var(--spacing)*1)}.isolate{isolation:isolate}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.container\!{width:100%!important}@media (min-width:40rem){.container\!{max-width:40rem!important}}@media (min-width:48rem){.container\!{max-width:48rem!important}}@media (min-width:64rem){.container\!{max-width:64rem!important}}@media (min-width:80rem){.container\!{max-width:80rem!important}}@media (min-width:96rem){.container\!{max-width:96rem!important}}.mb-4{margin-bottom:calc(var(--spacing)*4)}.block{display:block}.block\!{display:block!important}.contents{display:contents}.flex{display:flex}.flow-root{display:flow-root}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-table{display:inline-table}.list-item{display:list-item}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-column{display:table-column}.table-column-group{display:table-column-group}.table-footer-group{display:table-footer-group}.table-header-group{display:table-header-group}.table-row{display:table-row}.table-row-group{display:table-row-group}.flex-shrink,.shrink{flex-shrink:1}.flex-grow,.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.cursor-pointer{cursor:pointer}.resize{resize:both}.flex-wrap{flex-wrap:wrap}.self-end{align-self:flex-end}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.rounded{border-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.bg-gray-200{background-color:var(--color-gray-200)}.mask-repeat{-webkit-mask-repeat:repeat;mask-repeat:repeat}.py-10{padding-block:calc(var(--spacing)*10)}.text-justify{text-align:justify}.break-all{word-break:break-all}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.diagonal-fractions{--tw-numeric-fraction:diagonal-fractions;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.lining-nums{--tw-numeric-figure:lining-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.oldstyle-nums{--tw-numeric-figure:oldstyle-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.proportional-nums{--tw-numeric-spacing:proportional-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.slashed-zero{--tw-slashed-zero:slashed-zero;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.stacked-fractions{--tw-numeric-fraction:stacked-fractions;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.overline{text-decoration-line:overline}.underline{text-decoration-line:underline}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.grayscale{--tw-grayscale:grayscale(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,visibility,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}@media (hover:hover){.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}}*{margin:0;padding:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export type CustomText = {
|
|
2
|
+
text: string;
|
|
3
|
+
bold?: boolean;
|
|
4
|
+
italic?: boolean;
|
|
5
|
+
underline?: boolean;
|
|
6
|
+
code?: boolean;
|
|
7
|
+
retrive?: boolean;
|
|
8
|
+
strikethrough?: boolean;
|
|
9
|
+
link?: string;
|
|
10
|
+
};
|
|
11
|
+
export interface BaseElement {
|
|
12
|
+
type: string;
|
|
13
|
+
children: (CustomElement | CustomText)[];
|
|
14
|
+
align?: 'left' | 'center' | 'right';
|
|
15
|
+
}
|
|
16
|
+
export interface ParagraphElement extends BaseElement {
|
|
17
|
+
type: 'paragraph';
|
|
18
|
+
}
|
|
19
|
+
export interface HeadingOneElement extends BaseElement {
|
|
20
|
+
type: 'heading-one';
|
|
21
|
+
}
|
|
22
|
+
export interface HeadingTwoElement extends BaseElement {
|
|
23
|
+
type: 'heading-two';
|
|
24
|
+
}
|
|
25
|
+
export interface HeadingThreeElement extends BaseElement {
|
|
26
|
+
type: 'heading-three';
|
|
27
|
+
}
|
|
28
|
+
export interface ListElement extends BaseElement {
|
|
29
|
+
type: 'bulleted-list' | 'numbered-list';
|
|
30
|
+
}
|
|
31
|
+
export interface ListItemElement extends BaseElement {
|
|
32
|
+
type: 'list-item';
|
|
33
|
+
}
|
|
34
|
+
export interface TableElement extends BaseElement {
|
|
35
|
+
type: 'table';
|
|
36
|
+
}
|
|
37
|
+
export interface TableRowElement extends BaseElement {
|
|
38
|
+
type: 'table-row';
|
|
39
|
+
}
|
|
40
|
+
export interface TableCellElement extends BaseElement {
|
|
41
|
+
type: 'table-cell';
|
|
42
|
+
}
|
|
43
|
+
export interface ImageElement extends BaseElement {
|
|
44
|
+
type: 'image';
|
|
45
|
+
url: string;
|
|
46
|
+
}
|
|
47
|
+
export interface CodeBlockElement extends BaseElement {
|
|
48
|
+
type: 'code-block';
|
|
49
|
+
}
|
|
50
|
+
export interface BlockQuoteElement extends BaseElement {
|
|
51
|
+
type: 'block-quote';
|
|
52
|
+
}
|
|
53
|
+
export type CustomElement = ParagraphElement | HeadingOneElement | HeadingTwoElement | HeadingThreeElement | ListElement | ListItemElement | TableElement | TableRowElement | TableCellElement | ImageElement | CodeBlockElement | BlockQuoteElement;
|
|
54
|
+
export declare const serializeToMarkdown: (nodes: CustomElement[]) => string;
|
|
55
|
+
export declare const serializeToHtml: (nodes: CustomElement[]) => string;
|
package/core/events.d.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { RichTextEvents, MergedEventsEmit } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* 合并事件函数,劫持并连接用户层和核心层的事件功能管理
|
|
4
|
+
* @param userEvents 用户层事件
|
|
5
|
+
* @param coreEvents 核心层事件
|
|
6
|
+
* @returns 合并后的事件函数
|
|
7
|
+
*/
|
|
8
|
+
export declare function mergedEventsEmit(userEvents?: RichTextEvents, coreEvents?: RichTextEvents): MergedEventsEmit;
|
|
9
|
+
/**
|
|
10
|
+
* 创建事件处理器对象
|
|
11
|
+
* @param mergedEmit 合并的事件函数
|
|
12
|
+
* @returns 事件处理器对象
|
|
13
|
+
*/
|
|
14
|
+
export declare function createEventHandlers(mergedEmit: MergedEventsEmit): RichTextEvents;
|
|
15
|
+
/**
|
|
16
|
+
* 防抖事件处理器
|
|
17
|
+
* @param handler 原始事件处理器
|
|
18
|
+
* @param delay 延迟时间(毫秒)
|
|
19
|
+
* @returns 防抖后的事件处理器
|
|
20
|
+
*/
|
|
21
|
+
export declare function debounceEvent<T extends (...args: any[]) => void>(handler: T, delay: number): T;
|
|
22
|
+
/**
|
|
23
|
+
* 节流事件处理器
|
|
24
|
+
* @param handler 原始事件处理器
|
|
25
|
+
* @param delay 延迟时间(毫秒)
|
|
26
|
+
* @returns 节流后的事件处理器
|
|
27
|
+
*/
|
|
28
|
+
export declare function throttleEvent<T extends (...args: any[]) => void>(handler: T, delay: number): T;
|
|
29
|
+
/**
|
|
30
|
+
* 事件总线类,用于组件间通信
|
|
31
|
+
*/
|
|
32
|
+
export declare class EventBus {
|
|
33
|
+
private events;
|
|
34
|
+
/**
|
|
35
|
+
* 订阅事件
|
|
36
|
+
* @param eventName 事件名称
|
|
37
|
+
* @param handler 事件处理器
|
|
38
|
+
*/
|
|
39
|
+
on(eventName: string, handler: Function): void;
|
|
40
|
+
/**
|
|
41
|
+
* 取消订阅事件
|
|
42
|
+
* @param eventName 事件名称
|
|
43
|
+
* @param handler 事件处理器
|
|
44
|
+
*/
|
|
45
|
+
off(eventName: string, handler: Function): void;
|
|
46
|
+
/**
|
|
47
|
+
* 触发事件
|
|
48
|
+
* @param eventName 事件名称
|
|
49
|
+
* @param args 事件参数
|
|
50
|
+
*/
|
|
51
|
+
emit(eventName: string, ...args: any[]): void;
|
|
52
|
+
/**
|
|
53
|
+
* 清空所有事件
|
|
54
|
+
*/
|
|
55
|
+
clear(): void;
|
|
56
|
+
}
|
|
57
|
+
export declare const globalEventBus: EventBus;
|
|
58
|
+
/**
|
|
59
|
+
* 创建富文本编辑器专用的事件总线
|
|
60
|
+
*/
|
|
61
|
+
export declare function createRichTextEventBus(): EventBus;
|
package/core/types.d.ts
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { BaseEditor } from 'slate';
|
|
3
|
+
import { ReactEditor } from 'slate-react';
|
|
4
|
+
import { RichTextTheme } from './theme';
|
|
5
|
+
export interface RichTextEditorProps {
|
|
6
|
+
/** 初始值 */
|
|
7
|
+
initialValue?: CustomElement[];
|
|
8
|
+
/** 主题样式 */
|
|
9
|
+
styles?: RichTextStyles;
|
|
10
|
+
/** 是否只读 */
|
|
11
|
+
readOnly?: boolean;
|
|
12
|
+
/** 占位符文本 */
|
|
13
|
+
placeholder?: string;
|
|
14
|
+
/** 最小高度 */
|
|
15
|
+
minHeight?: string;
|
|
16
|
+
/** 最大高度 */
|
|
17
|
+
maxHeight?: string;
|
|
18
|
+
/** 是否显示工具栏 */
|
|
19
|
+
showToolbar?: boolean;
|
|
20
|
+
/** 自定义工具栏 */
|
|
21
|
+
customToolbar?: React.ReactNode;
|
|
22
|
+
/** 编辑器变化回调 */
|
|
23
|
+
onChange?: (value: CustomElement[]) => void;
|
|
24
|
+
/** 编辑器焦点回调 */
|
|
25
|
+
onFocus?: () => void;
|
|
26
|
+
/** 编辑器失焦回调 */
|
|
27
|
+
onBlur?: () => void;
|
|
28
|
+
/** 自定义渲染元素 */
|
|
29
|
+
renderElement?: (props: any) => JSX.Element;
|
|
30
|
+
/** 自定义渲染叶子节点 */
|
|
31
|
+
renderLeaf?: (props: any) => JSX.Element;
|
|
32
|
+
/** 自定义样式 */
|
|
33
|
+
className?: string;
|
|
34
|
+
/** 自定义样式对象 */
|
|
35
|
+
style?: React.CSSProperties;
|
|
36
|
+
}
|
|
37
|
+
export interface RichTextRendererProps {
|
|
38
|
+
/** 要渲染的内容 */
|
|
39
|
+
content: CustomElement[] | string;
|
|
40
|
+
/** 主题样式 */
|
|
41
|
+
styles?: RichTextStyles;
|
|
42
|
+
/** 是否显示工具栏 */
|
|
43
|
+
showToolbar?: boolean;
|
|
44
|
+
/** 自定义工具栏 */
|
|
45
|
+
customToolbar?: React.ReactNode;
|
|
46
|
+
/** 自定义渲染元素 */
|
|
47
|
+
renderElement?: (props: any) => JSX.Element;
|
|
48
|
+
/** 自定义渲染叶子节点 */
|
|
49
|
+
renderLeaf?: (props: any) => JSX.Element;
|
|
50
|
+
/** 自定义样式 */
|
|
51
|
+
className?: string;
|
|
52
|
+
/** 自定义样式对象 */
|
|
53
|
+
style?: React.CSSProperties;
|
|
54
|
+
}
|
|
55
|
+
export interface MarkdownRendererProps {
|
|
56
|
+
/** Markdown文本内容 */
|
|
57
|
+
content: string;
|
|
58
|
+
/** 主题样式 */
|
|
59
|
+
styles?: RichTextStyles;
|
|
60
|
+
/** 是否转换为富文本后渲染 */
|
|
61
|
+
convertToRichText?: boolean;
|
|
62
|
+
/** 自定义样式 */
|
|
63
|
+
className?: string;
|
|
64
|
+
/** 自定义样式对象 */
|
|
65
|
+
style?: React.CSSProperties;
|
|
66
|
+
}
|
|
67
|
+
export interface RichTextStyles {
|
|
68
|
+
theme?: RichTextTheme;
|
|
69
|
+
mode?: 'light' | 'dark';
|
|
70
|
+
[key: string]: any;
|
|
71
|
+
}
|
|
72
|
+
export interface RichTextEvents {
|
|
73
|
+
onChange?: (value: CustomElement[]) => void;
|
|
74
|
+
onFocus?: () => void;
|
|
75
|
+
onBlur?: () => void;
|
|
76
|
+
onSelectionChange?: (selection: any) => void;
|
|
77
|
+
onKeyDown?: (event: React.KeyboardEvent) => void;
|
|
78
|
+
onPaste?: (event: React.ClipboardEvent) => void;
|
|
79
|
+
onDrop?: (event: React.DragEvent) => void;
|
|
80
|
+
}
|
|
81
|
+
export interface ToolbarButton {
|
|
82
|
+
/** 按钮类型 */
|
|
83
|
+
type: string;
|
|
84
|
+
/** 按钮图标 */
|
|
85
|
+
icon: React.ReactNode;
|
|
86
|
+
/** 按钮标题 */
|
|
87
|
+
title: string;
|
|
88
|
+
/** 是否激活 */
|
|
89
|
+
isActive?: boolean;
|
|
90
|
+
/** 点击回调 */
|
|
91
|
+
onClick: () => void;
|
|
92
|
+
/** 是否禁用 */
|
|
93
|
+
disabled?: boolean;
|
|
94
|
+
}
|
|
95
|
+
export type CustomText = {
|
|
96
|
+
text: string;
|
|
97
|
+
bold?: boolean;
|
|
98
|
+
italic?: boolean;
|
|
99
|
+
underline?: boolean;
|
|
100
|
+
code?: boolean;
|
|
101
|
+
strikethrough?: boolean;
|
|
102
|
+
link?: string;
|
|
103
|
+
color?: string;
|
|
104
|
+
backgroundColor?: string;
|
|
105
|
+
};
|
|
106
|
+
export interface BaseElement {
|
|
107
|
+
type: string;
|
|
108
|
+
children: (CustomElement | CustomText)[];
|
|
109
|
+
align?: 'left' | 'center' | 'right';
|
|
110
|
+
}
|
|
111
|
+
export interface ParagraphElement extends BaseElement {
|
|
112
|
+
type: 'paragraph';
|
|
113
|
+
}
|
|
114
|
+
export interface HeadingOneElement extends BaseElement {
|
|
115
|
+
type: 'heading-one';
|
|
116
|
+
}
|
|
117
|
+
export interface HeadingTwoElement extends BaseElement {
|
|
118
|
+
type: 'heading-two';
|
|
119
|
+
}
|
|
120
|
+
export interface HeadingThreeElement extends BaseElement {
|
|
121
|
+
type: 'heading-three';
|
|
122
|
+
}
|
|
123
|
+
export interface ListElement extends BaseElement {
|
|
124
|
+
type: 'bulleted-list' | 'numbered-list';
|
|
125
|
+
}
|
|
126
|
+
export interface ListItemElement extends BaseElement {
|
|
127
|
+
type: 'list-item';
|
|
128
|
+
}
|
|
129
|
+
export interface TableElement extends BaseElement {
|
|
130
|
+
type: 'table';
|
|
131
|
+
}
|
|
132
|
+
export interface TableRowElement extends BaseElement {
|
|
133
|
+
type: 'table-row';
|
|
134
|
+
}
|
|
135
|
+
export interface TableCellElement extends BaseElement {
|
|
136
|
+
type: 'table-cell';
|
|
137
|
+
header?: boolean;
|
|
138
|
+
}
|
|
139
|
+
export interface ImageElement extends BaseElement {
|
|
140
|
+
type: 'image';
|
|
141
|
+
url: string;
|
|
142
|
+
alt?: string;
|
|
143
|
+
width?: number;
|
|
144
|
+
height?: number;
|
|
145
|
+
}
|
|
146
|
+
export interface CodeBlockElement extends BaseElement {
|
|
147
|
+
type: 'code-block';
|
|
148
|
+
language?: string;
|
|
149
|
+
}
|
|
150
|
+
export interface BlockQuoteElement extends BaseElement {
|
|
151
|
+
type: 'block-quote';
|
|
152
|
+
}
|
|
153
|
+
export interface LinkElement extends BaseElement {
|
|
154
|
+
type: 'link';
|
|
155
|
+
url: string;
|
|
156
|
+
}
|
|
157
|
+
export type CustomElement = ParagraphElement | HeadingOneElement | HeadingTwoElement | HeadingThreeElement | ListElement | ListItemElement | TableElement | TableRowElement | TableCellElement | ImageElement | CodeBlockElement | BlockQuoteElement | LinkElement;
|
|
158
|
+
declare module 'slate' {
|
|
159
|
+
interface CustomTypes {
|
|
160
|
+
Editor: BaseEditor & ReactEditor;
|
|
161
|
+
Element: CustomElement;
|
|
162
|
+
Text: CustomText;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
export interface AdapterProps {
|
|
166
|
+
/** 主题样式 */
|
|
167
|
+
styles?: RichTextStyles;
|
|
168
|
+
/** 事件回调 */
|
|
169
|
+
events?: RichTextEvents;
|
|
170
|
+
/** 自定义组件 */
|
|
171
|
+
customComponents?: Record<string, React.ComponentType<any>>;
|
|
172
|
+
/** 其他属性 */
|
|
173
|
+
[key: string]: any;
|
|
174
|
+
}
|
|
175
|
+
export type MergedEventsEmit = (eventName: string, ...args: any[]) => void;
|
|
176
|
+
export type MergedCustomizeComponents = Record<string, React.ComponentType<any>>;
|