Текстовая разница - PullRequest
       4

Текстовая разница

2 голосов
/ 05 декабря 2009

Я пытаюсь написать фрагмент кода, который позволит пользователю вводить текст в текстовое поле, которое затем сохраняется на сервере. Когда пользователь вводит еще текст в текстовое поле, я хочу, чтобы только разница была отправлена ​​на сервер.

Существует ли алгоритм различий для JS, который я могу использовать для отправки только информации о разнице. Таким образом, он должен быть в состоянии определить разницу между двумя текстовыми полями.

Это также может быть независимым от языка, и я могу портировать его.

Спасибо за ваше время.

UPDATE

Простыми словами. У меня есть текстовая область, которая продолжает сохранять текст в поле каждые X секунд. Теперь, чтобы сэкономить пропускную способность, я только хочу, чтобы он отправлял разницу от последней сохраненной ревизии (которую я могу сказать, поместите в переменную. Первоначально она будет пустой). Теперь JS должен проверить разницу между последней версией и текущим состоянием текстового поля и создать список изменений для отправки на сервер.

ОБНОВЛЕНИЕ 2

Что-то вроде www.etherpad.com

Ответы [ 5 ]

3 голосов
/ 05 декабря 2009

Google DiffMatchPatch имеет реализацию Javascript, я использовал ее с большим успехом.

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

1 голос
/ 05 декабря 2009

Модуль Python difflib делает это и многое другое. Он очень гибкий, но может быть проблематичным портировать на Javascript.

Что касается вашего обновления, я сначала задаюсь вопросом, почему вам нужно беспокоиться о пропускной способности. Если ваши пользователи не набирают lot текста в поле для редактирования (в котором есть свои проблемы с юзабилити), тогда просто не так много байтов для отправки. Отправляйте текстовое поле целиком каждый раз при автосохранении. Пользователи не могут набрать достаточно быстро, чтобы действительно заметить использование пропускной способности.

Или, вы могли бы встретиться на полпути. Каждый раз, когда вы автоматически сохраняете данные, проверяйте, добавил ли пользователь только добавленный новый текст в конец по сравнению с прошлым разом. Если это так, отправьте обновление типа «добавить» только с новым текстом. Если пользователь вернулся и отредактировал что-то еще, отправьте обновление типа «заменить», в которое вы отправите весь текст. Это учитывает общий случай только для добавления без серьезного усложнения вашей реализации.

0 голосов
/ 05 декабря 2009

Этот код пахнет преждевременной оптимизацией. Возможно, вам следует сначала реализовать свое решение, а , а затем узнать об оптимизации скорости передачи с использованием различий. Сколько текста вы смотрите? Поскольку пакеты запроса и ответа будут более или менее одинакового размера с разницей в несколько байт для вашего сообщения, экономия может быть очень минимальной.

Как минимум, завершите свое решение без оптимизации и профилируйте сетевой трафик, используя такие инструменты, как Firebug, а затем протестируйте, чтобы увидеть, насколько хуже производительность с тем, что вы считаете максимальным текстовым блоком, который можно отправить.

Наконец, вы всегда можете использовать плагин TypeWatch JQuery для прослушивания изменений в текстовом поле. Вы можете установить задержку таким образом, чтобы после того, как пользователь закончил печатать и истекла задержка, сработала функция обратного вызова. Это означает, что текст будет отправляться только тогда, когда пользователь что-то печатает, и только тогда, когда он закончит печатать. Это будет значительно эффективнее, чем повторный опрос сервера.

0 голосов
/ 05 декабря 2009

Вместо вычисления различий между двумя текстами, что сложно,

вы всегда можете, пока люди редактируют, записывать нажатия клавиш и положение каретки в текстовом поле. Если вы отправляете это время от времени (и очищаете буфер), сервер может воспроизводить точно такую ​​же последовательность.

0 голосов
/ 05 декабря 2009

Зависит от того, насколько далеко вы готовы пойти. Вы хотели бы проверить алгоритм deltav, он используется svn, в частности: http://svn.apache.org/repos/asf/subversion/trunk/notes/svndiff

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...