PIT 编辑器编辑及协同架构说明
pit 项目使用 quill-delta 作为数据层存储文档内容数据,quill-delta 是一个基于 OT 算法的库,用 quill-delta 作为数据层,不仅能很好的保存文档数据,还可以方便的实现文档的协同编辑,即多个人同时编辑同一份文档(需要服务器支持)。
quill-delta 数据格式不仅能很好的描述完整的文档内容,还可以很方便的描述文档的修改过程,所以 pit 在进行架构设计的时候,并不仅仅考虑单机编辑的情况,同时还考虑到了协同编辑的情况,以方便以后在需要的时候实现协同编辑功能。

上图即为 pit 编辑器单机使用时的系统架构。基本流程是用户通过各类 action 修改数据 model,比如用户要在某个位置插入一个字符“A”,就会直接通过 insert 接口在 model 中插入 “A” 这个字符,然后编辑器发现某个 model 更新后,会调用其 layout 方法对内容进行重新排版,然后用 render 方法把排版后的内容绘制到 view 上,让用户可以看到自己刚刚插入的内容。
同时 model 会用 quill-delta 的 diff 算法计算出文档内容修改前后的数据差异,并通过 delta 的方式来表示这种差异,即为 Delta Diff。
Delta Diff 代表了用户刚刚对文档进行的修改。比如原文档内容为

用户在“好”和“世”之间插入一个字符“A”,则产生的 Delta Diff 为

即光标从 0 位置向后移动两个位置,然后插入字符“A”。
Delta Diff 代表了用户此次对文档内容的操作,通过 quill-delta 的 invert 接口即可产生一个代表相反操作的 Invert Delta Diff,如上面的 Delta Diff 在 invert 操作之后即可得到

即光标从 0 位置向后移动两个位置,然后删除一个字符。
将 Delta Diff 和 Invert Delta Diff 作为一组一起压入 History Stack 并设置一个指向当前操作的游标,即可实现文档编辑器上常见的 redo、undo 功能。

进行协同编辑的场景和单机编辑的场景基本类似,区别仅在于用户修改文档产生了 Delta Diff 之后,将这个 Delta Diff 通过服务器中转发给其他一起进行协同编辑的客户端(上图中的 User B),这个用户就可以通过收到的 Delta Diff 来完成和 User A 完全相同的对 Model 的操作,并渲染到 View 上,这样就基本实现了协同编辑。User B 的编辑器在收到 Delta Diff 后,先判断收到的 Delta Diff 会对文档中的那些段落产生影响,然后获取这些段落的 Delta 数据,并将 Delta Diff 合并到 Delta 中,这样就得到了代表这些段落新状态的 Delta,这时再通过 readFromDelta 方法即可由新的 Delta 产生新的段落 Model,然后通知编辑器重新排版并渲染到用户界面上。
具体实现可参考:https://github.com/SilentTiger/pit/releases/tag/draft-03
PIT 编辑器编辑及协同架构说明的更多相关文章
- 基于开源方案构建统一的文件在线预览与office协同编辑平台的架构与实现历程
大家好,又见面了. 在构建业务系统的时候,经常会涉及到对附件的支持,继而又会引申出对附件在线预览.在线编辑.多人协同编辑等种种能力的诉求. 对于人力不是特别充裕.或者项目投入预期规划不是特别大的公司或 ...
- 教你如何完美保存Html编辑器编辑过的文本到Word中
有时候在网页上面编辑了一段文字,有图片,想保存一份到word文档里面,但是复制粘贴以后发现格式并没有保存下来,今天就来教大家如何完整的保存Html编辑器编辑过的文字(可以包含图片,但是图片必须是绝对路 ...
- 使用所见即所得文本编辑器编辑文本存入数据库后通过ajax获取服务器json_encode的数据到前台,文本内容上边的html标签不解析
使用所见即所得文本编辑器编辑文本存入数据库后通过ajax获取服务器json_encode的数据到前台,文本内容上边的html标签不解析 因为我在前台使用了jquery的text()方法,而不是html ...
- zendstudio中加入对tpl文件的支持,用HTML Editor编辑器编辑
zendstudio中加入对tpl文件的支持,用HTML Editor编辑器编辑:ThinkPHP中默认使用的tpl在zendstudio中默认打开都是文本编辑器的,没有语法提示开发效率很低,直接设置 ...
- Unity3D研究院之使用Animation编辑器编辑动画(五十四)
Unity提供了Animation编辑器,它可以为我们编辑物理动画.举个例子比如场景中有一个来回摇动的秋千,这个秋千在项目中完全只起到衬托作用,它不会与别的游戏对象有任何交互.如果这个秋千也用代码来 ...
- Unity3D研究院之使用Animation编辑器编辑动画
Unity提供了Animation编辑器,它可以为我们编辑物理动画.举个例子比如场景中有一个来回摇动的秋千,这个秋千在项目中完全只起到衬托作用,它不会与别的游戏对象有任何交互.如果这个秋千也用代码来 ...
- 公式编辑器编辑倒L符号的方法
数学公式全都是由数字字母和一些符号组成的,一些常用的字母符号我们使用起来也很熟练,但是在数学中也有一些符号是比较少用的,比如倒着的L,这个符号在一些函数中出现过,表示某一类的函数.在word公式编辑器 ...
- 用公式编辑器编辑n元乘积的方法
在数学中经常会出现很多个元素进行求和或者是乘积的情况,但是在整个数学过程中,不可能将所有的元素都写出来,这样很费时费力同时过程也很赘余,不能很好地理解其中的过程,因此数学中对于这一类的多元相加或者相乘 ...
- 【开源】SoDiaoEditor 可能是目前最好用的开源电子病历编辑器(B/S架构)
此刻我的内心是忐忑的,这个标题给了我很大的压力,虽然很久以前我就在github上搜索一圈了,也没发现有其他更好的开源电子病历编辑器,如各位亲发现有更好的,烦请知会我一声. 该编辑器其实已经憋了很久了, ...
随机推荐
- springboot+security整合(2)自定义校验
说明 springboot 版本 2.0.3源码地址:点击跳转 系列 springboot+security 整合(1) springboot+security 整合(2) springboot+se ...
- mtd交叉编译mkfs命令
下载 mtd:ftp://ftp.infradead.org/pub/mtd-utils/ zlib:http://www.zlib.net/ lzo:http://bouchez.info/lzo. ...
- python+requests+excel+unittest+ddt接口自动化数据驱动并生成html报告(已弃用)
前言 1.环境准备: python3.6 requests xlrd openpyxl HTMLTestRunner_api 2.目前实现的功能: 封装requests请求方法 在excel填写接口请 ...
- 如何顺利完成Kubernetes源码编译?
为什么要编译源码 ? Kubernetes是一个非常棒的容器集群管理平台.通常情况下,我们并不需要修改K8S代码即可直接使用.但如果,我们在环境中发现了某个问题/缺陷,或按照特定业务需求需要修改K8S ...
- WebSocket使用中Stomp Client连接报ERROR CODE 200的解决办法
[转] https://www.cnblogs.com/chrischeng/p/10237523.html 最近在做一个WebSocket项目,后台使用了Stomp协议的WebSocketConfi ...
- 安装 uwsgi报错解决
背景: 安装 uwsgi时报错如下,查阅相关资料说是 python-devel的问题,于是安装之后python-devel后问题解决 报错如下: (venv) [xxxxxxx]# pip insta ...
- eclipse更改jdk版本(1.6》1.7 以此类推)
电脑装了两个版本的JDK,在开发项目的时候默认使用的是高版本的,但是公司又要求用低版本的JDK来编译,肿么办???么事,小编这就来给你支招! eclipse 安装两个版本的JDK 1 打开eclips ...
- 2019CCPC网络赛 HD6707——杜教筛
题意 求 $f(n,a,b)=\sum_{i=1}^n \sum_{j=1}^i gcd(i^a-j^a,i^b-j^b)[gcd(i,j)=1]\%(10^9+7)$,$1 \le n,a,b \l ...
- Node.js创建服务及实现静态资源托管/接口请求
1.环境 采用12.13.x版本 2.创建server.js 文件内容如下: let http = require("http"); let fs = require(" ...
- 历史相关API
一.history对象 ①history.back()移动到上一个访问页面,等同于浏览器的后退键. ②history.forward()动到下一个访问页面,等同于浏览器的前进键. ③history.g ...