Textbus 内核模块
Textbus 是一套用于构建富交互的富文本编辑框架。和大多数富文本编辑器不同的是,Textbus 以组件为核心,格式为辅助,并大幅简化了富文本编辑器开发中常见
API,且提供了更高的抽象层,使 Textbus 不仅易于上手,同时还能驱动复杂的富文本应用。
本项目为 Textbus 核心实现,提供了跨平台富文本编辑器的基础架构,包括组件、格式、内容及数据驱动架构设计等功能。
只有 core 模块还不足以创建一个富文本编辑器,还需要搭配一个视图层的实现。目前 Textbus
官方已实现了 @textbus/browser 模块用于在 pc
端浏览器创建编辑器基础能力。随着后面的开发,还会提供小程序和移动端浏览器的视图层。
如果你需要一个开箱即用的编辑器,请参考官方文档。
安装
npm install @textbus/core
搭建视图层实现
启动 Textbus 内核需要从 Starter 类开始,Starter 是一个IoC 容器,继承自 @tanbo/di
中的 ReflectiveInjector
类。
import { Starter } from '@textbus/core'
const config: TextbusConfig = {
}
const core = new Starter(config)
配置项
export interface Module {
components?: Component[]
formatters?: Formatter[]
providers?: Provider[]
plugins?: Array<() => Plugin>
setup?(starter: Starter): Promise<(() => void) | void> | (() => void) | void
}
export interface TextbusConfig extends Module {
imports?: Module[]
useContentEditable?: boolean
zenCoding?: boolean
historyStackSize?: number
readonly?: boolean
}
TextbusConfg 接口所有选项都是可选的,但由于 core 模块并不包含视图实现,所以要正常启动,还需要实现两个视图层的接口。
原生选区桥接
原生选区桥接接口如下:
export abstract class NativeSelectionBridge {
abstract connect(connector: NativeSelectionConnector): void
abstract disConnect(): void
abstract restore(range: AbstractSelection | null, changeFromLocal: boolean): void
abstract getRect(position: SelectionPosition): RangeViewPosition | null
}
实现
import { NativeSelectionBridge } from '@textbus/core'
export class YourSelectionBridge extends NativeSelectionBridge {
}
原生渲染能力桥接
接口如下:
**
* 原生渲染器抽象类,由具体平台提供具体实现
*/
export abstract class NativeRenderer {
abstract createElement(name: string): NativeNode
abstract createTextNode(textContent: string): NativeNode
abstract appendChild(parent: NativeNode, newChild: NativeNode): void
abstract addClass(target: NativeNode, name: string): void
abstract removeClass(target: NativeNode, name: string): void
abstract setAttribute(target: NativeNode, key: string, value: string): void
abstract removeAttribute(target: NativeNode, key: string): void
abstract setStyle(target: NativeNode, key: string, value: any): void
abstract removeStyle(target: NativeNode, key: string): void
abstract replace(newChild: NativeNode, oldChild: NativeNode): void
abstract remove(node: NativeNode): void
abstract insertBefore(newNode: NativeNode, ref: NativeNode): void
abstract getChildByIndex(parent: NativeNode, index: number): NativeNode | null
abstract listen<T = any>(node: NativeNode, type: string, callback: (ev: T) => any): void
abstract unListen(node: NativeNode, type: string, callback: (ev: any) => any): void
abstract copy(): void
}
实现
import { NativeRenderer } from '@textbus/core'
export class YourRenderer extends NativeRenderer {
}
启动
初始化
import { rootComponent } from './root.component'
const host = document.getElementById('editor')
core.mount(rootComponent, host).then(() => {
console.log('编辑器创建成功!')
})
其中,rootComponent
的实现请参考官方文档。
销毁
core.destroy()
Textbus 其它模块
官方文档
更多文档请参考:中文文档