概览
创建编辑器
Slate createEditor
createEditor 是 Slate 提供的创建编辑器对象的函数,编辑器对象的重要性相当于一个系统的核心,后面所有的插件注册/声明部分也都必须返回该对象,插件在运行过程中执行完当前插件的逻辑,最终也需要流转到该对象提供的核心函数上。
核心能力
- 数据操作:
- 插入节点/文本(insertNode、insertText)
- 删除(delete)
- 文本数据操作(apply)
- 插入或替换文本、节点(insertFragment)
- 装饰文本(addMark)
- 数据变化:onChange
- 检查元素类型:空元素(isVoid)、行内元素(isInline)
- 属性:选区(selection)、动作/操作(operations)、子数据(children)
源码预览
使用
1 | import { createEditor } from 'slate'; |
Slate-angular withAngular
- 以 withXxx 命名的一般为插件
- withAngular 本身也是一个插件
withAngular 是 Slate-angular 内置插件,介于框架的限制,该插件大致上做了两件事:
- 对于 Slate 部分函数进行了重写(比如 onChange)
- 扩展额外的一些能力
核心能力
- 重写数据操作函数:插入、删除、复制/粘贴板(insertFragment、setFragment)
- 数据变化通知(onChange)
- 基础 DOM 事件:onkeydown、onclick
- 检查元素类型(isBlockCard)
- 错误处理(onError)
源码预览
使用
1 | import { createEditor } from 'slate'; |
Theia withTheia
基于 Slate-angular 进行扩展和复写 editor 对象,提供了更多的特性,同时基于 Worktile 和 PingCode 业务封装了一些更复杂的逻辑。
核心能力
- 多插件自动组合注册(combinePlugins)
- 支持插件的渲染自定义组件(renderElement)
- 更多的事件:globalMousedown
源码预览
构建/声明插件
上面 withTheia 和 withAngular 已经展示了一个插件的声明流程,那么插件需要到底做了什么事:
- 重写和拦截编辑器对象(editor)提供的能力
- 返回编辑器对象,供下一个插件使用继续流转
示例
组合/装载插件
方式:js 高阶函数~
如: withInlines(withHistory(withAngular(createEditor())))
theia 中组合插件
示例
1 | this.editor = withTheia( |