问题标签 [operational-transform]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
real-time - 为什么 Google Docs 操作转换会在删除方面出错?
今天尝试了这个实验:为一个谷歌文档打开了两个离线编辑器。在一个,我加粗了第一个词。第二次,我删了。不管我先打开哪个客户端,这个词总是会被删除。
首先,为什么会这样——我对运营转型的理解是排序很重要?在两个人分别输入“a”和“b”的简单示例中,如果服务器首先收到“a”,它将通过将第二个人的“b”事件转换为“传递一个空格”来强制输出“ab” ,然后添加 b" 事件,反之亦然。
其次,如果订购无关紧要,那么 Google Docs 选择在删除方面犯错是否有技术原因?或者原因很大程度上对用户来说很简单?
real-time - 为什么我们需要运营转型来实现实时协作?
看过 Google Docs 之类的应用程序和ShareJS和EtherPad Lite之类的库后,我对实时协作感到非常兴奋,这似乎是使用一种称为操作转换的非常复杂的技术来实现的。
我的问题可能有点奇怪:为什么需要 OT?
我的意思是,在大多数设置中,我们在网络上的延迟非常低——使用 Google Docs、ShareJS 和 EtherPad 等工具,更改几乎立即反映在连接的客户端上。
为什么在服务器端解决冲突和保持同步的解决方案非常复杂?
熟悉命令模式和撤消/重做,在我看来,一个更简单的解决方案是将文档的每个更改简单地实现为具有等效撤消命令的命令。
让客户端在进行更改时提交序列化命令。在服务器端为每个收到的命令分配一个序列号。将应用于文档的所有命令分发回客户端,客户端还维护命令历史记录。
每个连接的客户端都从服务器接收到应用于文档的所有命令,现在带有指示“正确”顺序的序列号,例如服务器接收命令的顺序,以及它们应用于主文档的顺序由服务器持有。
如果客户端在命令号 100 处,并向服务器提交了一条返回为 102 号的新命令,则客户端知道它错过了一条命令 - 然后它简单地对它提交的最后一条命令应用“撤消”命令,应用命令号 101,然后再次应用它自己的命令号 102,从而使事情恢复正常。
如果它落后于几个命令,它会根据需要简单地回滚,然后应用所有错过的命令,等等。
这对我来说听起来要简单得多。
运营转型在哪些方面比这更好?
operational-transform - ShareJS 示例不起作用
我正在尝试使用 Sharejs 制作一个协作文本编辑器,但我一开始就遇到了一些问题。
我从“入门”页面开始。我运行npm install share
,然后使用./node_modules/share/bin/exampleserver
. 这工作正常。
但是后来我尝试按照“运行服务器”部分中的步骤创建自己的小型应用程序。我编写了 app.js 文件和建议的 html,当我尝试运行它时,浏览器控制台给出 404 错误,说它找不到 socket.io.js:
然后我反复收到此错误:
有没有人有任何建议或想法是什么原因造成的?我知道它可以工作,因为正如我之前提到的,预配置的示例在本地工作得很好,只是我在尝试创建新应用程序时不能正确配置某些东西。
谢谢。
ios - UITextField - 监视文本中的插入和删除
因此,我正在开发具有一些协作功能的应用程序,例如多个用户同时编辑单个文本文件。
我需要像这样http://operational-transformation.github.io对文本进行操作转换(检查可视化http://ot.substance.io/visualization)。
我想我可以简单地在我的应用程序中使用那个 JS 实现(使用 WebView 或一些派生的桥),没关系,但是我如何在 UITextField 上观察这些文本变化?我显然需要观察插入和删除(+两者的位置)。我需要创建要发送到服务器并从服务器接收的操作。
那么我该如何做到这一点,或者是否有任何用 Objective-C 为 iOS 编写的可行解决方案?
clojure - Clojure Pedestal 框架中的架构模型是类似于 Google Wave 的操作转换吗?
阅读Pedestal 演示文稿(并阅读示例源代码)——我看到了一个基于转换和操作的模型。
Pedestal 使用类似于Google Wave中使用的操作转换(看这里和这里)是真的吗?
javascript - 将操作转换库与 Meteor 集成
在使用 Meteor 构建应用程序时,它的功能真的让我感到惊讶。然而,能够在我的应用程序中加入 Etherpad 风格的协作编辑位真的是一个圣杯。
在查找如何执行此操作时,我发现了一些似乎在流星中使用 OT 库的项目。
使用ot.js 的项目:
使用ShareJS 的项目:
我似乎无法说出这些项目如何与 Meteor 集成。他们真的在使用 Meteor Collections 吗?他们是否只使用托管 Meteor 的 Node 服务器并将 OT 作为一个单独的组件,根本不使用 Meteor?是否有不同的 OT 库可以更好地与 Meteor 集成?
如果有人熟悉这些项目或已将 OT 作为 Meteor 应用程序的一部分实施,请分享您对解决此问题的最佳方法的想法。
(这不是Meteor.js 中的 Operational Transformation 的副本?因为这个问题已经有将近一年的历史了,从那时起 Meteor 已经走了很长一段路。)
javascript - 从 CKEditor 生成非 HTML 标记
TL;DR:我想破解 CKEditor 的内部结构,以便它为富文本(而不是 HTML)生成另一种格式,我想请专家就该想法的可行性发表意见。
我正在开发一个需要协作式富文本编辑器(如 Google Docs)的项目,并且我计划使用操作转换库(ShareJS)来实现它。但是由于标签嵌套规则,操作转换很难用 HTML 实现。例如,一个幼稚的 OT 实现很容易产生这种垃圾:
在 HTML 中表示此类文本的正确方法更像是这样:
或者更好的是,像这样:
但是,要获得这些表示,OT 实现需要了解 HTML 标记嵌套的所有规则以及如何纠正错误的合并。
我一直在考虑一种可能的解决方案,它使用完全不强制标签嵌套规则的另一种标记形式。像这样的东西:
使用这样的格式,我可以使用普通的 OT 库来管理正在进行的 diff/rebase/merge 操作,然后在最后一刻将生成的文档转换为 HTML,然后更新协作双方的 GUI。
实现这一点的最简单方法是向 CKEditor 询问其 HTML 输出,然后在事后以新格式重建文档。但是 OT 会要求我在每次按键时都执行这种转换,这似乎有点过于重量级了。出于性能原因,我想知道是否可以覆盖 CKEditor 中的默认 HTML 编写器,要求它在遍历 DOM 时生成另一种格式。
你怎么看?
javascript - 使用带有 contenteditable 元素的 sharejs
有没有办法将sharejs与 contenteditable-Elements 一起使用,例如<div contenteditable="true">Content <b>with html</b></div>
其中的 HTML-Content?
或者还有其他将操作转换 (OT) 与 HTML-Content 或 Rich-Text 结合使用的最佳实践吗?用 node.js 怎么能做到这一点?
node.js - Etherpad(-Lite)的具体操作转换算法?
我可以为 etherpad 或 etherpad lite 中使用的具体 ot 算法提供提示或来源吗?它是否基于学术论文?也欢迎提供转换部分的源代码部分的提示或链接。