3.8. Отмеченные разделы

SGML дает механизм для отметки отдельных частей документа, которые должны быть обработаны особым образом. Это называется ''пометкой разделов''.

Пример 3-14. Структура отмеченного раздела

<![ KEYWORD [
  Содержимое отмеченного раздела
]]>

Как вы и ожидали, являясь конструкцией SGML, помеченный раздел начинается с <!.

Первая квадратная скобка отмечает начало помеченного раздела.

KEYWORD указывает на то, как этот помеченный раздел должен быть обработан анализатором.

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

Помеченный раздел заканчивается двумя закрывающимися квадратными скобками, и затем выполняется переключение с SGML на контекст документа при помощи знака >

3.8.1. Ключевые слова помеченного раздела

3.8.1.1. CDATA, RCDATA

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

Когда анализатор SGML обрабатывает документ, он отслеживает так называемую ''модель содержимого''.

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

Скорее всего, наиболее полезными для вас окажутся две модели содержимого, CDATA и RCDATA.

CDATA означает ''Character Data'' (символьные данные). Если анализатор находится в этой модели содержимого, то он ожидает символы, и только символы. В этой модели символы < и & теряют свой особый смысл и будут интерпретироваться как обычные символы.

RCDATA означает ''Entity references and character data'' (ссылки на сущности и символьные данные). Если анализатор находится в этой модели содержимого, то будут ожидаться символы и сущности. < теряет свой особый статус, но & все же будет восприниматься как начало сущности общего назначения.

В частности, это полезно, если вы включаете без изменений некоторый текст, который содержит много символов < и &. Хотя вы можете просмотреть весь текст и проверить, что все < преобразованы в &lt;, а все & заменены на &amp;, может быть легче отметить раздел как содержащий только CDATA. Когда анализатор SGML встретит это, он будет игнорировать символы < и &, присутствующие в содержимом.

Когда Вы используете CDATA или RCDATA из примеров, помните о том, что содержимое CDATA не проверяется на правильность. Вы должны проверить его другим способом. Например, Вы можете написать пример в другом документе, проверить его, а потом скопировать его в Вашу область CDATA.

Пример 3-15. Использование разделов, помеченных как CDATA

<para>Вот пример того, как вы должны включать
  некоторый текст, содержащий множество символов &lt; и &amp;.  Текст
  в примере является фрагментом HTML.  Окружающие текст (<para> и
  <programlisting>) из DocBook.</para>

<programlisting>
  <![ CDATA [  
    <p>Это пример, показывающий вам некоторые элементы HTML.  Так как угловые
      скобки используются так часто, то проще всего указать, что весь пример
      является разделом, помеченным как CDATA, чем использовать имена сущностей
      для левых и правых угловых скобок по всему тексту.</p>

    <ul>
      <li>Это элемент списка</li>
      <li>Это второй элемент списка</li>
      <li>Это третий элемент списка</li>
    </ul>

    <p>Это конец примера.</p>
  ]]>
</programlisting>

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

3.8.1.2. INCLUDE и IGNORE

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

Пример 3-16. Использование INCLUDE и IGNORE в помеченных разделах

<![ INCLUDE [
  Этот текст будет обработан и включен.
]]>

<![ IGNORE [
  Этот текст не будет обработан и включен.
]]>

Само по себе это не очень полезно. Если вы захотите удалить текст из вашего документа, вы можете его вырезать или поместить в комментарии.

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

Например, положим, что вы создаете твердую копию некоторой документации и ее электронную версию. В электронной версии вы хотите включить некоторое дополнительное содержимое, которого не было в бумажной версии.

Создайте параметризованную сущность, и установите ее значение в INCLUDE. Напишите ваш документ с использованием помеченных разделов для отделения содержимого, который должен быть только в электронной версии. В этих помеченных разделах используйте параметризованную сущность на месте ключевого слова.

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

Пример 3-17. Использование параметризованной сущности для управления помеченным разделом

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
<!ENTITY % electronic.copy "INCLUDE">    
]]>

...

<![ %electronic.copy [
  Этот текст должен появиться только в электронной
  версии документа.
]]>

При создании версии для печати измените определение сущности на следующее;

<!ENTITY % electronic.copy "IGNORE">

При повторной обработке документа помеченные разделы, которые используют %electronic.copy в качестве ключевого слова, будут проигнорированы.

3.8.2. Упражнения...

  1. Создайте новый файл, section.sgml, в котором содержится следующее;

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
    <!ENTITY % text.output "INCLUDE">
    ]>
    
    <html>
      <head>
        <title>Пример использования помеченных разделов</title>
      </head>
    
      <body> 
        <p>Этот параграф <![ CDATA [содержит много символов <
          (< < < < <), так что проще заключить его в раздел,
          помеченный как CDATA ]]></p>
    
        <![ IGNORE [
        <p>Этот параграф определенно не будет включен в выходной
          документ.</p>
        ]]>
    
        <![ %text.output [
        <p>Этот параграф может быть включен в выходной документ, а может там и
          не оказаться.</p>
    
        <p>Его появление контролируется параметризованной сущностью
          %text.output.</p>  
        ]]>
      </body>
    </html>
    
  2. Выполните нормализацию этого файла при помощи sgmlnorm(1) и проверьте выходной документ. Отметьте, какие параграфы появились, какие исчезли, и что случилось с содержимым раздела, помеченного как CDATA.

  3. Измените определение сущности text.output с INCLUDE на IGNORE. Повторно выполните нормализацию файла и посмотрите, что изменилось в выходном документе.

Этот, и другие документы, могут быть скачаны с ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

По вопросам, связанным с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите <doc@FreeBSD.org>.
По вопросам, связанным с русским переводом документации, пишите в рассылку <frdp@FreeBSD.org.ua>.
Информация по подписке на эту рассылку находится на сайте проекта перевода.