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. 仿EXCEL插件,智表ZCELL产品V1.6 版本发布,增加自定义事件功能

    详细请移步 智表(ZCELL)官网www.zcell.net 更新说明  这次更新主要应用户要求,主要解决了单元格值变化时事件的支持,并新增了按单元格名操作的相关API,欢迎大家体验使用. 本次版本更 ...

  2. Mysql 一些命令记录

    查看数据库当前的状态 show processlist; 查询表索引的基数 show index from LoadingPlan; 重新统计表格的索引基数 analyze table Loading ...

  3. hadoop完整集群遇到问题汇总

    1> 设置静态ip: 由于虚拟机在重启之后ip会再次重置,为了后续的麻烦我吗可以设置成静态ip的方式: cd   /etc/sysconfig/network-scripts/ 修改对比如下: ...

  4. Java必备技能:clone浅克隆与深克隆

    介绍 一直以来只知道Java有clone方法,该方法属于Object的,对于什么是浅克隆与深克隆就比较模糊了,现在就来补充学习一下. 概念 浅拷贝(浅克隆)复制出来的对象的所有变量都含有与原来的对象相 ...

  5. Oracle内存管理方式由amm切换为asmm

    (一)ASMM和AMM 在Oracle 10g时,Orale推出ASMM(Automatic Shared Memory Managed),实现了SGA和PGA各自内部的自调节.在Oracle 11g ...

  6. ansible之基础篇(二)

    软件相关模块 yum rpm和yum的区别 rpm:redhat package manager yum 可以解决依赖关系 yum 源配置 使用yum下载时需要先下载epel [epel] name= ...

  7. 时间模块time和datetime的使用

    日期和时间 一 time模块 import time 时间的表示形式: 时间戳 时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现 ...

  8. LB_Keogh

    LB_Keogh LB_Keogh 是Keogh设计的下界函数,相比于LB_Kim以及LB_Yi具有更好的效果. 公式 注释: 上面公式中的 u 和 l 指的是上下包络线 对公式解释一下,其实就是,首 ...

  9. linux 下安装node 并使用nginx做域名绑定

    #1 ,home目录下 下载nodejs安装包,解压 并修改文件夹名称 wget https://nodejs.org/dist/v8.11.4/node-v8.11.4-linux-x64.tar. ...

  10. (一)WCF基础

    我们近期在做项目的时候用到了WCF,之前已经看了部分视频,对于WCF有了一定的了解,但仅限于能够根据搭建好的框架使用WCF,还不了解.所以就进行了研究,这样既有实践也能增加理论,二者结合,使用起来更胜 ...