首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

初探富文本之OT协同实例

在富文本领域,最经典的Operation有quilldelta模型,通过retain、insert、delete三个操作完成整篇文档的描述与操作,还有slate的JSON模型,通过insert_text...同样是以quill与slate两款开源编辑器例,在quill中已经实现了对于其数据结构delta的所有Transformation,可以直接调用官方的quill-delta包即可;对于slate而言,...实际上有比较多的参考之后,接入OT协同就主要是理解并且实现的问题了,这样就有一个大体的实现方向了,不是毫无头绪不知道应该从哪里开始做协同。...json0也是一种可逆类型,也就是说所有的操作都有一个逆操作,可以撤销原来的操作。但其并不完美,其不能实现对象移动,设置NULL,在列表中高效地插入多个项目。...quill的数据结构并不是JSON而是DeltaDelta是通过retain、insert、delete三个操作完成整篇文档的描述与操作,那么这样我们就不能使用json0来对数据结构进行描述了,我们需要使用新的

64320

初探富文本之CRDT协同实例

描述 接入协同框架实际上并不是一件简单的事情,当然相对于接入OT协同而言接入CRDT协同已经是比较简单的了,因为我们只需要聚焦于数据结构的使用就好,不需要对变换有过多的关注。...上边这个数据转换听起来是不是有点耳熟,在前边初探富文本之OT协同实例中,我们介绍了json0,我们也提到了一个可行的操作,我们让变换Transformation这部分让json0去做,我们需要关注的是从我们自己定义的数据结构转换到...实际上通过框架提供的例子后,接入CRDT协同就主要是理解并且实现的问题了,这样就有一个大体的实现方向了,不是毫无头绪不知道应该从哪里开始做协同。...NAT可以通过多种方式实现,例如静态NAT、动态NAT和端口地址转换PAT等,静态NAT将一个私有IP地址映射到一个公共IP地址,动态NAT则动态地每个私有地址分配一个公共地址,PAT是一种特殊的动态...quill的数据结构并不是JSON而是DeltaDelta是通过retain、insert、delete三个操作完成整篇文档的描述与操作,我们试想一下描述一段字符串的操作需要什么,是不是通过这三种操作就能够完全覆盖了

1.3K20
您找到你想要的搜索结果了吗?
是的
没有找到

初探富文本之文档diff算法

我们首先可以思考一个问题,如果我们描述一段普通文本的话,那么大概直接输入就可以了,比如这篇文章本身底层数据结构就是纯文本,内容格式实际上是由编译器通过词法和语法编译出来的,可以将其理解序列化和反序列化...对于我们今天要聊的Quill来说,其数据结构描述是quill-delta,这个数据结构的设计非常棒,并且quill-delta同样也可以是富文本OT协同算法的实现,不过我们在这里不涉及协同的内容,而我们实际上要关注的...\\n" }, ], }; 看到这个数据结构我们也许会想这不就是一个普通的JSON嘛,那么我们直接进行JSON的diff是不是就可以了,毕竟现在有很多现成的JSON算法可以用,这个方法对于纯insert...,那么针对粒度这个问题上不如我们换个角度思考,我们现在的是要处理富文本,富文本就是带属性的文本,那么我们是不是就可以采用diff文本的算法,然后针对属性值进行额外的处理即可,这样就可以将粒度处理得很细...其实解决这个问题的方法很简单,在CSS中有一个名为pointer-events的属性,当将其值设置none时元素永远不会成为鼠标事件的目标,这样我们就可以解决方案一造成的问题,由此实现比较我们最基本的虚拟图层样式与事件处理

9910

Quill 富文本编辑器简介

什么是 Quill Quill 是一个免费的,开源的 WYSIWYG (What You See Is What You Get)编辑器,专为现代网络打造。...由于 DOM 是一种树形结构,由不同的节点组成,文本是由行、单词和字符组成,这导致了它们之间存在差异。 目前没有以字符度量单位的 DOM API。...其事件 API 还会以直观的 JSON 格式报告更改。而无需解析 HTML 或者比较 DOM 树差异。 自定义内容和格式 过去评估富文本编辑器就像比较所需格式的清单一样简单。...设置自适应高度时,需要修复滚动跳跃的问题,并且由另一个父容器负责滚动。...var Clipboard = Quill.import('modules/clipboard'); var Delta = Quill.import('delta'); class PlainClipboard

3.6K20

基于OT与CRDT协同算法的文档划词评论能力实现

试想一个场景,此时我们对文档发布了一个版本A,而在后台又将文档编辑了一部分此时内容B版本,用户此时在A版本上评论了内容,然而此时我们的文档已经是B版本了,如何将用户评论的内容同步到B版本,以便于我们发布...const Delta = Quill.import("delta"); // 线上状态 const online = new Delta().insert("yyy"); // 草稿状态 const...首先我们需要定义yjs的数据结构即Y.Doc,然后为了方便我们直接采用indexeddb作为存储不是使用websocket来与后端yjs通信,由此我们可以直接在本地进行测试,在yjs中内置了getText...的富文本数据结构表达,实际上在使用上是等同于quill-delta的数据结构,并且使用yjs提供的y-quill将数据结构与编辑器绑定。...紧接着我们同样初始化一个评论列表,这就是我们持久化存储的内容,与之前不同的是此时我们存储的是CRDT的相对位置,也就是说我们存储的是yjs的RelativePosition,这个位置是相对于文档的位置不是绝对的

14510

初探富文本之编辑器引擎

数据结构是类似于DOM的嵌套JSON结构,比较直观容易理解。 不足 依旧处于Beta阶段,可能会有重大API变化,例如0.50版本就是全新重构的。...在quill的文档中有对于框架的设计原则上的描述: API驱动设计,quill所有的功能都是通过API来实现的并且可以直观的通过API来获得数据的变化,以文本中心的基础上构建的API,不需要解析HTML...自定义内容和格式,quill公开了自己的文档模型,这是对DOM的强大抽象,允许扩展和定制,由此数据结构的主角变成了Blots、Parchment、Delta。...不足 Delta数据结构是扁平的,也就是一维的数据结构,这样在实现例如表格的功能时就比较麻烦。 quill 2.0已经开发了很久了,但是还没有正式发布,目前的1.3.7版本已经有很多年没有更新了。...quill官方示例https://quilljs.com/standalone/full/。 quillDelta设计与实现https://quilljs.com/docs/delta/。

1.8K51

深入在线文档系统的 MarkDownWordPDF 导出能力设计

那么本文就以Quill富文本编辑器引擎基础,探讨文档导出MarkDown、Word、PDF插件化设计实现。...delta-set.ts: 数据转换格式转换,从扁平数据结构转换到嵌套结构。 delta-to-md.ts: 将文档数据结构转换为Markdown,输出纯文本结构。...前边我们已经提到了我们的块是比较复杂的,并且实际上是会存在很多嵌套结构,对应到HTML就类似于表格中嵌套了代码块的格式,quill-delta的数据结构是扁平化的,所以我们也需要将其转换为方便处理的嵌套结构...: boolean; }; 由于存在需要HTML辅助的节点,而我们迭代的方式非常类似于递归拼接字符串的方式,所以我们需要穿插一个标识符,标识此时需要解析成HTML不是MD标记,例如此时我们匹配到行节点是居中的...在观察到很多库实际上很多年没有过更新了,并且在这里我们更希望直接输出docx,不是需要HTML中转,毕竟在线文档的交付对于格式还是需要有比较高的控制能力的,综上最后选择使用docx来生成word文件。

12610

【玩转腾讯云】现代富文本编辑器Quill的模块化机制

最终的结果就是在编辑器主体上方渲染了一个工具栏,可以通过工具栏按钮/下拉框给编辑器内的元素设置格式,或者在编辑器中插入新元素。...其中: Clipboard模块用于处理复制/粘贴事件、HTML元素节点的匹配以及HTMLDelta的转换。...Keyboard模块用于配置键盘事件,实现快捷键提供便利。...比如:在EditorX富文本组件中有一个统计编辑器当前字数的功能,该功能就是通过自定义模块来实现的,下面我们将一步一步介绍如何将改该功能封装成独立的Counter模块。...(后面会详细介绍其中的原理) 如果是snow主题,此时将会看到编辑器上方出现工具栏: 如果是bubble主题,那么当选中一段文本时,会出现工具栏浮框: 接下来我们以工具栏模块例,详细介绍Quill

2.1K00

Canvas图形编辑器-数据结构与History(undoredo)

undo/redo) 描述 对于编辑器而言,History也就是undo和redo是必不可少的能力,实现历史记录的方法通常有两种: 存储全量快照,也就是说我我们每进行一个操作,都需要将全量的数据通常也就是JSON...数据结构 我特别推荐大家去看一下 quill-delta 的数据结构设计,这个数据结构的设计非常棒,其可以用来描述一篇富文本,同时也可以用来构建change对富文本做完整的增删改操作,对于数据的compose...、invert、diff等操作也一应俱全,而且quill-delta也可以是富文本OT协同算法的实现,这其中的设计还是非常牛逼的。...其实我之前也没有设计过数据结构,更不用谈设计Op去实现历史记录功能了,所以我在设计数据结构的时候是抓耳挠腮、寝食难安,想设计出 quill-delta 这种级别的数据描述几乎是不可能了,所以只能依照我的想法来简单地设计...这其中的DeltaSet可以理解当前的所有Delta数据,类型签名类似于Record,是扁平的结构,便于数据查找。

6910

Vue富文本_ueditor编辑器

重点在于它轻量,如果需要的功能不是很复杂,用它还是不错的。 优势:轻量简介,最重要的是开源且中文文档齐全。 缺点:更新不及时,没有强大的开发团队支撑。...Kindeditor 优势:文档齐全,中文,阅读方便。 缺点:图片上传存在问题,不能控制图片尺寸,上传历史过多,会全部加载,导致浏览器卡顿。...vue-quill-editor 虽然说只支持IE10+,据说大企业用的比较多,不限制框架,但是需要定制,理念很先进。...= this.editor.txt.getJSON() // 获取 JSON 格式的内容 var jsonStr = JSON.stringify(json) console.log(json) console.log...false this.editor.create() } } 如下图: 输入文字时,浏览器打印的结果: 可以看到,内容输出的是

2.9K20

13个顶级免费所见即所得文本编辑器工具

[https://www.tiny.cloud/features/] Quill Quill是一个开放源代码编辑器,因此可以将其用于所有类型的商业或非商业网站。...它有很多功能,如添加链接,图像,视频或添加代码片段的内容…关于Quill,我最喜欢的一点是它的简单设置和显示,可以在多设备屏幕上的所有现代的、响应迅速的web浏览器上显示,还有使用它的常见问题的详细说明...[https://summernote.org/] Editor.js Editor.js是一个开源的块状编辑器,它不会像普通的编辑器那样使用标签HTML,将内容以JSON的形式输出,使其更容易管理。...有很多工具我很喜欢它是自动转换不合适的HTML标签率,自动分析内容时从Word, PDF,显示内容HTML… [http://wysihtml.com/] ContentTools ContentTools...[https://getcontenttools.com/demo] Froala Froala是一个编辑器,可以很容易地网站设置,并允许你根据预期用途打开广泛的功能。

5.6K00

基于 Vue 的移动端富文本编辑器 vue-quill-editor 实战

优秀的富文本编辑器有很多,比如:UEditor,wangEditor 等,但并不是每个都能在移动端有很好的表现。 我们暂且不讨论移动端是否真的需要富文本,既然有这需求,就把它实现出来。...通过各种资料搜集,确定了几个备选的:UEditor,vue-quill-editor,wangEditor,vue-html5-editor ,tinymce。...遗憾的发现 wangEditor 在移动端的表现有些让人失望,比如我要设置一个 H1 标题,时灵时不灵的,有时能设置成功,有时不能,大多数时候都不成功,不知道是不是我操作的问题。...接下来尝试 vue-html5-editor ,看介绍还挺好的。按照教程一顿操作后,编辑器并没有在页面上如期至… 排查了好多次都没有找到问题在哪里,算了吧… 还好还有其他选择。...> 完整代码 上图效果的代码如下: <div class="title" v-html="title

4.1K30

Python廖雪峰实战web开发(Day5-编写web框架)

path = getattr(fn,'__route__',None)             if path and method: #这里要查询path以及method是否存在不是等待...u'%s分钟前' % (delta // 60)     if delta < 86400:         return u'%s小时前' % (delta // 3600)     if delta...一个middleware可以改变URL的输入、输出,甚至可以决定不继续处理直接返回。middleware的用处就在于把通用的功能从每个URL处理函数中拿出来,集中放到一个地方。...有官方文档可以知道,当创建web.appliction的时候,可以设置middleware参数,middleware的设置是通过创建一些middleware factory(协程函数)。...__dict__).encode('utf-8')) #https://docs.python.org/2/library/json.html#basic-usage                 return

1K00

分享 42 个面向前端开发的 JS 库和框架

它是一个小型、免费、开源的库,网站开发提供了许多有用的功能,例如 AJAX、轻松操作 DOM(CSS、HTML)、处理事件、动画效果等。...它允许您您的网站轻松构建日期选择器组件,而无需任何额外的使用或任何额外的库。 我喜欢这个库中的一些功能是深色和浅色主题。您可以设置允许用户选择的时间间隔,按地区设置日期等。...它支持多种格式的打印,例如 PDF、HTML(例如表单)、图像、JSON 等。...我喜欢 Quill 的地方在于,它可以轻松地在所有现代和响应式 Web 浏览器的多个设备屏幕上进行设置和显示,并提供有关使用时常见问题的详细教程。...它的主要目标是以 JSON 形式设置验证并使它们可在浏览器和服务器之间共享。 它为我们提供了很多验证方法,例如日期、电子邮件、格式、对象类型检查等。

6.7K31
领券