Лекция 5.  TEI

Основное назначение TEI, в отличие от DocBook, заключается не в передаче логической структуры документа, а в выделении в документе тех его составляющих, которые необхо­ди­мы для конкретных целей (исследования, поиска и пр.). При этом могут оставаться без внимания (и, следовательно, без разметки) многие другие элементы структуры текста. Как и DocBook, TEI позволяет размечать документы различного уровня: от корпуса (соб­ра­ния документов, не имеющего аналога в DocBook) до фрагмента технической документации.

TEI, в отличие от DocBook, не представляет собой единственное объявление типа доку­мен­та. TEI имеет модульную структуру, позволяющую собирать DTD для конкретного при­ме­не­ния из нескольких десятков модулей. Для управления такой сборкой в TEI ис­пользован механизм условных разделов DTD. Поэтому сначала рассмотрим этот меха­низм.

Ещё несколько слов про XML

Общая структура DTD содержит внешнее и внутреннее ограничения (3, разд. 2.8):

'<!DOCTYPE' S Name (S ExternalID)? S? ('[' intSubset ']' S?)? '>'

ExternalID указывает на внешний по отношению к DTD ресурс (URL или файл), со­дер­жащий часть объяв­лений (сущностей, элементов и атрибутов); текст этого ре­сур­са называется внешним ограничением (для того XML-документа, который будет свя­зан с рассматриваемым DTD);

intSubset содержит объявления, об­ла­дающие приоритетом по отношению к объяв­лениям, содержащимся во внешнем ограничении; эта совокупность объявлений называется внутренним ограничением.

НЕ нашли? Не то? Что вы ищете?

В принципе, структура текста внутреннего и внешнего ограничений имеет единственное отличие (3, разд. 2.8): в части DTD, вынесенной во внешнее ограничение (или во внешние параметри­ческие сущности) допускается использование так называемых условных разделов (conditional sections):

intSubset ::= ( markupdecl | DeclSep)*

extSubsetDecl ::= ( markupdecl | conditionalSect | DeclSep)*

markupdecl представляет объявления (сущностей, элементов и атрибутов);

DeclSep – разделители (пробельный материал, инструкции обработки и комментарии);

conditionalSect – те самые условные разделы, которые мы сейчас и рассмотрим.

Условные разделы объявления типа документа

Условный раздел имеет следующую структуру (следующие 5 правил приведены в 3, разд. 3.4; я сохранил нумерацию правил):

[61] conditionalSect ::= includeSect | ignoreSect
[62] includeSect ::= '<![' S? 'INCLUDE' S? '[' extSubsetDecl ']]>'
[63] ignoreSect ::= '<![' S? 'IGNORE' S? '[' ignoreSectContents* ']]>'
[64] ignoreSectContents ::= Ignore ('<![' ignoreSectContents ']]>' Ignore)*
[65] Ignore ::= Char* - (Char* ('<![' | ']]>') Char*)

Интерпретация этих правил проста:

[61] – условный раздел может представлять включаемый или исключаемый раздел.

[62] включаемый раздел оформляется как начало DTD (<![), за которым (через не­обя­зательные пробелы) следует слово INCLUDE, написанное заглавными буква­ми, за ко­торым через необязательные пробелы следует открывающая угловая скобка. За ней на­ходится содержимое включаемого раздела, представляющее собой всё то, что допус­ти­мо во внешнем ограничении, – т. е. объявления, разделители и снова условные разде­лы. Заканчивается включаемый раздел так же, как и DTD – ']]>'.

[63] исключаемый раздел начинается так же, как и включаемый, но вместо INCLUDE используется слово IGNORE, также написанное заглавными буквами. И закан­чивается исключаемый раздел так же, как и включаемый. Однако тело исключаемого раздела определено двумя последующими правилами. Эти правила удобнее проком­мен­тировать в обратном порядке.

[65] – игнорировать любой текст (в том числе и пустой), в котором нет характерных для DTD сочетаний сим­волов: '<![' и ']]>'. Такой текст будем называть игно­ри­ру­емым.

[64] тело исключаемого раздела – это игнорируемый текст, за которым, воз­мож­но, идут пары, состоящие из заключенного в '<![' и ']]>' тела исключаемого раз­дела и игнорируемого текста. Это правило необходимо для подсчета «открыва­ю­щих» ('<![') и «закрывающих» (']]>') DTD-скобок – в теле исключаемого раз­дела они должны быть строго вложены (когда встречается невложенная закрывающая DTD-скобка, исключаемый раздел считается законченным).

Семантика включаемого раздела проста: его текст включается в DTD, используемое XML-процессором при анализе документа. При этом выполняются обычные действия, на­пример, подстановка значений параметрических сущностей.

Семантика исключаемого раздела сложнее. Тело исключаемого раздела полностью игнорируется XML-процессором: игнорируется наличие включаемых разделов, вложен­ных в исключа­емый раздел; подстановка значений сущностей не выполняется, инструк­ции обработки игнорируются и т. д.

Применение условных разделов объявления типа документа

Пример условных разделов объявления типа документа

<!ENTITY % draft 'INCLUDE' >
<!ENTITY % final 'IGNORE' >

<![%draft;[
<!ELEMENT book (comments*, title, body, supplements?)>
]]>

<![%final;[
<!ELEMENT book (title, body, supplements?)>
]]>

Приведённый пример иллюстрирует использование условных раз­де­лов объявления типа документа: в DTD включается весь текст, который может/должен быть использован в раз­личных ситуациях применения DTD, сами ситуации обозначаются параметрическими сущностями, имеющими значения INCLUDE или IGNORE; части тек­с­та DTD, которые дол­ж­ны быть использованы в соответствующей ситуации, включаются в раздел, в котором вместо ключевых слов INCLUDE или IGNORE использована ссылка на параметрическую сущность. Замена значений сущностей изменит DTD:

<!ENTITY % draft 'IGNORE' >
<!ENTITY % final 'INCLUDE' >

TEI использует сотни параметрических сущностей со значениями INCLUDE или IGNORE, что, с одной стороны, позволяет производить тонкую настройку DTD, но, с другой сторо­ны, требует тщательного изучения DTD TEI.

Версии TEI

Текущая стабильная версия

Текущей стабильной версией TEI является версия 4. Предыдущие версии разрабаты­ва­лись, в основ­ном, для SGML. В версии 4 DTD разработано так, что обеспечивает поддер­ж­ку как SGML-документов, так и XML-документов. Для работы с XML-документами при использовании полного варианта TEI, однако, необходимо включение соответствующего модуля:

<!ENTITY % TEI. XML "INCLUDE">

Руководства по настройке и применению текущей стабильной версией TEI находятся на сайте консорциума TEI 4.

TEI Light

Кроме полного варианта DTD TEI существует официальный упрощенный вариант, т. н. TEI Light. TEI Light включает несколько наиболее употребительных модулей TEI:

<!ENTITY % TEI. prose 'INCLUDE' >
<!ENTITY % TEI. linking 'INCLUDE' >
<!ENTITY % TEI. analysis 'INCLUDE' >
<!ENTITY % TEI. figures 'INCLUDE' >
<!ENTITY % TEI. extensions. ent SYSTEM 'teilitex. ent' >
<!ENTITY % TEI. extensions. dtd SYSTEM 'teilitex. dtd' >
<!ENTITY % TEI. XML "INCLUDE">

DTD TEI Light не содержит условных разделов. Руководство по TEI Light также можно найти на сайте консорциума TEI (причем на русском языке 5).

Разрабатываемая версия

В настоящее время разрабатывается пятая версия TEI. Она разрабатывается с использова­нием XML-схемы. Рабочий вариант пятой версии TEI (вместе с предварительной версией документации) находится на «фабрике проектов» Source Forge (проект TEI).

TEI Light

Объявление типа документа TEI Light, как правило, используется для разметки единст­вен­ного доку­мен­та (а не для разметки корпусов как целого). Именно такое применение TEI Light мы и будем рассматривать. Для единственного документа доку­мент TEI Light всегда имеет один и тот же корневой элемент с именем TEI.2, состоящий из заголовка TEI и собственно размеченного текста («текста TEI»):

<!ELEMENT TEI.2 (teiHeader, text) >

Заголовок TEI (часто называемый «электронный титульный лист»), как видно из приведённого объявления элемента TEI.2, обязан присутствовать. В заголовке TEI содер­жится информация, аналогичная той, что находится на титульном листе печатного текс­та (метаданные). Она может содержать до четырех частей: библиографическое описание ма­шиночитаемого текста, описание способа разметки, небиблиографическое описание текс­та (параметры текста), и архив исправлений. Более подробно заголовок будет расс­мот­рен ниже.

Текст TEI может быть монолитным (отдельное произведение) или объединенным (на­бор отдельных произведений, как, например, в антологии). В любом случае текст мо­жет иметь необязательные вводную (front) и закрывающую (back) части. Между ними располагается основная часть текста (body), которая, в случае объединенного текста, мо­жет состоять из групп (group), а они, в свою очередь, из других групп или текстов:

<!-- Вспомогательные элементы могут встречаться почти всюду -->
<!ENTYTY % text. aux
'anchor | gap | index | interp | interpGrp | lb | milestone | pb'>

<!ELEMENT text
((%text. aux;)*,
(front, (%text. aux;)*)?,
(body | group),
(%text. aux;)*,
(back, (%text. aux;)*)?
)
>

В результате разметки монолитного текста получается структура, подобная приведенной ниже:

<TEI.2>
<teiHeader> <!-- Заголовок TEI --> </teiHeader>
<text>
<front> <!-- Вводная часть...--> </front>
<body> <!-- Тело текста... --> </body>
<back> <!-- Завершающая часть ... --> </back>
</text>
</TEI.2>

Объединенный текст также имеет необязательные вводную и закрывающую части. Между ними располагается одна или несколько групп текстов, каждая из которых тоже может иметь свои собственные вводные и завершающие части. Таким образом, в результате раз­метки объединенного текста получается структура, подобная приведенной ниже:

<TEI.2>
<teiHeader> <!-- Заголовок объединенного текста --> </teiHeader>
<text>
<front> <!-- Вводная часть объединенного текста --> </front>
<group>
<text>
<front> <!-- Вводная часть первого текста --> </front>
<body> <!-- Тело первого текста --> </body>
<back> <!-- Завершающая часть первого текста --> </back>
</text>
<text>
<front> <!-- Вводная часть второго текста --> </front>
<body> <!-- Тело второго текста --> </body>
<back> <!-- Завершающая часть второго текста --> </back>
</text>
<!-- Другие группы или тексты -->
</group>
<back> <!-- Завершающая часть объединенного текста --> </back>
</text>
</TEI.2>

Разметка основной части текста

Элемент body содержит всю основную часть одного монолитного текста, исключая то, что относится к вводной или завершающей частям текста. Этот элемент включает нес­коль­ко классов элементов:

w  Блочная структура текста

Сюда входят абзац (p) и разделы (div1 div7, div), аналогичные частям, главам и секциям (вместе взятым) DocBook; заголовки и заключения (head и trailer) раз­де­лов. В этот же класс элементов включаются обозначения структур, специ­фи­ческих для определенного жанра: строфа (lg), стихотворная строка (l), обо­значение персо­нажа (speaker) и прямой речи персонажа (sp), авторские за­ме­чания (stage, как пра­вило, в тексте пьесы).

w  Закладки

Закладки – это, прежде всего, номера строк (lb, этим элементом помечаются так­же разрывы строк) и страниц (pb). Номера строки страниц обычно связаны с конкрет­ным изданием. Кроме этих элементов, в классе закладок присутствует эле­мент, пред­назначенный для обозначения произвольного маркера – milestone.

w  Выделения

Выделения общего вида (когда причина выделения неизвестна) размечаются эле­мен­том hi (от английского highlight). В том случае, когда причина выделения яс­на, можно использовать специализированные элементы, размечающие слова или фразы: выделяемые с целью получения лингвистического или риторического эф­фек­та (emph); написанные на языке, отличающемся от языка основного текста (foreign); упомянутые, но не использованные (mentioned); рассматриваемые как технический термин (term); содержащие название произведения (title).

Большинство элементов, не связанных непосредственно с выделениями в тексте, име­ет атрибут rend, значения которого позволяют передавать типографские осо­бенности выделения (например, особенности шрифта и блочность или потоковость выделения).

w  Цитаты

TEI позволяет размечать 4 вида цитат: цитата общего вида (речь или мысль, от­меченные как принадлежащие другому автору (независимо от того, действительно ли данный отрывок является цитатой); в сюжетно-повествовательных текстах таким образом отмечается прямая речь персонажа или оратора, а в словарях элемент этот элемент можно использовать для обозначения реальных или искусственных приме­ров использования) размечается элементом q; слова или фразы упомянутые, но не использованные (mentioned); слова или фразы, за которые автор или рассказчик сни­мает с себя ответственность, что обозначается кавычками или курсивом (soCalled); слова или фразы, которые представляют собой толкование (глоссу) или определение какого-либо другого слова или фразы (gloss).

w  Примечания

Любые примечания, которые печатаются в виде сносок, примечаний в конце текста, маргиналий (примечаний на полях) или как-либо по-иному, следует обозначать с помощью одного и того же элемента note.

w  Перекрёстные ссылки и связи

Перекрёстные ссылки и связи внутри документа TEI и перекрёстные ссылки и связи с другими документами (TEI и не TEI) размечаются по-разному. Для ссылок внутри документа TEI используются два элемента: ref и ptr (первый – контейнер, кото­рый может содержать текст и/или другие элементы; второй – пустой). Ссылка всегда должна вести к элементу, поэтому для создания в документе точек или сегментов, на которые можно было бы ссылаться, можно использовать любые элементы TEI, в том числе и специально для этого предназначенные: anchor и seg (первый – пустой – для создания точки, на которую можно сослаться; второй – контейнер – для отметки произвольного отрезка текста).

Для связи с другими документами используются элементы xref и xptr, причем для указания точки связывания в других документах используется язык XPath.

Для всех элементов TEI определены атрибуты связывания, позволяющие во многих случаях обойтись без использования элементов ref, ptr, anchor и seg.

w  Редакторская правка, пропуски, удаления и дополнения

Элементы этого класса используются для разметки исправлений, т. е. изменений, внесенных редактором в тех местах, где по его мнению, в оригинале имеется ошиб­ка. Кроме исправления или нормализации слов и фраз, редакторы и публикаторы могут предложить вставить пропущенные материалы, не публиковать некоторые ма­териалы или ввести материалы, вычеркнутые из оригинала. Кроме того, некото­рые материалы могут оказаться исключительно сложными для передачи, поскольку их непросто разместить на странице (например, рисунки рукописи).

w  Имена, даты, числа, сокращения и адреса

Этот класс содержит элементы: для разметки имён собственных (name), относящихся к персонам, и т. н. «называющих строк» (rs), которые представляют собой имена собственные, относящиеся к объектам (географические названия, названия кораблей и т. п.); дат (date) и времён (time); чисел (num); сокращений (abbr) с указанием соот­вет­ствующих полных форм (в виде значения атрибута expan элемента abbr); адре­сов (addr). Адрес (addr), в свою очередь, состоит из строк адреса (addrLine).

w  Списки

Этот класс элементов содержит собственно список (list) и элемент списка (item). Нумерованность или маркированность списка управляются атрибутами. Ненумеро­ван­ный и немаркированный список может использоваться как глоссарий; в этом слу­чае для терминов используется элемент label, а определения размечаются эле­ментом item. Элемент label позволяет размечать достаточно произвольные спис­ки.

w  Библиографические ссылки

Для разметки библиографических ссылок используется элемент bibl. Его содержи­мое может (но необязательно) быть структурировано с помощью элементов author (первичные сведения об ответственности), title (заглавие), editor (вторичные сведения об ответственности), imprint, publisher и pubPlace (сведения о пуб­ли­кации), series (сведения о серии), biblScope (подробность и уровень опи­сания).

w  Таблицы

Этот класс элементов содержит три элемента: table, row, cell.

w  Рисунки и графика

Для рисунков и графики используется один из двух элементов: figure или figDescr. Первый используется тогда, когда графика должна быть представлена в электронном документе; в этом случае графический файл должен быть представлен т. н. неразбираемой сущностью XML. Элемент используется для описания графи­чес­кого компонента текста в том случае, когда этот компонент по каким-то причинам не будет визуализирован.

w  Интерпретация и анализ

Этот класс элементов на самом деле содержит элементы, назначение которых может меняться от приложения к приложению. Для выделения неделимых фрагментов текста (часто – слов, например, для синтаксической разметки) используется эле­мент s. Элементы s не следует вкладывать друг в друга, хотя это формально и не запре­щено. Для создания «опорных точек» – фрагментов текста, на которые можно ссылаться, используется элемент seg. Для произвольных интерпретаций (коммен­тариев, морфологической разметки и пр.) используется пустой элемент interp, со­держащий интерпретирующую аннотацию, которую можно связать с некоторой частью текста. Элементы interp можно объединять в группы – контейнеры interpGrp.

w  Техническая документация

Элементы этого класса применяются как для разметки документации (подобно DocBook), так и для целей подготовки документов TEI к публикации.

Некоторые элементы этого класса предназначены для разметки специфических фрагментов текстов документации: кратких примеров (eg); фрагментов кода (code), идентифика­торов (ident); имена элементов XML или SGML (gi); ключевых слов на формальном языке (kw); математических, химических и иных формул (formula). Для записи фор­мул, как правило, используется TEX и, при необходимости, секции символьных дан­ных (<![CDATA[ ... ]]>).

Другие элементы предназначены для указания мест в документе, в которые будут по­мещены разделы, создаваемые обрабатывающим документ приложением: раз­де­лы общего вида (divGen) и указатели (index).

Кроме элементов, руководство 5 (разработанное ещё в до-Юникодовскую эру) настоя­тель­но рекомендует для всех символов, отличных от латиницы и цифр, а также от небольшого набора знаков препинания, использовать общие сущности, обозначающие соответствую­щий символ, например, &percnt; вместо знака "%" (DTD TEI Light содержит 340 объяв­лений подобных сущностей). В настоящее время применение XML/Unicode эту рекомен­дацию сделало неактуальной, её следует соблюдать только в том случае, если документ будет обрабатываться в ус­таревшем приложении.

Разметка вводной части текста

Структура вводной части текста определяется следующим объявлением:

<!ELEMENT front
(
(divGen | titlePage | anchor | gap | index | interp
| interpGrp | lb | milestone | pb)*,
(
(
(argument | byline | docAuthor | docDate | docEdition
| docImprint | docTitle | epigraph | head
| titlePart),
(argument | byline | docAuthor | docDate | docEdition
| docImprint | docTitle | epigraph | head
| titlePart
| titlePage | anchor | gap | index
| interp | interpGrp | lb | milestone | pb)*
)
|
(div,
(div | divGen | titlePage | anchor | gap | index | interp
| interpGrp | lb | milestone | pb)*
)
|
(div1,
(div1 | divGen | titlePage | anchor | gap | index
| interp | interpGrp | lb | milestone | pb)*
)
)?
)
>

Фактически, вводная часть текста может содержать информацию о титульном листе (titlePage) и/или его фрагментах и/или элементах, расположенных на контртитуле, обороте титульного листа и т. п. (части объявления, начинающиеся с элемента argument), а также различные вводные тексты (элементы div и div1).

Титульный лист

Никакие вложенные в элемент front элементы не являются обязательными (обратите внимание на наличие знаков * и ?), однако рекомендуется использовать по крайней мере элемент titlePage, описывающий титульный лист произведения, или те элементы, которые входят в него, но могут быть использованы непосредственно в элементе front:

<!ELEMENT titlePage
(
(anchor | gap | index | interp | interpGrp | lb
| milestone | pb)*,
(byline | docAuthor | docDate | docEdition | docImprint
| docTitle | epigraph | figure | titlePart),
(byline | docAuthor | docDate | docEdition | docImprint
| docTitle | epigraph | figure | titlePart
| anchor | gap | index | interp | interpGrp
| lb | milestone | pb)*
)
>

В структуре титульного листа могут быть выделены следующие элементы, не являющиеся служебными:

docTitle

Содержит название документа, включая все его составляющие, в том виде, как они приведены на титульном листе. Должен содержать по крайней мере один элемент titlePart.

<!ELEMENT docTitle
(
(anchor | gap | index | interp | interpGrp | lb | milestone | pb)*,
(titlePart,
(anchor | gap | index | interp | interpGrp | lb | milestone | pb)*
)+
)
>

titlePart

Содержит подразделы или части названия произведения, как они представлены на ти­тульном листе; этот элемент используется также для свободно размещаемых фраг­ментов титульного листа, не являющихся частями названия документа, для указания авторства и т. д. Может включать разнообразные элементы разметки.

byline

Содержит первичные сведения об ответственности, приведенные на титульном листе, либо в начале или в конце произведения.

docAuthor

Содержит имя автора документа, как приведено на титульном листе (часто, но не всегда содержится в элементе byline).

docDate

Содержит дату (создания, печати) документа, как она представлена (обычно) на титульном листе.

docEdition

Содержит сведения о редакции документа («Издание 2-е, исправленное и допол­нен­ное»), как они представлены на титульном листе.

docImprint

содержит сведения об издании (место и дату публикации, название издательства), как представлено (обычно) в нижней части титульного листа.

epigraph

содержит цитату, анонимную или с указанием автора, которая приводится в начале раздела, главы или на титульном листе.

Фрагменты титульного листа и других вводных элементов документа

Руководство 5 ошибочно описывает некоторые элементы, как допустимые во вводной и завершающей частях текста. Текущая версия DTD TEI Light некоторые из описанных в 5 элементов допускает только в завершающей части текста, но не во вводной. Приведу не­ко­торые элементы, допустимые во вводной части текста (другие допустимые в этом месте элементы уже описаны выше):

argument

Формальный список или описание тем, раскрываемых в данном подразделе текста.

head

Заголовок. Может содержать многочисленные элементы фразовой разметки. Во ввод­ной части документа часто содержит элементы argument и byline и следу­ю­щие эле­менты:

salute

Содержит приветствие, предваряющее предисловие, посвятительное послание или другой раздел текста, а также приветствие в конце письма, предисловия и т. п.

dateline

Содержит краткое описание места, дату, время и т. п. создания письма, газетной статьи или другого произведения, предваряющее его как осо­бый вид заголовка.

opener

Группирует вместе элементы dataline, byline, salute или подобную им ин­формацию, которая появляется в качестве вступительной части в начале разде­ла, особенно в начале письма. Может содержать многочисленные элементы фразовой разметки.

Крупные блоки текста во вводной части следует выделять с помощью элементов div или div1.

Разметка завершающей части текста

Структура завершающей части текста отличается от структуры вводной части наличием в ней (в конце завершающей части) элементов trailer и/или closer и определяется сле­дующим объявлением:

<!ELEMENT back
(
(divGen | titlePage | anchor | gap | index
| interp | interpGrp | lb | milestone | pb)*,
(
(
(argument | byline | dateline | docAuthor | docDate
| epigraph | head | opener | salute | signed),
(argument | byline | dateline | docAuthor | docDate
| epigraph | head | opener | salute | signed
| titlePage | anchor | gap | index | interp
| interpGrp | lb | milestone | pb)*
)
|
(div,
(div | divGen | titlePage | anchor | gap | index
| interp | interpGrp | lb | milestone | pb)*
)
|
(div1,
(div1 | divGen | titlePage | anchor | gap | index
| interp | interpGrp | lb | milestone | pb)*
)
)?,
(trailer | closer)*
)
>

Элементы trailer и closer почти неотличимы друг от друга – они содержат, в основ­ном, элементы фразовой разметки, closer может содер­жать три элемента, который не могут входить в trailer: знакомые нам salute и dateline, а также signed, который содержит заключительное приветствие и т. п., следующее за разделом текста.

Лекция 6.  Структура основной части документа TEI

Основная часть текста (body), как уже говорилось выше, может содержать элементы нескольких классов:

w  Блочная структура текста

w  Закладки

w  Выделения

w  Цитаты

w  Примечания

w  Перекрёстные ссылки и связи

w  Редакторская правка, пропуски, удаления и дополнения

w  Имена, даты, числа, сокращения и адреса

w  Списки

w  Библиографические ссылки

w  Таблицы

w  Рисунки и графика

w  Интерпретация и анализ

w  Техническая документация

Некоторые из них используются для разметки блоков текста, другие – для разметки по­то­ковых фрагментов текста. Не все они употребляются одинаково часто. Остановимся под­робнее на некоторых часто используемых элементах.

Блочная структура текста

Полная DTD TEI имеет блочную организацию; в ней отдельные группы элементов, кото­рые должны встречаться вместе, собраны в параметрические сущности, поэтому устройс­т­во этого DTD более или менее может быть понято (более или менее потому, что этим па­раметрическим сущностям даны, в отличие от DocBook, недостаточно мнемонические имена). DTD TEI Light, однако, вообще не использует параметрические сущности, что де­лает изучение этого DTD непростым занятием. Я соберу некоторые группы элементов TEI Light в классы, для обозначения каждого такого класса использую параметрическую сущ­ность, которой дам своё имя.

Структура тела документа

Сначала я определю класс «маркирующих» элементов, предназначенных для отметки ви­димой или невидимой области в документе (эта область может вырождаться и точку, например, для элементов anchor и pb):

<!ENTITY % body. marks
"anchor | gap | index | interp | interpGrp | lb | milestone | pb"
>

Затем определяем класс элементов, которые могут входить как в заголовок, так и в завер­шающую часть тела (не путать с титульным листом и завершающей частью документа – TEI допус­кает дополнительный заголовок и завершающую часть для тела документа и да­же для разделов):

<!ENTITY % body. framingElements
"byline | dateline | epigraph | salute | signed"
>

Теперь можно определить заголовок и завершающую часть тела (перечисление элемен­тов, которые могут входить только в заголовок, и элементов, которые могут входить толь­ко в завершающую часть, я вынес в отдельные параметрические сущности). Вот структура заголовка:

<!ENTITY % body. header. elements
"( argument | docAuthor | docDate | head | opener | signed )"
>
<!ENTITY % body. header
"( %body. header. elements; | %body. marks; | %body. framingElements; )"
>

Завершающая часть в TEI Light определена несколько иным способом (явно выделена про­извольная цепочка маркирующих элементов):

<!ENTITY % body. trailer. elements
"(closer | trailer | %body. framingElements; )"
>
<!ENTITY % body. trailer
"(%body. trailer. elements; , ( %body. marks; )*)"
>

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

Теперь можно перейти к определению собственно (тела J) тела документа. Это тело тела может состоять непосредственно из размеченного текста (за которым может следовать не­который набор разделов), либо только из некоторого набора раз­делов. Сначала соберём в отдельный класс элементы, которые могут быть использованы вне разделов (out of div – «внераздельная» разметка):

<!ENTITY % body. outOfDiv
"(eg | bibl | biblFull | ab | l | lg | p | sp | cit | q
| label | list | listBibl | note | stage)"
>

На уровне тела тела документа нельзя использовать произвольные разделы: это должны быть разделы уровней 0 (div0) или 1 (div1) или рекурсивные разделы (div), либо разде­лы, сгенерированные программно (текстовым процессором или иной программой – «ав­то­матические разделы» divGen). Чтобы яснее выразить праворекурсивные правила, определяющие возможность использования вперемешку разделов одного и того же уров­ня и программно сгенери­ро­ванных разделов (вместе с маркирующими элементами), оп­ределим «хвостовые» части цепочек, состоящих из одних и тех же разделов:

<!ENTITY % body. tail. R "(div | divGen | %body. marks;)" >
<!ENTITY % body. tail.0 "(div0 | divGen | %body. marks;)" >
<!ENTITY % body. tail.1 "(div1 | divGen | %body. marks;)" >

Теперь можно определить сами цепочки, состоящие из одних и тех же разделов:

<!ENTITY % body. R "(div, %body. tail. R;*)" >
<!ENTITY % body.0 "(div, %body. tail.0;*)" >
<!ENTITY % body.1 "(div, %body. tail.1;*)" >

«Ручная разметка» состоит из разделов одного и того же вида (уровней 0 или 1 или рекур­сивных разделов):

<!ENTITY % body. Hand "( %body. R; | %body.0; | %body.1; )" >

Автоматическая разметка может перемежаться маркировочными элементами:

<!ENTITY % body. div. generated "(divGen, (%body. marks;)* )" >

В результате определение тела документа приобретает понятный вид: сначала в теле до­кумента должны быть использованы элементы заголовка тела (в любом количестве; в том числе заголовок тела может и отсутствовать), затем идёт «тело тела», а затем – элементы завершающей части тела, которая также может отсутствовать:

<!ELEMENT body
(
%body. header;*,
(
(
( %body. outOfDiv; , ( %body. marks; )* )+ ,
%body. div. generated;*, %body. Hand;?
)
|
( %body. div. generated;*, %body. Hand;? )
),
%body. trailer*
)
>

Строение «тела тела» также теперь очевидно. Оно может быть образовано двумя спосо­бами:

1 (
2 ( %body. outOfDiv; , ( %body. marks; )* )+ ,
3 %body. div. generated;*, %body. Hand;?
4 )
5 |
6 ( %body. div. generated;*, %body. Hand;? )

В первом способе перед необязательными разделами следует некоторая часть текста, раз­меченная с использованием элементов класса body. outOfDiv (вперемешку с маркиру­ю­щими элементами). Во втором – такая часть текста отсутствует.

Замечание

Наличие именно таких альтернатив в описании тела тела документа объясняется не­об­ходимостью допустить три варианта строения этой части элемента:

w  Только внераздельная разметка (строка 2)

w  Внераздельная разметка (строка 2), за которой следуют разделы (строка 3)

w  Только разделы (строка 6)

Четвёртый вариант – отсутствие содержимого – невозможен из-за наличия скобок, ок­ружающих «тело тела» (выделены полужирным шрифтом в объявлении body) – по­скольку после скобок нет знаков ? или *, то что-нибудь из описанного внутри скобок содержимого должно присутствовать.

Если думать о DTD как о порождающей грамматике (это так в случае применения DTD в инструментах типа Altova Authentic), то объявление тела документа можно бы­ло бы ещё сократить:

<!ELEMENT body
(
%body. header;*,
(
( ( %body. outOfDiv; , ( %body. marks; )* )+ )? ,
%body. div. generated;*, %body. Hand;?
),
%body. trailer*
)
>

Однако, возможно, распознающая грамматика с таким правилом не является детер­ми­нированной – это нуждается в проверке.

На самом деле DTD TEI Light порождается из DTD TEI автоматически, поэтому подоб­ные сокращения следует делать с осторожностью.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6