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 编辑器编辑及协同架构说明的更多相关文章

  1. 基于开源方案构建统一的文件在线预览与office协同编辑平台的架构与实现历程

    大家好,又见面了. 在构建业务系统的时候,经常会涉及到对附件的支持,继而又会引申出对附件在线预览.在线编辑.多人协同编辑等种种能力的诉求. 对于人力不是特别充裕.或者项目投入预期规划不是特别大的公司或 ...

  2. 教你如何完美保存Html编辑器编辑过的文本到Word中

    有时候在网页上面编辑了一段文字,有图片,想保存一份到word文档里面,但是复制粘贴以后发现格式并没有保存下来,今天就来教大家如何完整的保存Html编辑器编辑过的文字(可以包含图片,但是图片必须是绝对路 ...

  3. 使用所见即所得文本编辑器编辑文本存入数据库后通过ajax获取服务器json_encode的数据到前台,文本内容上边的html标签不解析

    使用所见即所得文本编辑器编辑文本存入数据库后通过ajax获取服务器json_encode的数据到前台,文本内容上边的html标签不解析 因为我在前台使用了jquery的text()方法,而不是html ...

  4. zendstudio中加入对tpl文件的支持,用HTML Editor编辑器编辑

    zendstudio中加入对tpl文件的支持,用HTML Editor编辑器编辑:ThinkPHP中默认使用的tpl在zendstudio中默认打开都是文本编辑器的,没有语法提示开发效率很低,直接设置 ...

  5. Unity3D研究院之使用Animation编辑器编辑动画(五十四)

     Unity提供了Animation编辑器,它可以为我们编辑物理动画.举个例子比如场景中有一个来回摇动的秋千,这个秋千在项目中完全只起到衬托作用,它不会与别的游戏对象有任何交互.如果这个秋千也用代码来 ...

  6. Unity3D研究院之使用Animation编辑器编辑动画

     Unity提供了Animation编辑器,它可以为我们编辑物理动画.举个例子比如场景中有一个来回摇动的秋千,这个秋千在项目中完全只起到衬托作用,它不会与别的游戏对象有任何交互.如果这个秋千也用代码来 ...

  7. 公式编辑器编辑倒L符号的方法

    数学公式全都是由数字字母和一些符号组成的,一些常用的字母符号我们使用起来也很熟练,但是在数学中也有一些符号是比较少用的,比如倒着的L,这个符号在一些函数中出现过,表示某一类的函数.在word公式编辑器 ...

  8. 用公式编辑器编辑n元乘积的方法

    在数学中经常会出现很多个元素进行求和或者是乘积的情况,但是在整个数学过程中,不可能将所有的元素都写出来,这样很费时费力同时过程也很赘余,不能很好地理解其中的过程,因此数学中对于这一类的多元相加或者相乘 ...

  9. 【开源】SoDiaoEditor 可能是目前最好用的开源电子病历编辑器(B/S架构)

    此刻我的内心是忐忑的,这个标题给了我很大的压力,虽然很久以前我就在github上搜索一圈了,也没发现有其他更好的开源电子病历编辑器,如各位亲发现有更好的,烦请知会我一声. 该编辑器其实已经憋了很久了, ...

随机推荐

  1. 手写DAO框架(六)-框架使用示例

    一.引入pom <dependency> <groupId>me.lovegao</groupId> <artifactId>gdao</arti ...

  2. 使用sequelize对数据库进行增删改查

    由于本人对于命令比较执着,所以基本都是在命令下操作的,喜欢使用命令的可以使用Cmder,需要安装.配置的可以参考这篇文章: https://www.cnblogs.com/ziyoublog/p/10 ...

  3. Winmanager,NERDTree和MiniBufExplorer

    NERDTree树形浏览文件 MiniBufExplorer多文件同时编辑 Winmanager将NERDTree和MiniBufExplorer界面整合 下载 http://www.vim.org/ ...

  4. 如何在SAP UI5应用里添加使用摄像头拍照的功能

    昨天Jerry的文章 纯JavaScript实现的调用设备摄像头并拍照的功能 介绍了纯JavaScript借助WebRTC API来开发支持调用设备的摄像头拍照的web应用.而我同事遇到的实际情况是, ...

  5. 在线生成二维码API接口

    1.http://s.jiathis.com/qrcode.php?url=kk 2.http://qr.liantu.com/api.php?text=kk 3.http://api.k780.co ...

  6. 一些 SQLite技巧

    SQLite自增ID自段 使用方法为 INTEGER PRIMARY KEY AUTOINCREMENT 如: CREATE   TABLE  21andy ( id  INTEGER   PRIMA ...

  7. MySQL DataType--当整数列遇到小数

    初始化数据: ## 创建测试表 CREATE TABLE `tb002` ( `c1` ) NOT NULL AUTO_INCREMENT, `c2` ) DEFAULT NULL, `c3` ) D ...

  8. python+requests+excel+unittest+ddt接口自动化数据驱动并生成html报告(已弃用)

    前言 1.环境准备: python3.6 requests xlrd openpyxl HTMLTestRunner_api 2.目前实现的功能: 封装requests请求方法 在excel填写接口请 ...

  9. altium designer(AD13)隐藏敷铜的方法

    覆铜,就是将PCB上闲置的空间作为基准面,然后用固体铜填充,这些铜区又称为灌铜.敷铜的意义在于,减小地线阻抗,提高抗干扰能力;降低压降,提高电源效率;还有,与地线相连,减小环路面积. 如果拿到别人的P ...

  10. 2013.4.19 - KDD第一天

    其实昨天KDD就开始了,不过今天算是我跟KDD的第一天.   昨天夜里就短信跟中秋聊了一会儿,然后中秋说他一天都在弄数据库,连不上怒了.然后我跟他说明天我来.于是今天就在图书馆弄KDD,数据是用数据库 ...