2009-09-22 3 views
2

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

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

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

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

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

+0

Итак, в основном вы хотите отслеживать возраст разных частей текста в поле записи? –

+0

Или вы отслеживаете возраст нескольких версий, которые все вместе составлены для формирования текущей страницы? –

+0

Поскольку я не храню дельт, я _think_ ответы да и нет соответственно. Я хочу отслеживать изменения более старые, чем текущая ревизия (не обязательно должна быть самая последняя ревизия, но это не имеет значения, я думаю), что является единственным возможным источником контента, поскольку содержимое ревизии не может включать ничего контента в версиях, более новых, чем он сам. –

ответ

3

Update: [длинный и немного не по теме ответа на дольше здравую подпоследовательности удалено]

Я интегрирован мой Hunt-McIlroy алгоритм подпоследователя искатель с тестом, который сейчас проходит. Я сделал несколько модов на вашем тестовом примере, см. Его here at pastie.org. Аналогичным образом, here is the rdiff module. Вот мой журнал svn для почему ваш test case was changed.

+0

http://pastie.org/639057 – DigitalRoss

+0

Я также экспериментировал с камнем 'Diff :: LCS', чтобы получить разницу между различными версиями. Однако я не понял, как использовать различия.Я полагаю, что выход вашего класса LCS похож на вывод 'Diff :: LCS' gem? –

+0

О, хе-хе, я об этом не знал. Похоже, мы сделали что-то подобное. Я бы распространил мои результаты на ваш хорошо написанный тестовый пример, если у меня было больше времени, но я начал этот вопрос всего за несколько часов до крайнего срока. – DigitalRoss

2

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

+0

Как бы вы передали что-то в 'diff', которое не хранится в виде файлов? Изменения исходят от БД, и afaik 'diff' не может принимать входные данные от STDIN. –

+0

Привет, я думаю, вы могли бы работать с временными файлами (входы * diff * command) – ATorras

+0

Ах, поэтому мне пришлось бы создавать tempfiles. Как я могу использовать diffs для визуализации возраста контента? –

2

Вы можете использовать команду svn blame для получения аналогичных результатов. Разумеется, изменения и страницы должны храниться в svn. Если переход на svn является дорожным блоком, возможно, изучение источников svn, как написано в команде вины, может помочь.

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

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


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

Нужные для вас результата я принимаю (для ясности я имею пропустить, пробела)
Afer первого дифференциала:

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

После второго дифференциала :

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

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

tortise merge http://img169.imageshack.us/img169/7871/merge.png

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

+0

Хорошая идея, но я бы лучше сохранил ее в БД, чтобы упростить масштабирование системы. –

+3

Очень маловероятно, что хранение данных в БД было бы значительно более масштабируемым, чем хранение его в любом разумном VCS; это та работа, которую они специально предназначены для обработки, тогда как реляционная (я предполагаю) БД предназначена для поддержки специальных запросов и т. д. Более вероятным источником проблем будет интеграция части, поддерживаемой БД приложения с частью, которая ведет переговоры с VCS. Для представления о том, как с этим справиться, вы можете посмотреть такие проекты, как django-vcs http://code.google.com/p/django-vcs/ –

+0

Может ли svn/git/[other vcs] помочь мне визуализировать возраст контента, хоть? –

1

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

+0

Есть ли примеры того, как я могу использовать Git для этого? Я не могу хранить содержимое в git, должен быть сохранен в БД. Тем не менее, я мог бы передавать контент в git. –

+0

Вы можете просто сохранить оба в db и git. БД будет содержать последнюю версию текста. В git вы можете хранить файл с идентификатором из db, например, и каждый раз, когда вы перезаписываете его, вы можете выполнить git commit. Таким образом, вы сможете получить историю/diff каждого файла и даже строку в файле. – Kane

+0

Я не могу думать о каких-либо командах git, которые визуализируют возраст контента. Может ли это сделать на самом деле? –

2

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

+0

Хорошая точка, спасибо :) –

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