Модуляризация XHTML

Создание нового ОТД


Наконец, некоторые авторы ОТД захотят начать с нуля, используя сценарий Модуляризации XHTML в качестве набора утилит для построения нового языка разметки. Этот язык обязан быть построен с минимальным необходимым количеством модулей из XHTML. Он может также содержать другие определённые в XHTML модули или любые другие модули, которые автор хочет использовать.

В данном примере мы возьмём необходимые модули XHTML, добавим некоторые определённые в XHTML модули и добавим всё это в модуль, определённый нами выше.

Сначала нужно использовать предоставляемый XHTML для нового модуля квалифицированных имён, изменив его так, чтобы определить квалифицированные имена и пространство имён для наших новых элементов:

<!-- Файл myml-qname-1.mod -->

<!-- Вводим типы данных - мы используем PE URI.datatype для объявления атрибутов xmlns. --> <!ENTITY % MyML-datatypes.mod PUBLIC "-//W3C//ENTITIES XHTML Datatypes 1.0//EN" "http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-datatypes-1.mod" > %MyML-datatypes.mod;

<!-- По умолчанию отключаем префиксы в этом модуле --> <!ENTITY % NS.prefixed "IGNORE" > <!ENTITY % MyML.prefixed "%NS.prefixed;" >

<!-- Объявляем действующее пространство имён этого модуля --> <!ENTITY % MyML.xmlns "http://www.example.com/xmlns/myml" >

<!-- Объявляем префикс по умолчанию для этого модуля --> <!ENTITY % MyML.prefix "myml" >

<!-- Если пространство имён этого модуля с префиксами --> <![%MyML.prefixed;[ <!ENTITY % MyML.pfx "%MyML.prefix;:" > ]]> <!ENTITY % MyML.pfx "" >

<!-- Объявляем Объект Параметра/Parameter Entity (PE), определяющий любое внешнее пространство имён, используемое этим модулем --> <!ENTITY % MyML.xmlns.extra.attrib "" >

<!-- Объявляем PE, определяющий атрибуты xmlns для использования в MyML. --> <![%MyML.prefixed;[ <!ENTITY % MyML.xmlns.attrib "xmlns:%MyML.prefix; %URI.datatype; #FIXED '%MyML.xmlns;' %MyML.xmlns.extra.attrib;" > ]]> <!ENTITY % MyML.xmlns.attrib "xmlns %URI.datatype; #FIXED '%MyML.xmlns;' %MyML.xmlns.extra.attrib;" >


<!-- Убедитесь, что атрибуты пространства имён MyML включены в набор атрибутов XHTML --> <![%NS.prefixed;[ <!ENTITY % XHTML.xmlns.extra.attrib "%MyML.xmlns.attrib;" > ]]> <!ENTITY % XHTML.xmlns.extra.attrib "" > <!-- Теперь объявим имена элементов -->

<!ENTITY % MyML.myelement.qname "%MyML.pfx;myelement" > <!ENTITY % MyML.myotherelement.qname "%MyML.pfx;myotherelement" >



Затем определим модуль, который определяет элементы и атрибуты, используя предоставляемый XHTML :

<!-- ...................................................................... --> <!-- Модуль My Elements ................................................... --> <!-- Файл myml-elements-1_0.mod

PUBLIC "-//MY COMPANY//ELEMENTS XHTML MyML Elements 1.0//EN" SYSTEM "http://example.com/DTDs/myml-elements-1_0.mod"

xmlns:myml="http://example.com/DTDs/myml-1_0.dtd" ...................................................................... -->

<!-- Модуль My Elements

myelement myotherelement

Этот модуль не делает ничего, кроме предоставления структуры для некоторого содержимого PCDATA. -->

<!ELEMENT %MyML.myelement.qname; ( #PCDATA | %MyML.myotherelement.qname; )* > <!ATTLIST %MyML.myelement.qname; myattribute CDATA #IMPLIED %MyML.xmlns.attrib; >

<!ELEMENT %MyML.myotherelement.qname; EMPTY > <!ATTLIST %MyML.myotherelement.qname; %MyML.xmlns.attrib; >

<!ENTITY % MyML.img.myattr.qname "%MyML.pfx;myattr" > <!ATTLIST %img.qname; %MyML.img.myattr.qname; CDATA #IMPLIED %MyML.xmlns.attrib; >

<!-- конец myml-elements-1_0.mod -->

Теперь построим описание модели содержимого, которое "прицепляет" новые элементы и атрибуты к другим элементам XHTML.

Следующий пример скопирован по образцу модели содержимого XHTML Basic, но является законченным самостоятельным модулем модели содержимого:

<!-- ...................................................................... --> <!-- Модуль MyML Model .................................................... --> <!-- Файл myml-model-1.mod



PUBLIC "-//MY COMPANY// ELEMENTS XHTML MyML Model 1.0//EN" SYSTEM "http://example.com/DTDs/myml-model-1_0.mod"

xmlns:myml="http://www.example.com/xmlns/myml" ...................................................................... -->

<!-- Определяем модель содержимого для Misc.extra --> <!ENTITY % Misc.class "| %MyML.myelement.qname; ">

<!-- .................... Инлайн-элементы ...................... -->

<!ENTITY % HeadOpts.mix "( %meta.qname; )*" >

<!ENTITY % I18n.class "" >

<!ENTITY % InlStruct.class "%br.qname; | %span.qname;" >

<!ENTITY % InlPhras.class "| %em.qname; | %strong.qname; | %dfn.qname; | %code.qname; | %samp.qname; | %kbd.qname; | %var.qname; | %cite.qname; | %abbr.qname; | %acronym.qname; | %q.qname;" >

<!ENTITY % InlPres.class "" >

<!ENTITY % Anchor.class "| %a.qname;" >

<!ENTITY % InlSpecial.class "| %img.qname; " >

<!ENTITY % Inline.extra "" >

<!-- %Inline.class; включает все инлайн-элементы, используемые вместе как компонент --> <!ENTITY % Inline.class "%InlStruct.class; %InlPhras.class; %InlPres.class; %Anchor.class; %InlSpecial.class;" >

<!-- %InlNoAnchor.class; включает все инлайн не-якоря, используемые вместе как компонент --> <!ENTITY % InlNoAnchor.class "%InlStruct.class; %InlPhras.class; %InlPres.class; %InlSpecial.class;" >

<!-- %InlNoAnchor.mix; включает все инлайн не-якоря --> <!ENTITY % InlNoAnchor.mix "%InlNoAnchor.class; %Misc.class;" >

<!-- %Inline.mix; включает все инлайн элементы, в том числе и %Misc.class; --> <!ENTITY % Inline.mix "%Inline.class; %Misc.class;" >

<!-- ..................... Элементы Блока ...................... -->

<!ENTITY % Heading.class "%h1.qname; | %h2.qname; | %h3.qname; | %h4.qname; | %h5.qname; | %h6.qname;" >



<!ENTITY % List.class "%ul.qname; | %ol.qname; | %dl.qname;" >

<!ENTITY % BlkStruct.class "%p.qname; | %div.qname;" >

<!ENTITY % BlkPhras.class "| %pre.qname; | %blockquote.qname; | %address.qname;" >

<!ENTITY % BlkPres.class "" >

<!ENTITY % Block.extra "" >

<!-- %Block.class; включает все элементы блока, используемые вместе как компонент --> <!ENTITY % Block.class "%BlkStruct.class; %BlkPhras.class; %BlkPres.class; %Block.extra;" >

<!-- %Block.mix; включает все элементы блока плюс %Misc.class; --> <!ENTITY % Block.mix "%Heading.class; | %List.class; | %Block.class; %Misc.class;" >

<!-- ................ Все Элементы Содержимого .................. -->

<!-- %Flow.mix; включает всё текстовое содержимое, уровня блока и инлайн --> <!ENTITY % Flow.mix "%Heading.class; | %List.class; | %Block.class; | %Inline.class; %Misc.class;" >

<!-- специальная модель содержимого для элемента pre --> <!ENTITY % pre.content "( #PCDATA | %Inline.class; )*" >

<!-- конец myml-model-1.mod -->

Наконец, используем предоставляемый XHTML для нового ОТД, изменённый соответствующим образом для нашего нового языка разметки:

<!-- ....................................................................... --> <!-- ОТД MYML ............................................................. --> <!-- Файл myml-1_0.dtd -->

<!-- Это драйвер ОТД для myml 1.0.

Используйте этот FPI для его идентификации:

"-//MY COMPANY//DTD XHTML MYML 1.0//EN"

А это пространство имён для уникальных элементов myml:

xmlns:myml="http://www.example.com/xmlns/myml" --> <!ENTITY % XHTML.version "-//MY COMPANY//DTD XHTML MYML 1.0//EN" >

<!-- резервируется для использования с профилями документа --> <!ENTITY % XHTML.profile "" >

<!-- Сообщаем каркасу об использовании нашего модуля квалифицированных имён как дополнительного драйвера qname --> <!ENTITY % xhtml-qname-extra.mod SYSTEM "myml-qname-1.mod" >



<!-- Определяем Модель Содержимого для использования каркасом --> <!ENTITY % xhtml-model.mod SYSTEM "myml-model-1.mod" >

<!-- Отключаем поддержку двунаправленного текста --> <!ENTITY % XHTML.bidi "IGNORE" >

<!-- Вводим в Каркас XHTML --> <!ENTITY % xhtml-framework.mod PUBLIC "-//W3C//ENTITIES XHTML Modular Framework 1.0//EN" "http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-framework-1.mod" > %xhtml-framework.mod;

<!-- Модуль Basic Text (необходим) ............................... --> <!ENTITY % xhtml-text.mod PUBLIC "-//W3C//ELEMENTS XHTML Basic Text 1.0//EN" "http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-text-1.mod" > %xhtml-text.mod;

<!-- Модуль Hypertext (необходим) ................................. --> <!ENTITY % xhtml-hypertext.mod PUBLIC "-//W3C//ELEMENTS XHTML Hypertext 1.0//EN" "http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-hypertext-1.mod" > %xhtml-hypertext.mod;

<!-- Модуль Lists (необходим) .................................... --> <!ENTITY % xhtml-list.mod PUBLIC "-//W3C//ELEMENTS XHTML Lists 1.0//EN" "http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-list-1.mod" > %xhtml-list.mod;

<!-- Модуль My Elements ........................................ --> <!ENTITY % MyML-elements.mod SYSTEM "myml-elements-1.mod" > %MyML-elements.mod;

<!-- Модуль XHTML Images ........................................ --> <!ENTITY % xhtml-image.mod PUBLIC "-//W3C//ELEMENTS XHTML Images 1.0//EN" "http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-image-1.mod" > %xhtml-image.mod;

<!-- Модуль Document Metainformation ............................ --> <!ENTITY % xhtml-meta.mod PUBLIC "-//W3C//ELEMENTS XHTML Metainformation 1.0//EN" "http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-meta-1.mod" > %xhtml-meta.mod;

<!-- Модуль Document Structure (необходим) ....................... --> <!ENTITY % xhtml-struct.mod PUBLIC "-//W3C//ELEMENTS XHTML Document Structure 1.0//EN" "http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-struct-1.mod" > %xhtml-struct.mod;


Содержание раздела