2009-12-05 5 views
2

J'essaie d'écrire un morceau de code qui permettra à l'utilisateur de taper du texte dans une zone de texte qui sera ensuite sauvegardée sur le serveur. Lorsque l'utilisateur tape un peu plus de texte dans la zone de texte, je souhaite que seule la différence soit envoyée au serveur.Patch de différence de texte

Existe-t-il un algorithme de différence pour JS que je peux utiliser pour envoyer uniquement des informations sur la différence. Donc, il devrait être capable de faire la différence entre deux zones de texte essentiellement.

Il pourrait également être agnostique de langue et je peux le porter.

Nous vous remercions de votre temps.

MISE À JOUR

En mots simples. J'ai une zone de texte qui conserve le texte dans la boîte toutes les X secondes. Maintenant, pour économiser de la bande passante, je veux seulement envoyer la différence par rapport à la dernière révision sauvegardée (ce que je peux dire mettre dans une variable.) Initialement, cela sera vide). Maintenant, le JS doit vérifier la différence entre la dernière révision et l'état actuel de la zone de texte et générer une liste de modifications à envoyer au serveur.

MISE À JOUR 2

Quelque chose comme www.etherpad.com

+0

Travail à domicile ?! Donnez un exemple de ce que vous voulez, ce n'est pas clair. –

+0

Non non pas HW. Dites une zone de texte avec du texte => abc. alors la zone de texte a textarea => abcXYZ. Maintenant, je veux seulement envoyer la différence au serveur. –

+0

Eh bien je l'ai eu mais que se passe-t-il si le premier contient abc puis adc, que voulez-vous envoyer –

Répondre

3

Google DiffMatchPatch a une implémentation Javascript, je l'ai utilisé avec beaucoup de succès.

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

+0

+1 J'allais suggérer que l'un, j'ai aussi eu du succès avec lui –

+0

http://stackoverflow.com/questions/1576050/network-efficient-difference-between-two-strings -in-javascript a quelques liens impressionnants à propos de diff match patch trop –

1

Le module Python difflib fait cela et plus encore. C'est très flexible, mais cela peut être difficile à porter sur Javascript.

En ce qui concerne votre mise à jour, je me demande d'abord pourquoi vous devez vous inquiéter de la bande passante. À moins que vos utilisateurs tapent un lot du texte dans une zone d'édition (qui a ses propres problèmes d'utilisabilité) alors il n'y a tout simplement pas beaucoup d'octets à envoyer. Envoyez la boîte de texte entière chaque fois que vous sauvegardez automatiquement. Les utilisateurs ne peuvent pas taper assez vite pour vraiment remarquer l'utilisation de la bande passante.

Ou, vous pourriez rencontrer à mi-chemin. Chaque fois que vous sauvegardez automatiquement, vérifiez si l'utilisateur a seulement ajouté nouveau texte à la fin par rapport à la dernière fois. Si oui, envoyez une mise à jour de type "append" avec juste le nouveau texte. Si l'utilisateur est retourné et a édité autre chose, alors envoyez une mise à jour de type "replace" où vous envoyez le texte entier. Cela prend en charge le cas ordinaire d'ajout uniquement sans compliquer gravement votre implémentation.

+0

essaie quelque chose comme etherpad.com –

0

Au lieu de calculer une diff entre 2 textes, ce qui est difficile,

vous pouvez toujours, alors que les gens sont Editting, enregistrer les frappes et la position de caret dans la zone de texte. Si vous envoyez ceci de temps en temps (et nettoyez le tampon), le serveur peut lire exactement la même séquence.

0

Ce code-sent l'optimisation prématurée. Peut-être que vous devez d'abord mettre en œuvre votre solution et puis voir à propos de l'optimisation de vos taux de transfert en utilisant diffs. Combien de texte regardez-vous?Étant donné que les paquets de requête et de réponse seront plus ou moins de la même taille avec seulement quelques octets de différence pour votre message, les économies pourraient être très minimes. Au minimum, terminez votre solution sans optimisation et analysez votre trafic réseau à l'aide d'outils tels que Firebug, puis testez pour voir à quel point les performances sont inférieures à ce que vous considérez comme le bloc de texte maximal pouvant être envoyé. Enfin, vous pouvez toujours utiliser le TypeWatch JQuery plugin pour écouter les événements de modification dans la zone de texte. Vous pouvez définir un délai afin qu'une fois que l'utilisateur a fini de taper et que le délai se soit écoulé, la fonction de rappel soit déclenchée. Cela signifie que le texte ne sera envoyé que lorsque l'utilisateur saisira quelque chose, et seulement quand il aura fini de taper. Cela sera significativement plus efficace que d'interroger plusieurs fois le serveur.