文字差异补丁

时间:2009-12-05 09:26:01

标签: algorithm

我试图编写一段代码,允许用户在文本框中键入文本,然后将其保存在服务器上。当用户在文本框中键入更多文本时,我只希望将差异发送到服务器。

是否存在JS的差异算法,我可以使用该算法仅发送有关差异的信息。所以它应该能够区分两个文本框之间的区别。

它也可以是语言无关的,我可以移植它。

感谢您的时间。

更新

简单来说。我有一个文本区域,每隔X秒就会在文本框中保存文本。现在为了节省带宽,我只希望它发送与上次保存的修订版本的差异(我可以说放在一个变量中。最初这将是空的)。现在JS必须检查最后修订版本和文本框当前状态之间的区别,并生成一个更改列表以发送到服务器。

更新2

像www.etherpad.com

这样的东西

5 个答案:

答案 0 :(得分:3)

Google DiffMatchPatch有一个Javascript实现,我已经非常成功地使用它了。

http://code.google.com/p/google-diff-match-patch/

答案 1 :(得分:1)

Python difflib模块可以做到这一点以及更多。它非常灵活,但移植到Javascript可能很有挑战性。

关于您的更新,我首先想知道为什么您需要担心带宽。除非您的用户在编辑框中输入 lot 文本(它有自己的可用性问题),否则发送的字节数不多。每次自动保存时发送整个文本框。用户输入的速度不够快,无法真正注意到带宽的使用。

或者,你可以半途而废。每次自动保存时,检查用户是否只有添加新文本到最后一次。如果是这样,请仅使用新文本发送“附加”类型更新。如果用户已经返回并编辑了其他任何内容,则在发送整个文本的位置发送“替换”类型更新。这样可以处理常见的仅附加案例,而不会使您的实现变得非常复杂。

答案 2 :(得分:0)

取决于你准备好了多远。 您想检查deltav算法,特别是svn使用它:http://svn.apache.org/repos/asf/subversion/trunk/notes/svndiff

答案 3 :(得分:0)

而不是计算两个文本之间的差异,这很难,

你可以随时在人们编辑时记录文本框中的击键和插入位置。如果你偶尔发送它(并清理缓冲区),服务器可以播放完全相同的序列。

答案 4 :(得分:0)

这段代码 - 过早优化的气味。也许你应该首先实现你的解决方案然后然后看看如何使用差异来优化你的传输速率。你看多少文字?因为请求和响应数据包的大小差不多,只有几个字节的差异,所以节省的费用可能非常小。

至少,在没有优化的情况下完成您的解决方案,并使用Firebug等工具对您的网络流量进行分析,然后进行测试,看看您认为可以发送的最大文本块的性能有多差。< / p>

最后,您始终可以使用TypeWatch JQuery plugin来监听文本框中的更改事件。您可以设置延迟,以便一旦用户完成输入并且延迟过去,就会触发回调函数。这意味着文本将仅在用户键入内容时发送,并且仅在完成键入时发送。这比重复轮询服务器效率要高得多。