Вход:  Пароль:  
FreeSource: AltLinux/Sisyphus/Alterator/evolution ...
Free Source | Каталог | Изменения | НовыеКомментарии | Пользователи | Регистрация |
Это старая версия AltLinux/Sisyphus/Alterator/evolution за 2005-10-26 14:14:36..

Эволюция Alterator – от интерфейсов к документам.

О чём это


К Woo BUS? – центральной шине alterator возможно присоединить любой тип интерфейса, самый простой – командной строки. Более сложный и любимый пользователями – полноэкранный или точнее говоря документо ориентированный. В духе морских названий элементов шины (ensign,admiral,bridge-book) его зовут lookout.


Пользователь работает с lookout, постепенно перемещаясь от одного документа к другому (В архитектуре Ya ST? это называется workflow). Каждый документ имеет универсальный идентификатор, очень похожий на путь в файловой системе, чтобы обратиться к документу – надо обратиться к его идентификатору. Сопоставлением идентификаторов и реальных файлов, содержащих документы занимается некий компонент, называемый Atlas. Кто есть atlas, каким образом он ищет документы Lookout не важно. Стандартный Atlas (простейшая его реализация) осущетвляет сопоставление, пользуясь текстовым файлом состоящим из строк такого формата:



Первая инструкция сопоставляет идентификатору файл, вторая – перенаправляет к другой записи.
Помимо всего прочего при загрузке документа, ему могут быть переданы некие дополнительные параметры, которые могут повлиять на его поведение.
Параметры могут быть также прописаны и в инструкциях перенаправления. По мере прохождения по инструкциям параметры накапливаются. Например, если мы делали обрашение «/ param1 value1», а файл сопоставлений был:



То будет загружен файл документа “myfile.scm” и переданы ему параметры param1 и param2 со значениями value1 и value2 соответсвенно.


Перейдём далее к более подробному описанию структуры документа. На данный момент, структура сложилась следующая.


На самом верхнем уровне неявно присутствуют глобальные переменные переданные документу,
Доступ к ним осуществляется через кострукцию global, например (global 'param1) вернёт значение value1 в нашем случае.


Далее следует собственно тело документа. В документе присутствует два вида инструкций, одни, начинающиеся с префикса “document:», отвечают за общую структуру, оставшиеся – за его содержимое, включая разметку.
При загрузке документ последовательно проходит через ряд трансформаций, превращающих его в последовательность более простых инструкций, которые в свою очередь поступают на вход к главному двигателю, а отнего к драйверу того или иного интерфейса. Поэтому при рассказе про общую структуру, я буду показывать во что трансформируются те или иные инструкции.


Замечание:
В текущей стабильной версии alterator уровень абстракции, который я называю тут «общая структура документа» отсутствует, присутвует только описание виджетов (второй уровень)

Общие определения


Начнём с общей структуры.
Документ состоит из последовательности «окружений», окружения могут быть вложены друг в друга (чем то похоже на Te X?)
Начало окружения ознаменуется инструкцией (document:envelop имя-среды параметры).
Окончание – (document:envelop имя-окружения).
Если окончание окужения не обнаружено, то она простирается вплоть до окончания файла обрабатываемого документа.
Трансформация состоит в том, что содержимое среды фактически оборачивается функцией «имя окружения».
То есть:

Превращается в:

А:

Превратится в:


Ещё один немаловажный элемент: назначение идентификаторов отдельным компонентам документа – document:id.
Формат очень простой – два аргумента. Первый – будущее имя, второй – сам компонент. Например:

Простота формата искупляется хитростью преобразования – ведь нам надо фактически создать серию локальных переменных, ссылающихся на компоненты документа.
Для этого проводится специальное (отдельно от всех остальных трансформаций) сканирование документа. Все обнаруженные идентификаторы собираются в список и создаётся обёртка примерно такого вида:

В результате получается серия локальных переменных видимых только среди данного документа. Оборачивание идентификаторов происходит перед оборачиванием другими определениями и этим автоматически достигается «неприкосновенность» ключевых слов и аттрибутов. Они срабатывают значительно позже и «затеняют» одноимённые идентификаторы. Например, как бы вы не старались назвать некий компонент width – всё-равно width останется зарезервированными именем аттрибута.


Другая инструкция занимается организацией явной связью между документами – document:link.
Связь может быть нескольких видов:


Таким образом простое изменение типа связи – и вы получаете другое представление документа.


Самая простейшая трансформация происходит в случае типа insert, Поэтому рассмотрим пример для insert.
Пусть вставляемый документ:

Основной документ:

Результат трансформации:


Последний способ задания структуры – инструкция document:surround – «укутывание». Чем же «укутывание» отличается от «заворачивания»? А вот чем.
Когда мы включаем документ, то, если в нём есть определение «конверта» без завершающего тега, то он будет автоматически закрыт по окончанию включаемого документа.
Например, если включаемый документ есть:

То:

Превратится в:


Обратите внимание, что элемент (b) не попал в конверт, поскольку тот автоматически закрылся по окончанию файла включаемого документа. Однако иногда хочется в некотором файле сохранить описание стандартных сред, в которыми будет «обёртываться» наш документ. Для этого есть инструкция document:surround.
Если document:link в предыдущем примере заменить на новую инструкцию, то:

Превратится в:

Обратите внимание, что весь хвост документа попал в «конверт». Это равносильно как будто бы сделать «включение наоборот». Как будто бы в включаемом файле была такая инструкция:

Поиск инструкций document:* проходит в глубину документа, если вы хотите защитить какой-нибудь фрагмент документа от таких трансформаций, то просто заключите его в кострукцию document:quote.


Таким образом:

Превратится в:


Теперь перейдём от статического назначения связей к «динамике». В ходе работы документ (или поддокумент) может быть замещён другим документом, для этого служит инструкция document:replace. Можно также явно вызвать выплывающее окно с другим документом – это делает инструкция document:popup. Ну а закрывается текущий документ командой document:end.

Дополнительные преобразования

Помимо проведения всех вышеописанных трансформаций, структура каждого окружения в документе проходит ряд дополнительных обработок.
Во-первых, все определения вытаскиваются из содержимого очередного окружения и трансформируются в letrec*. Это позволяет задавать более вольные взаимозависимости между определяемыми параметрами
Например

Трансформируется в

В следующей версии стандарта Scheme R6RS. Все внутренние определения будут автоматически приводиться к форме letrec*, поэтому необходимость в подобном преобразовании автоматически отпадёт.


Во-вторых, оставшиеся внутренние элементы автоматически объединяются в списки. Но объединяются только в том случае, если их количество больше одного.
Например:

Преобразуется в:

Однако:

Останется неизменным.
Подобное преобразование требуется поскольку документ обрабатывается по принципу «исполнения кода». И в случае отсутвия list врезультате будет возвращёны не все виджеты, а только последний.


Замечания:
1. До введения слоя абстракции управляемого инструкиями document:*, некоторые инструкции назвались иначе:


goto document:replace
run-dialog document:popup
end-dialog document:end
goto-frame
document:frame
load-url document:subdocument
include,include-as-is document:link
id document:id

2. Часть инструкций обрабатываются «трансформатором» перед «запуском» этого описания движком lookout, часть доступны как функции во время «жизни» документа. Соотв. параметры передаваемые последним могут вычисляться во время исполнения, в отличие от первых


Инструкции «статические»: document:link, document:envelop, document:quote, document:surround


Инструкции «времени исполнения»: document:replace,document:popup,document:frame,document:subdocument,document:end


В будущем по-мере развития проекта возможно перемещение «статических» инструкций в разряд «динамических».


 
Файлов нет. [Показать файлы/форму]
Один комментарий. [Показать комментарии/форму]