Общая задача передо мною стоит так:
есть два файла с размеченным текстом, а точнее один файл и один diff, который выдала СКВ.
Нужно из них составить корректный (по языку разметки) файл, в котором включены обе версии, общие части не дублируются, различные части обрамляются специальными тегами.
При этом изменения в словах должны выделяться на уровне слов.
Например,
Файл 1:
<h1>Заголовок</h1>
Подзаголовок
Мама мыла раму.
Не было тучь на небе.
Файл 2:
<h1>Название</h1>
<h2>Подзаголовок</h2>
Мама мыла пуделя.
В небе были тучи.
Результат:
<h1><span class=old>Заголовок</span> <span class=new>Название</span><h1>
<h2>Подзаголовок</h2>
Мама мыла <span class=old>раму</span> <span class=new>пуделя</span>.
<span class=old>Не было тучь на небе.</span>
<span class=new>В небе были тучи.</span>
В принципе, я могу написать функцию, которая принимает два фрагмента и возвращает результат слияния, учитывая мои желания о результате и особенности используемого языка разметки.
Тогда задача сводится к определению этих самых фрагментов.
diff не подходит, потому что он сравнивает построчно, а строка слишком велика, чтобы её выделять и дублировать, если в ней только одно слово изменено, как в примере с рамой и названием. К тому же, мне хочется, чтобы как можно меньше была вероятность попадания тегов в фрагмент, если тот невелик (см. пример с Заголовком). Вариант вставить в файл дополнительные разрывы строк, чтобы на одной строке было слово, а затем применить diff не подходит, потому что в больших отличающихся фрагментах почти наверняка есть повторяющиеся слова, напр., союзы (см. пример со словом "небе").
Я бы хотел найти какую-нибудь программу, которая работает наподобие kdiff3, который может в строке подсветить отличающиеся символы,
при этом выход этой программы должен быть в таком формате, чтобы я мог дальше применить свою функцию.
Собственно, вопрос:
есть ли какая-нибудь программа, которая могла бы определить фрагменты, в которых два файла отличаются, на уровне слов, а не строк, и формировала список фрагментов с их координатами в легкопарсимом формате?
Или подойти к задаче с другой стороны?