Глядя на разворачивающиеся события в отношении лексера, а также в свете грядущей работы над ББ 2.0, хочу расширить идею сохранения исходников в plaintext.
Уже сейчас можно сохранять исходник в виде текста. Однако, при этом теряется информация о форматировании текста и вложенные вьюшки.
Для решения этих проблем можно изменить формат хранения, изменив его с бинарного на текстовый, но с сохранением семантики.
Документы сохраняются через Documents.ExportDocument. Его можно попробовать переписать и, в случае, если это текстовый документ, сохранять текст как текст и форматирование, приведенное к бинарному виду. Любую бинарную информацию записывать в каком-нибудь из форматов для хранения бинарных данных в тексте, вроде BASE64,
Ascii85 или
basE91.
Можно использовать высокоуровневый текстовый формат для хранения.
Получится что-то вроде такого:
Код:
1 ODC
2 Store: DJ+*.@<*K0@<6L(Df-\0Ec5e;DffZ(EZee.Bl.9pF"AGXBPCsi+DGm>@3BB/F*&OCAfu2/AKY
3 MODULE AggTest;
(* Далее идет текст модуля *)
...
(* следующая строка — вложенная вьюшка, например, командер. *)
4 Store: (DIb:@FD,*)+C]U=@3BN#EcYf8ATD3s@q?d$AftVqCh[NqF<G:8+EV:.+Cf>-FD5W8ARlolDIa
END AggTest.
5 9jqo^BlbD-BleB1DJ+*+F(f,q/0JhKF<GL>Cj@.4Gp$d7F!,L7@<6@)/0JDEF<G%<+EV:2F!,
Нумерация не входит в сам файл и представлена лишь для целей объяснения.
Строка 1 - тег файла, сейчас эту роль выполняет docTag (CDOo).
Затем идет 2 - информация из Store, непредставимая в текстовом виде.
3 - собственно модуль
4 - вложенная Store, в обязательном порядке начинается и заканчивается переводом каретки; это позволит проще обрабатывать вложенные Store.
5 - информация о форматировании, или, обобщая, продолжается Store.
Это позволит сохранить семантику работы фреймворка и, что более важно, позволит инструментам вроде
git diff корректно работать с файлами как с текстом.
Ну а лексер можно научить игнорировать текст от Store: до конца строки, как комментарий или вообще скрывать.