|
Этот документ является введением в механизм трансформации структуры, предоставляемый Amaya. Здесь описан синтаксис языка трансформации и способы трансформации, выполняемой в редакторе.
Файл amaya/HTML.trans
содержит описание возможных
трансформаций. Этот фал можно редактировать в ходе сессии
Amaya. Он динамически разбирается в ходе процедуры
трансформации, поэтому новые трансформации можно добавлять прямо в ходе
сессии редактирования.
Внимание: поскольку описания трансформаций могут
содержать тэги, нередактируйте файл HTML.trans
с помощью Amaya. Для этого можно использовать любой
текстовый редактор.
Комментарии начинаются с символа !
и идут до
конца строки.
Файл состоит из списка описаний трансформаций. Каждое описание трансформации состоит из трёх частей:
:
;
{
}
, где каждое правило оканчивается точкой с запятой
;
Имя появляется в меню Transform и идентифицирует данную трансформацию для конечного пользователя.
Патэрн описывает специфическую организацию трансформируемых элементов. Он работает как фильтр поверх HTML dtd. Назначение патэрна - идентифицировать определённую комбинацию элементов, к которым применяется данная трансформация. В патэрне имеется возможность выразить условия для последовательности тэгов, для содержимого тэга и для наличия и значения атрибута.
Формально патэрн содержит HTML-тэги (возможно, с атрибутами) и некоторые операции:
|
выбор
,
для потомков
+
последовательность
?
опция
( )
группирование узлов
Фигурные скобки {
}
определяют содержимое узла.
Символ *
это лексема/token, обозначающая
совпадение с любым элементом.
Можно переименовать тэг, поставив перед ним имя с последующим двоеточием
(:
).
Тэг может иметь атрибуты. Если атрибуту не задано значение, элемент совпадает, если атрибут имеется. Если значения атрибута специфицировано, элемент совпадает, если атрибут имеется и имеет специфицированное значение.
Примеры патэрнов даны в конце этого документа.
Правило показывает, как трансформируются элементы, идентифицированные в
патэрне. В правиле имеются две части, разделённые символом
>
:
Сам список целевых тэгов делится на две части, разделённые двоеточием
(:
):
Путь размещения сгенерированного ищется в самой левой ветви дерева документа, начиная с предка элемента, совпадающего с самым высоким символом патэрна.
В списке генерируемых тэгов символ точки (.
)
используется для спуска по структуре дерева.
Если спецсимвол "звёздочка" (*
) заканчивает
список генерируемых тэгов, тэг исходного элемента не изменяется, но может
быть перемещён в другое место.
Если исходный тэг или имя в левой части правил представлено в патэрне более одного раза, правило трансформирует все элементы, совпадающие с появлением тэга в патэрне.
При выборе команды Transform в меню
Edit, Amaya разбирает файл HTML.trans
(или
MathML.trans
и т.п.). Затем выбранные элементы совпадают с
патэрном каждой трансформации. Имена совпавших трансформаций предлагаются
пользователю во всплывающем меню.
Если несколько трансформаций с тем же именем совпадают с выбранными
элементами, пользователю предлагается трансформация наивысшего уровня. Если
несколько трансформаций совпадают на одном уровне, предлагается уровень,
объявленный первым в файле HTML.trans
. Как следствие,
рекомендуется специфицировать трансформации со специфическим патэрном ранее
более общего.
После то как трансформация выбрана пользователем, структура назначения строится в соответствии с правилами, по мере прохода по выбранным элементам.
Наконец, содержимое исходных элементов (текст и изображения, а также структурированные элементы) переносятся в производимые элементы.
Этот процесс трансформации HTML-документов полностью описан в
Merge Lists: (ul{li+})+; { li > ul:li; }
Этот патэрн совпадает с последовательностью ненумерованных списков (UL), содержащих последовательности элементов (LI).
Правило выражает то, что каждый раз при обнаружении элемента списка создаётся новый тэг LI в UL. Когда правило применяется в первый раз, результирующая структура пуста, поэтому нет таких элементов UL, в которых можно создать LI. Следовательно, сначала создаётся UL, а затем применяется правило.
Table: dl{(dt|dd)+}; { dt > <table border=1>.tbody:tr.td; dd > <table border=1>.tbody.tr:td; }
Этот патэрн совпадает с любым HTML-элементом Definition List (dl).
Правило объясняет, как таблица строится, когда выполняется проход по структуре выбранного определения/definition list:
Remove Table: table{?caption,?(body:*{(tr{(td{(?cell_content:*)+}| th{(?cell_content:*)+} )})+})+}; { caption>h3; cell_content>:*; }
Этот патэрн совпадает с любым элементом table и идентифицирует содержимое каждой ячейки таблицы (cell_content).
Второе правило указывает, что содержимое каждой ячейки таблицы должно быть перемещено на новое место в таблице-оригинале.