Встроенная визуализация возраста контента - PullRequest
2 голосов
/ 22 сентября 2009

У меня есть две таблицы, страницы и ревизии. Редакция имеет внешний ключ к странице. Содержимое страницы является последней записью в таблице ревизий для этой страницы. Редакции являются полными копиями содержимого, без различий.

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

Мой вопрос: Как я могу извлечь эти данные из ревизий страницы? Указатели на литературу были бы одинаково полезны для реального кода, решающего эту проблему.

Не совсем актуально, но на всякий случай: это для проекта Ruby, на самом деле Ruby on Rails. Вот проект, на github .

Обновление: вот пример теста, написанный на Ruby. http://pastie.org/631604

Ответы [ 5 ]

3 голосов
/ 02 октября 2009

Обновление : [длинный и немного не по теме ответ на самую длинную общую подпоследовательность удален]

Я интегрировал свой искатель подпоследовательностей Алгоритма Ханта-Макилроя с вашим тестовым примером, который сейчас проходит. Я сделал несколько модов для вашего тестового примера, посмотрите его здесь, на pastie.org. Аналогично, вот модуль rdiff . Вот мой лог svn, почему ваш тестовый пример был изменен.

2 голосов
/ 01 октября 2009

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

2 голосов
/ 26 сентября 2009

Вы можете использовать команду svn blame для получения похожих результатов. Конечно, ревизии и страницы должны храниться в SVN. Если переход на svn является препятствием, возможно, может помочь изучение источников svn о том, как пишется команда «blame».

Редактировать: @ августа Чтобы визуализировать это, мне нужно что-то, что не заботится о строках. Не так ли?

Ну, вам нужно обвинять в строках и diff для содержимого одного ряда. Первый выполняется VCS, второй вы можете сделать самостоятельно или сторонним кодом. По каждому хранилищу изменений в базе данных дельты обвинений рекомендуются (нужно сохранять только измененные строки). В примерах результатов для одной строки имеем:


Rev. num.    Value
      23     Hello worl
      36     Hello cruel world
      45     Hello wonderful world

Я полагаю, желаемый для вас результат (для ясности я пропустил пробелы)
Afer first diff:

(Hello)(23)(cruel)(36)(worl)(23)(d)(36)

После второго различия:

(Hello)(23)(wonderful)(45)(worl)(23)(d)(36)

Унифицированный diff не помогает в этом случае, поэтому иначе нужно сделать diff. Вы можете написать алгоритм для diff самостоятельно или найти подходящий код в инструментах слияния. Ниже приведен пример того, как TortiseMerge делает вещи.

Пытка слияния http://img169.imageshack.us/img169/7871/merge.png

Проблема не простая, но я думаю, что мои идеи могут вам немного помочь или дать какие-то подсказки.

2 голосов
/ 23 сентября 2009

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

1 голос
/ 26 сентября 2009

Вы можете использовать любой DVCS для достижения этой цели. Я бы порекомендовал Git. Это будет даже лучше, чем при использовании db.

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