xnote
1.0.0
Xnote 是一個無頭、高性能、與框架無關的富文本編輯器,支持多人在線協作。提供了豐富的現代文檔編輯功能。
Xnote 底層依賴於開源富文本框架Textbus 和前端視圖Viewfly。因此,你可以在此基礎上繼續擴展自己的功能。
在線演示
npm install @textbus/xnote katex
import 'katex/dist/katex.min.css'
import { Editor } from '@textbus/xnote'
const editor = new Editor ( )
editor . mount ( document . getElementById ( 'editor' ) ) . then ( ( ) => {
console . log ( '编辑器准备完成。' )
} ) 要實現文件上傳需實現FileUploader 接口
import { FileUploader } from '@textbus/xnote'
class YourUploader extends FileUploader {
uploadFile ( type : string ) : string | Promise < string > {
if ( type === 'image' ) {
return 'imageUrl'
}
if ( type === 'video' ) {
return 'videoUrl'
}
}
}
const editor = new Editor ( {
providers : [ {
provide : FileUploader ,
useFactory ( ) {
return new YourFileUplader ( )
}
} ]
} ) import { Commander } from '@textbus/core'
import { Injectable } from '@viewfly/core'
import { ImageComponent } from '@textbus/xnote'
@ Injectable ( )
class YourCommander extends Commander {
paste ( slot : Slot , text : string ) {
slot . sliceContent ( ) . forEach ( content => {
if ( content instanceof ImageComponent ) {
const base64 = content . state . url
// base64 转 url,请自行实现
content . state . url = 'https://xxx.com/xxx.jpg'
}
} )
// 待图片转换完成后,可调用超类的 paste 方法
super . paste ( slot , text )
return true
}
}
const editor = new Editor ( {
providers : [ {
provide : Commander ,
useClass : YourCommander
} ]
} ) const html = editor . getHTML ( ) const editor = new Editor ( {
content : '<div>HTML 内容</div>'
} ) editor . setContent ( '<p>你好!</p>' ) 在文檔中@ 人功能需實現以下接口,以對接用戶信息
export abstract class Organization {
abstract getMembers ( name ?: string ) : Promise < Member [ ] >
abstract atMember ( member : Member ) : void
}然後在編輯器初始化時傳入你的實現
const editor = new Editor ( {
providers : [ {
provide : Organization ,
useValue : new YourOrganization ( )
} ]
} ) Textbus 天然支持協作,只需要在編輯器配置項中添加協作配置信息即可,具體配置你可以參考https://textbus.io/guide/collab/
const editor = new Editor ( {
collaborateConfig : {
userinfo : user , // 用户信息
createConnector ( yDoc ) : SyncConnector {
// 返回连接器
return new YWebsocketConnector ( 'wss://example.com' , 'docName' , yDoc )
}
}
} )