# neweditor
**Repository Path**: xzq_95/neweditor
## Basic Information
- **Project Name**: neweditor
- **Description**: 这是富文本编辑器的仓库
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-10-28
- **Last Updated**: 2026-02-26
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# TestFox RichText Editor
基于 TipTap 的富文本编辑器,专为 TestFox 项目设计,支持完整的主题系统和亮色/暗色模式切换。
## 特性
- ✅ 完整的富文本编辑功能
- ✅ 支持 40+ 种编程语言语法高亮
- ✅ Slash Command(斜杠命令)快捷操作
- ✅ 图片粘贴上传(Ctrl+V)
- ✅ 文件拖拽上传(图片、视频、音频)
- ✅ 自动上传到服务器(支持自定义上传处理器)
- ✅ 拖拽排序功能
- ✅ 表格编辑(合并单元格、调整列宽等)
- ✅ 多语言支持(中文/英文)
- ✅ 主题系统(亮色/暗色模式)
- ✅ 响应式设计
## 安装
```bash
npm install neweditor
# 或
pnpm install neweditor
# 或
yarn add neweditor
```
## 使用
### 基础使用
```vue
```
### 完整示例
```vue
```
### 带文件上传功能的示例
```vue
```
## API
### useEditor(options)
创建编辑器实例的 Hook。
**参数:**
```typescript
interface EditorOptions {
extensions: Extension[] // 扩展列表
content?: string // 初始内容(HTML)
editable?: boolean // 是否可编辑
autofocus?: boolean // 是否自动聚焦
editorProps?: EditorProps // 编辑器属性
onUpdate?: (props) => void // 内容更新回调
onFocus?: (props) => void // 获得焦点回调
onBlur?: (props) => void // 失去焦点回调
onCreate?: (props) => void // 创建完成回调
}
```
**返回值:**
返回一个响应式的编辑器实例。
### 文件上传配置
#### uploadHandler
文件上传处理器函数,用于处理图片、视频、音频的上传。
**类型签名:**
```typescript
type UploadHandler = (file: File) => Promise
```
**参数:**
- `file`: File 对象,包含要上传的文件
**返回值:**
- 成功:返回文件的访问 URL(字符串)
- 失败:返回 `null`
**配置方式:**
```javascript
// 为需要上传功能的扩展配置 uploadHandler
const configuredExtensions = allExtensions.map(ext => {
if (ext.name === 'image' || ext.name === 'video' || ext.name === 'audio') {
return ext.configure({
uploadHandler: async (file) => {
// 你的上传逻辑
const url = await uploadToServer(file)
return url // 返回 URL 或 null
}
})
}
return ext
})
```
**工作流程:**
1. 用户粘贴图片或拖拽文件到编辑器
2. 编辑器创建临时预览(Blob URL)
3. 立即显示预览,用户无需等待
4. 后台调用 `uploadHandler` 上传文件
5. 上传成功后,自动替换为真实 URL
6. 上传失败则删除临时预览
**示例实现:**
```javascript
const handleFileUpload = async (file) => {
try {
// 验证文件大小
const maxSize = 100 * 1024 * 1024 // 100MB
if (file.size > maxSize) {
console.error('文件过大')
return null
}
// 上传到服务器
const formData = new FormData()
formData.append('file', file)
const response = await fetch('/api/upload', {
method: 'POST',
body: formData,
})
const result = await response.json()
// 返回文件 URL
return result.success ? result.fileUrl : null
} catch (error) {
console.error('上传失败:', error)
return null
}
}
```
### RichTextEditor 组件
编辑器 UI 组件。
**Props:**
| 属性 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `editor` | Editor | - | 编辑器实例(必需) |
| `locale` | String | `'zh-CN'` | 语言设置(zh-CN/en) |
### allExtensions
包含所有内置扩展的数组,包括:
- 文本格式化(粗体、斜体、下划线、删除线等)
- 标题(H1-H6)
- 列表(有序、无序、任务列表)
- 代码(行内代码、代码块)
- 表格
- 图片、视频、音频
- 链接
- 引用块
- 分栏布局
- 折叠面板
- Slash Command
- 拖拽排序
- 搜索和替换
- 等等...
## 编辑器功能
### 文本格式化
- 粗体、斜体、下划线、删除线、上标、下标
- 标题(H1-H6)
- 文本颜色和背景色
- 字体大小
- 文本对齐
- 清除格式
- 格式刷
### 列表和引用
- 无序列表
- 有序列表
- 任务列表
- 引用块
- 缩进
### 代码
- 行内代码
- 代码块(支持 40+ 种语言语法高亮)
### 媒体内容
- 图片(支持粘贴、拖拽上传、调整大小)
- 视频(支持拖拽上传)
- 音频(支持拖拽上传)
- iframe
### 表格
- 创建表格
- 添加/删除行和列
- 合并/拆分单元格
- 调整列宽
- 表格拖拽排序
### 快捷功能
- Slash Command(输入 `/` 或 `、` 触发)
- 拖拽排序
- 搜索和替换
- 撤销/重做
- 字符统计
## 快捷键
| 快捷键 | 功能 |
|--------|------|
| `Ctrl/Cmd + B` | 粗体 |
| `Ctrl/Cmd + I` | 斜体 |
| `Ctrl/Cmd + U` | 下划线 |
| `Ctrl/Cmd + Shift + X` | 删除线 |
| `Ctrl/Cmd + E` | 行内代码 |
| `Ctrl/Cmd + Z` | 撤销 |
| `Ctrl/Cmd + Shift + Z` | 重做 |
| `Ctrl/Cmd + K` | 插入链接 |
| `Ctrl/Cmd + V` | 粘贴图片 |
| `/` 或 `、` | Slash Command |
| `Tab` | 增加缩进 |
| `Shift + Tab` | 减少缩进 |
## 主题系统
编辑器支持亮色和暗色两种主题模式,通过 CSS 变量控制。
### 主题变量
```css
/* 亮色主题 */
.theme-light .testfox-rich-text-editor {
--editor-primary-color: #9373ee;
--editor-text-color: rgba(0, 0, 0, 0.85);
--editor-background-color: #ffffff;
--editor-border-color: #f0f0f0;
/* ... 更多变量 */
}
/* 暗色主题 */
.theme-dark .testfox-rich-text-editor {
--editor-primary-color: #9373ee;
--editor-text-color: rgba(255, 255, 255, 0.85);
--editor-background-color: #1f1f1f;
--editor-border-color: #303030;
/* ... 更多变量 */
}
```
### 自定义主题
可以通过覆盖 CSS 变量来自定义主题:
```css
.my-editor {
--editor-primary-color: #your-color;
--editor-background-color: #your-bg;
}
```
## 开发
### 安装依赖
```bash
npm install
```
### 开发模式
```bash
npm run dev
```
### 构建
```bash
npm run build
```
### 类型检查
```bash
npm run typecheck
```
## 扩展开发
如需为编辑器添加新功能,可以创建自定义扩展。详细的扩展开发指南请参考:
- [扩展开发文档](./docs/extension.md)
- [Slash Command 指南](./docs/slash-command-guide.md)
- [Slash Command 示例](./docs/slash-command-examples.md)
## 文件上传功能
### 功能特性
编辑器支持以下文件上传方式:
- ✅ **图片粘贴上传**:按 `Ctrl+V` 粘贴图片,自动上传
- ✅ **图片拖拽上传**:拖拽图片文件到编辑器
- ✅ **视频拖拽上传**:拖拽视频文件到编辑器
- ✅ **音频拖拽上传**:拖拽音频文件到编辑器
- ✅ **即时预览**:上传前立即显示预览
- ✅ **自动替换**:上传成功后自动替换为真实 URL
- ✅ **失败处理**:上传失败自动删除预览
### 支持的文件类型
| 类型 | 扩展名 | 操作方式 |
|------|--------|---------|
| 图片 | jpg, jpeg, png, gif, webp, svg, bmp | 粘贴、拖拽 |
| 视频 | mp4, webm, ogg | 拖拽 |
| 音频 | mp3, wav, ogg | 拖拽 |
### 实现步骤
#### 1. 定义上传处理器
```javascript
const handleFileUpload = async (file) => {
try {
// 验证文件大小
const maxSize = 100 * 1024 * 1024 // 100MB
if (file.size > maxSize) {
console.error('文件大小不能超过100MB')
return null
}
// 创建 FormData
const formData = new FormData()
formData.append('file', file)
// 调用上传 API
const response = await fetch('/api/upload', {
method: 'POST',
body: formData,
})
const result = await response.json()
// 返回文件 URL(成功)或 null(失败)
if (result.success) {
return result.fileUrl
} else {
console.error('上传失败:', result.message)
return null
}
} catch (error) {
console.error('上传异常:', error)
return null
}
}
```
#### 2. 配置扩展
```javascript
import { allExtensions } from 'testfox-richtext-editor'
// 为需要上传功能的扩展配置 uploadHandler
const configuredExtensions = allExtensions.map(ext => {
if (ext.name === 'image' || ext.name === 'video' || ext.name === 'audio') {
return ext.configure({
uploadHandler: handleFileUpload
})
}
return ext
})
```
#### 3. 创建编辑器
```javascript
const editor = useEditor({
extensions: configuredExtensions, // 使用配置好的扩展
content: 'Hello World!
',
})
```
### 完整示例
```vue
```
### 上传流程
```
1. 用户粘贴图片或拖拽文件
↓
2. 创建临时预览(Blob URL)
↓
3. 立即显示预览(用户无需等待)
↓
4. 后台调用 uploadHandler 上传
↓
5. 上传成功
├─ 替换为真实 URL
└─ 释放临时 Blob URL
↓
6. 上传失败
├─ 删除临时预览
└─ 释放临时 Blob URL
```
### 注意事项
1. **返回值约定**
- 成功:必须返回文件的完整访问 URL(字符串)
- 失败:必须返回 `null`
2. **文件大小限制**
- 建议在前端验证文件大小
- 避免上传超大文件导致失败
3. **错误处理**
- 捕获所有异常并返回 `null`
- 提供友好的错误提示
4. **URL 格式**
- 返回的 URL 必须是可访问的完整 URL
- 例如:`https://example.com/uploads/image.jpg`
5. **异步处理**
- uploadHandler 必须是异步函数
- 使用 `async/await` 或返回 Promise
### 常见问题
**Q: 粘贴后图片消失了?**
A: 检查 uploadHandler 是否返回了正确的 URL。如果返回 `null`,图片会被删除。
**Q: 如何禁用上传功能?**
A: 不配置 uploadHandler 即可。图片会保持为 Blob URL(仅本地预览)。
**Q: 支持哪些文件类型?**
A: 图片(粘贴+拖拽)、视频(拖拽)、音频(拖拽)。可以通过扩展支持更多类型。
**Q: 如何自定义文件大小限制?**
A: 在 uploadHandler 中添加验证逻辑:
```javascript
const maxSize = 50 * 1024 * 1024 // 50MB
if (file.size > maxSize) {
alert('文件过大')
return null
}
```
**Q: 如何添加上传进度提示?**
A: 在 uploadHandler 中使用 UI 库显示进度:
```javascript
const handleFileUpload = async (file) => {
// 显示加载提示
showLoading('正在上传...')
try {
const url = await uploadToServer(file)
hideLoading()
return url
} catch (error) {
hideLoading()
showError('上传失败')
return null
}
}
```
## 浏览器兼容性
- Chrome/Edge: ✅ 完全支持
- Firefox: ✅ 完全支持
- Safari: ✅ 完全支持
- IE: ❌ 不支持
## 相关链接
- [Gitee 仓库](https://gitee.com/xzq_95/testfox-richtext-editor)
- [TipTap 官方文档](https://tiptap.dev/)
## 许可证
GPL-3.0
## 贡献
欢迎提交 Issue 和 Pull Request!