Секции
Аппарат секций предназначен для конструирования шаблонов страниц, а не отдельных вершин. Секция, включенная в HTML код вершины, не подлежит специфической обработке и будет использована литерально.
Синтаксис секций
Секция – это фрагмент HTML кода, ограниченный комментариями специального вида:
<!-- Begin section SectName --> Section code here <!-- End section SectName -->
После маркера начала комментария должен быть пробел, потом слова Begin section (чувствительны к регистру!), потом обязательно пробел и название секции (любая последовательность знаков, кроме пробела), затем пробел и маркер конца комментария. Конец секции пишется по таким же правилам.
В шаблоне одноименные секции могут повторяться (например, меню сайта может размещаться в нескольких местах). Секции могут содержать в своем коде другие вложенные секции. Границы секций могут даже пересекаться (при условии, что такая путаная схема подстановки даст осмысленный код), хотя такой подход не рекомендуется.
Шаблон, предназначенный для подстановки, может содержать несколько последовательных секций (например, замены для меню и для нижнего колонтитула). Они обрабатываются последовательно, но при этом вложенные секции отдельно не обрабатываются, а рассматриваются как часть кода секции-хозяйки и подставляются литерально.
Секции могут содержать любой HTML код при условии, что результат подстановки образует корректный HTML код. Если секция содержит заголовок таблицы или начало формы, то секция, которая ее заменяет, также должен содержать заголовок таблицы или начало формы.
Компиляция секций
Секции компилируются, если шаблон страницы содержит ссылки на другой (предковский) шаблон. Смерека проходит по цепочке этих ссылок до корневого шаблона.
Корневой шаблон должен представлять полный код страницы (html – /html). Если шаблон-потомок содержит какие-нибудь секции (типично), каждая такая секция вытесняет своим кодом код одноименной секции шаблона-предка. Если шаблон-предок содержит несколько повторений имени данной секции, все они будут заменены (при этом учитывается только имя секции, а не ее код).
Шаблон, образованный после этого шага компиляции, содержит секции с данным именем и новым кодом (следовательно, в ходе дальнейшей компиляции эти секции могут быть снова заменены или модифицированы).
После подстановки первой секции шаблона-потомка Смерека переходит к подстановки следующей корневой секции потомка – вплоть до исчерпания этих корневых секций.
Эта процедура повторяется для всех последующих шаблонов-потомков и заканчивается на том шаблоне, который был вызван.
Пример применения секций
Рассмотрим в упрощенном виде, как работают секции для той страницы, которую вы сейчас читаете.
Корневой шаблон имеет вид:
<html> … <body> <!-- Begin section MainBar --> <table> <tr> <td> <Smereka Method="Inspector" Display="Crown" /> </td> <td> <!-- Begin section MainCell --> <Smereka Func="GetDocTitle" /> <Smereka Method="CompiledAttr" /> <!-- End section MainCell --> </td> </tr> </table> <!-- End section MainBar --> </body> </html>
Он содержит три смеретега, которые генерируют соответственно дерево-навигатор, заголовок документа и тело документа. Он содержит две секции, одна из которых захватывает все полосу страницы, а вторая – ячейку таблицы справа от дерева.
Для вывода изображений в галерее нам не нужно дерево, вместо этого мы хотим отдать максимум площади под изображения. Для этого создаем новый шаблон, унаследованный от предыдущего, в котором пишем:
<!-- Begin section MainBar --> <Smereka Func="GetDocTitle" /> <Smereka Func="MakeImage" /> <Smereka Method="CompiledAttr" /> <!-- End section MainBar -->
В результате компиляции старая секция MainBar (которая содержала таблицу) будет вытеснена и заменена этими пятью строками.
Если возникла необходимость продавать на сайте Мерседесы, для этого можно использовать такой шаблон, унаследованный от корневого:
<!-- Begin section MainCell --> <Smereka Func="GetDocTitle" /> <Smereka Func="GetProductColor" /> <Smereka Func="GetProductImage" /> <Smereka Func="GetProductPrice" /> <Smereka Method="CompiledAttr" /> <!-- Begin section CustomerOrderForm --> <!-- End section CustomerOrderForm --> <!-- End section MainCell -->
В таком случае дерево слева будет отображать категории и товары, а в ячейке MainCell будет отображаться информация о конкретном товаре: название – цвет – изображение – цена – описание.
Заканчивается наша новая секция вложенной секцией CustomerOrderForm, в данный момент пустой. При использовании такого шаблона описание товара будет выведено, но без формы заказа. Это сделано для того, чтобы следующие шаблоны, унаследованные от данного, могли определить эту форму по своему усмотрению.
Например, если страница предназначена для нового покупателя, она может содержать текст «Поздравляем с приобретением вашего первого Мерседеса», а если покупатель уже зарегистрировался на сайте, ему можно показать форму с текстом «Купите свой шестисотый Мерседес у нас».
Данный пример не содержит никаких деталей форматирования – именно для того, чтобы показать сам принцип компиляции шаблонов и возможные пути использования этого механизма для построения легко управляемой системы прототипов страниц.