2013-04-06 2 views
9

У меня есть <div contenteditable="true" />, который пользователь может написать, который в значительной степени неограничен по длине.
Данные в div сохраняются при изменении с меткой времени в базе данных MySQL.Сохранение изменений в contenteditable с отметкой времени

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

Теперь, вопрос: Как я могу сохранить информацию (какая часть была изменена когда) лучше всего?

Я рассмотрел следующие варианты до сих пор, которые оба кажутся улучшаемый:

  1. Каждый раз, когда пользователь посещает сайт в конце документа вставить флаг (например, пуста промежуток с классом и атрибут данных, который сохраняет начало редактирования). Этот флаг затем сохраняется в базе данных при вызове сценария сохранения. Этот параметр упростит отображение даты на стороне - я бы просто поставил их на ту же высоту, что и пустой пробел, и диапазон сообщает мне дату. Недостатки: пользователь может случайно удалить временной интервал времени, и если пользователь не закрывает окно в течение длительного времени, никакие новые временные интервалы не вставлены (этого, вероятно, можно избежать, вставив новую временную шкалу каждые X минут, чтобы удаляющая часть была более релевантно)
  2. Попытка выполнить сопоставление строк diff каждый раз, когда данные передаются в сценарий сохранения и сохраняются только с временной меткой. Затем, когда страница загружается, все части вместе в правильном порядке и в Javascript помещают заметки даты в нужное место. Это звучит как много накладных расходов для меня, хотя +, когда старые части изменены, две части могут стать одной и т. Д. Все эти варианты звучат очень сложно.

Любые материалы/идеи/предложения высоко оценены!

+0

Является ли тип контента структурированным или неструктурированным? Если он неструктурирован (например, кодовая база во времени), я бы предложил использовать решение, предоставленное armel. Если он структурирован или может быть структурирован, тогда решение (ы) предоставлено мной и мной. –

+0

Является ли тип контента структурированным или неструктурированным? Если он неструктурирован (например, кодовая база во времени), то я бы предложил использовать слияние решения, предоставляемого armel. Если он структурирован или может быть структурирован, тогда решение (ы) предоставлено мной и мной. Неструктурированный документ более сложный для обработки, потому что довольно часто трудно урегулировать правильную иерархию изменений. (Это всегда была очень проблематичная проблема с репликацией на разных серверах в Lotus Notes.) Это версия комментария, которую я хотел бы вам принять во внимание. –

+0

@LoekBergman: вход генерируется пользователем и не следует какой-либо конкретной структуре. – Horen

ответ

12

То, что вы пытаетесь реализовать, - это функция, называемая «аннотировать» или «винить» в мире управления исходным кодом (хотя вам просто нужна дата обновления, а не дата + автор или просто автор).

Чтобы сделать это правильно, вам нужен способ сделать diff (php-diff может выполнять эту работу) и получить версии текста. Есть несколько стратегии:

  • магазин последнюю версию и сохранить только дельты (например, объединённые различий, мое предпочтение)

  • магазин всех версии и вычислить дельты на лета

Как только у вас есть текущая версия и список дельт (вы можете определенно сократить список, если более чем несколько десятков дельты, и пусть пользователь спрашивает больше, если действительно важно). Вы составляете дельта вместе, здесь происходит этап аннотации, так как вы можете сделать эту часть, вспоминая, из какой версии идет каждая строка. На самом деле составление довольно простое (начиная с последнего, все строки, добавленные в патч, ведущие к нему, являются последними, другие нужно объяснить, так что начните снова со следующего патча, пока не достигнете самого древнего патча, который вы хотите обработать , оставшиеся строки взяты из этой версии или раньше, поэтому может использоваться некоторый флаг с надписью «до или до»).

Google has a diff library for Javascript так что мог бы сделать всю тяжелую работу на пользовательской машине. Они также имеют патч-часть в этой библиотеке. Я не нашел библиотеку аннотации/вины.

+0

Спасибо, это звучит неплохо. Просто понять лучше: Сохранение: 1) Я сохраняю самую последнюю версию, 2) В то же время я сохраняю diff, который пришел с текущей версией. Затем загрузите (вы назвали его составлением): 1) Начните с текущей версии, 2) Возьмите новейший diff и примените его к текущей версии, например. google javascript patch, 3) повторите шаг 2 со следующей более старой версией до завершения. Я правильно понял? – Horen

+0

да что-то в этом роде, во время «Сохранения» обязательно работайте транзактивно (сохраните текущий + сохранить патч). Во время «Загрузка» вам нужно будет применить исправления для аннотации задания.Обратите внимание, что, поскольку патчи ориентированы по строкам, приложение аннотата/патча может быть уменьшено для манипулирования массивом «автор и/или даты», работая только по координатам линии и позволяя тексту в патчах в одиночку (хотя они могут быть выгодны для функция восстановления или diff-to-version). Библиотека Google не будет делать аннотативную часть для вас, но вы можете получить вдохновение от своего кода. – armel

+0

Он не запрашивает процесс аннотации или вины (или хвала), потому что это процесс, чтобы выяснить, кто совершил код. Это не имеет никакого отношения к поиску текущей версии. Процесс, который вы описываете, является слиянием и хорошей альтернативой тому, что предложил г-н Фиши и я. См. Комментарий к общему вопросу. –

4

Один из способов, которым вы могли бы это сделать, это иметь таблицу для ревизий div. Каждый так часто вы можете добавить новую запись в эту таблицу, содержащую контент и временную метку, и, следовательно, отслеживать все изменения редактирования. Затем, чтобы узнать, что изменилось, вы можете просто сравнить две записи, чтобы узнать, что было добавлено, остались прежними и удалены.

+0

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

+0

Должен быть какой-то способ сделать это с помощью регулярного выражения, хотя я не очень хорош в этом. – cpdt

4

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

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

select id from docsintime where cur_key = x order desc limit 1; 

В обеих таблицах вы храните для каждой соответствующей части последней отметки времени, что он был изменен.

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

Смежные вопросы