tags:

views:

107

answers:

5

Hello,

Am trying to write a piece of code which will allows the user to type text into a textbox which then gets saved on the server. When the user types some more text in the textbox, I want only the difference to be sent to the server.

Is there a difference algorithm for JS which I can use to send only information about the difference. So it should be able to tell the difference between two text boxes essentially.

It could also be language agnostic and I can port it.

Thank you for your time.

UPDATE

In simple words. I have a text area which keeps saving the text in the box every X seconds. Now to save bandwidth I only want it to send the difference from the last saved revision (which I can say put in a variable. Initially this will be empty). Now the JS has to check the difference between the last revision and the current state of the textbox and generate a change list to send to the server.

UPDATE 2

Something like www.etherpad.com

+1  A: 

The Python difflib module does this and more. It's very flexible but might be challenging to port to Javascript.

Regarding your update, I'm first wondering why you need to worry about bandwidth. Unless your users are typing a lot of text into an edit box (which has its own usability issues) then there just aren't that many bytes to send. Send the whole text box each time you autosave. Users can't type fast enough to really notice the use of bandwidth.

Or, you could meet halfway. Every time you autosave, check to see whether the user has only added new text to the end compared to the last time. If so, send an "append" type update with just the new text. If the user has gone back and edited anything else, then send a "replace" type update where you send the whole text. This takes care of the common append-only case without severely complicating your implementation.

Greg Hewgill
am trying something like etherpad.com
Alec Smart
A: 

Depends on how far you are ready to go. You would like to check deltav algorithm, it is used by svn in particular: http://svn.collab.net/repos/svn/trunk/notes/svndiff

Moisei
+3  A: 

Google DiffMatchPatch has a Javascript implementation, I've used it with much success.

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

richardtallent
+1 I was going to suggest that one, I too have had success with it
Dan F
http://stackoverflow.com/questions/1576050/network-efficient-difference-between-two-strings-in-javascript has some awesome links about diff match patch too
Dan F
A: 

Instead of calculating a diff between 2 texts, which is difficult,

you could always, while people are editting, record the keystrokes and the caret position in the textbox. If you send this over every now and then (and clean the buffer), the server can playback the exact same sequence.

Toad
A: 

This code-smells of premature optimization. Perhaps you should implement your solution first and then see about optimizing your transfer rates using diffs. How much text are you looking at? Because the request and response packets are going to be more or less the same size with only a few bytes difference for your message, so the savings could be very minimal.

At the very least, complete your solution without optimization and profile your network traffic using tools like Firebug and then test to see how much worse the performance is with what you would consider to be the maximum text block that could be sent.

Finally, you could always use the TypeWatch JQuery plugin to listen for change events in the textbox. You can set a delay so that once the user finishes typing and the delay elapses, the callback function is triggered. This means that the text will only be sent when the user types something, and only when they are finished typing. This will be significantly more efficient than repeatedly polling the server.

Soviut