> -- Роман М. писал(а):
> Каким образом можно автоматизировать изменения в исходных текстах программ составных документов?С точки зрения утилит diff/patch текстовый файл состоит из последовательности строк, идущих в определённом порядке одна за другой. Помимо данного порядка строки между собой никак не связаны, то есть любую строку можно заменить на любую другую последовательность строк, в том числе пустую (естественно, замена эта совершается по воле пользователя). Утилита diff сравнивает два файла (ДО и ПОСЛЕ) и создаёт последовательность команд (ПАТЧ) по удалению и замене строк, выполнение которых переводит файл из состояния ДО в состояние ПОСЛЕ. Эту последовательность команд в автоматическом режиме умеет выполнять утилита patch.

В качестве примера ситуации, когда строки между собой связаны и автоматическая работа утилит невозможна, можно привести следующий формат: пусть в текстовом файле первая строка содержит общее количество строк в файле. Это нарушает требование взаимной независимости строк: удаление любой нижележащей строки должно автоматически приводить к изменению содержимого первой строки. В случае с odc-файлами вместо такой первой строки есть бинарный заголовок файла, в котором хранятся, в том числе, атрибуты текста. Например, если есть выделение жирным, то в заголовке записано что-то типа "символы с 15 по 29 выделить жирным".  Соответственно, независимости нет: если добавить строку текста в начало, позиции должны сместиться.

Выхода я вижу три:
- создавать собственные утилиты diff/patch с собственным форматом командного файла;
- создать конвертеры, приводящие odc в некий текстовый формат без межстрочных зависимостей;
- отбрасывать форматирование и считать, что важен только сам текст (форматирование можно делать автоматическое при импорте в текстовую модель, но остаётся вопрос, что делать с командерами, складками и прочими вьюшками).

Для первого случая может быть интересной вот какая идея. Представить odc-документ не как статичное содержание, а как последовательность команд по его созданию. Команды такие реально уже есть, они используются в механизмах undo/redo. Интересно, что при этом откроется возможность сохранить файл, выйти из программы, затем через год открыть его и отменить последнее действие. Собственно, для этого-то и нужны системы контроля версий.