|
Этот документ является введением в механизм трансформации структуры, предоставляемый Amaya. Здесь описан синтаксис языка трансформации и способы трансформации, выполняемой в редакторе.
Файл amaya/HTML.trans содержит описание возможных
трансформаций. Этот фал можно редактировать в ходе сессии
Amaya. Он динамически разбирается в ходе процедуры
трансформации, поэтому новые трансформации можно добавлять прямо в ходе
сессии редактирования.
Внимание: поскольку описания трансформаций могут
содержать тэги, нередактируйте файл HTML.trans
с помощью Amaya. Для этого можно использовать любой
текстовый редактор.
Комментарии начинаются с символа !и идут до
конца строки.
Файл состоит из списка описаний трансформаций. Каждое описание трансформации состоит из трёх частей:
:;{
}, где каждое правило оканчивается точкой с запятой
;Имя появляется в меню Transform и идентифицирует данную трансформацию для конечного пользователя.
Патэрн описывает специфическую организацию трансформируемых элементов. Он работает как фильтр поверх HTML dtd. Назначение патэрна - идентифицировать определённую комбинацию элементов, к которым применяется данная трансформация. В патэрне имеется возможность выразить условия для последовательности тэгов, для содержимого тэга и для наличия и значения атрибута.
Формально патэрн содержит HTML-тэги (возможно, с атрибутами) и некоторые операции:
|выбор
, для потомков
+последовательность
?опция
( ) группирование узлов
Фигурные скобки {
} определяют содержимое узла.
Символ * это лексема/token, обозначающая
совпадение с любым элементом.
Можно переименовать тэг, поставив перед ним имя с последующим двоеточием
(:).
Тэг может иметь атрибуты. Если атрибуту не задано значение, элемент совпадает, если атрибут имеется. Если значения атрибута специфицировано, элемент совпадает, если атрибут имеется и имеет специфицированное значение.
Примеры патэрнов даны в конце этого документа.
Правило показывает, как трансформируются элементы, идентифицированные в
патэрне. В правиле имеются две части, разделённые символом
>:
Сам список целевых тэгов делится на две части, разделённые двоеточием
(:):
Путь размещения сгенерированного ищется в самой левой ветви дерева документа, начиная с предка элемента, совпадающего с самым высоким символом патэрна.
В списке генерируемых тэгов символ точки (.)
используется для спуска по структуре дерева.
Если спецсимвол "звёздочка" (*) заканчивает
список генерируемых тэгов, тэг исходного элемента не изменяется, но может
быть перемещён в другое место.
Если исходный тэг или имя в левой части правил представлено в патэрне более одного раза, правило трансформирует все элементы, совпадающие с появлением тэга в патэрне.
При выборе команды Transform в меню
Edit, Amaya разбирает файл HTML.trans (или
MathML.trans и т.п.). Затем выбранные элементы совпадают с
патэрном каждой трансформации. Имена совпавших трансформаций предлагаются
пользователю во всплывающем меню.
Если несколько трансформаций с тем же именем совпадают с выбранными
элементами, пользователю предлагается трансформация наивысшего уровня. Если
несколько трансформаций совпадают на одном уровне, предлагается уровень,
объявленный первым в файле HTML.trans. Как следствие,
рекомендуется специфицировать трансформации со специфическим патэрном ранее
более общего.
После то как трансформация выбрана пользователем, структура назначения строится в соответствии с правилами, по мере прохода по выбранным элементам.
Наконец, содержимое исходных элементов (текст и изображения, а также структурированные элементы) переносятся в производимые элементы.
Этот процесс трансформации HTML-документов полностью описан в , документе, представленном Cécile Roisin и Stèphane Bonhomme на в Париже в мае 96 года.
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).
Второе правило указывает, что содержимое каждой ячейки таблицы должно быть перемещено на новое место в таблице-оригинале.