> -- Info21 писал(а):
> вышло впечатление, что там нужен чистый текст.
> -- Александр Ильин писал(а):
> текстовый формат без межстрочных зависимостей
В качестве примера: html, xml.
Цель: иметь возможность произвести слияние (merge).
Ситуация, в которой требуется слияние: пользователь А и пользователь Б получили копию файла, оба его изменили и создали каждый свой патч.
Задача слияния: с помощью автоматической процедуры получить файл, содержащий изменения от обоих пользователей.
Пример на уровне файла. Упрощенно представим формат ODC в качестве текстового файла, в котором первая строка хранит информацию о форматировании, в нашем случае о выделении жирным имени процедуры:
## Код:
```
bold=22..25
PROCEDURE (o: Object) Init*;
```
Здесь имеется в виду, что слово Init должно быть выделено жирным, а именно - символы с 22 по 25 включительно, начиная от второй строки файла (символы нумеруются с нуля).

Предположим, пользователь А изменил имя переменной-получателя, заменив "o:Object" на "obj:Object".
## Код:
```
bold=24..27
PROCEDURE (obj: Object) Init*;
```
Как видно, строка заголовка автоматически изменилась, чтобы отразить новое положение слова Init в тексте. Это и есть пример того, что я называю нелокальной зависимостью.

Пользователь Б, допустим, изменил имя типа с Object на Obj, а имя переменной не трогал.
## Код:
```
bold=19..22
PROCEDURE (o: Obj) Init*;
```
Как видно, заголовок тоже автоматически изменился, чтобы отразить новое положение слова Init в тексте.

При попытке выполнить слияние получим следующую проблему:
## Код:
```
bold=??..2?
PROCEDURE (obj: Obj) Init*;
```
Автоматике не ясно, что должно быть в заголовке. Один пользователь говорит, что там должно быть 24..27, другой - что 19..22, а на самом деле там должно быть третье значение: 23..26.

Решения два: либо автоматика должна обладать достаточными знаниями для того, чтобы вычислять новое значение (этим путём идёт Роман М. из Израиля), либо нелокальные зависимости надо превратить в локальные. Например, в XML это могло бы выглядеть так:
## Код:
```
PROCEDURE (obj: Obj) <bold>Init</bold>*;
```


Нынешний формат ODC мало чем отличается от приведенного двухстрочного. Есть бинарный заголовок, в котором указано форматирование для каждой цепочки символов, какие символы считать вьюшками и т.п. Сама по себе бинарность проблемы не представляет. Если просто закодировать всё в ASCII, слияние проще не станет.