3.8 Маркирани секции

SGML има механизъм за отбелязване, че определени части от документа трябва да бъдат обработени по специален начин. Това са ``маркираните секции''.

Example 3-14. Структура на маркираните секции

<![ KEYWORD [
  Contents of marked section
]]>

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

Първата квадратна скоба разделя маркираната секция.

KEYWORD описва как маркираната секция трябва да бъде обработена от парсера.

Втората квадратна скоба показва, че съдържанието на маркираната секция започва.

Маркираната секция завършва със затваряне на двете квадратни скоби и връщане на контекста към SGML с >

3.8.1 Ключови думи за маркирани секции

3.8.1.1 CDATA, RCDATA

Тези ключови думи обозначават модела на съдържанието и позволяват да го промените от подразбиращото се.

Когато SGML парсер обработва документ, той следи за т.нар. ``модел на съдържанието''.

Накратко, този модел описва какъв тип съдържание парсера очаква да види и какво да прави, когато го намери.

Двата модела на съдържание, които вероятно ще намерите за полезни са CDATA и RCDATA.

CDATA е за ``Символни данни''. Ако парсера е в този модел, тогава се очаква да види символи и единствено символи. В този модел < и & символи губят тяхното специално значение и ще бъдат третирани като обикновени символи.

RCDATA е ``Обръщения към етикети и символни данни''. Ако парсера е в този модел, той очаква да види символи и етикети. < губи специалното си значение, но & ще бъде третиран като начало на общ етикет.

Това е полезно ако включвате дословно текст съдържащ много < и & символи. Бихте могли да проследите целия текст и да се уверите, че всеки < е конвертиран в &lt; и всеки & е конвертиран в &amp;, но би било по-лесно да маркирате цялата секция като съдържаща CDATA. Когато SGML парсера срещне това, ще игнорира < и & символите в съдържанието.

Note: Когато използвате CDATA или RCDATA в примери с текст маркиран в SGML имайте в предвид, че съдържанието на CDATA не е валидизирано. Трябва да проверите вмъкнатия SGML текст използвайки нещо друго. Бихте могли, например, да напишете примера в друг документ, да го валидизирате и тогава да го вмъкнете с paste в съдържанието на CDATA.

Example 3-15. Пример за използване на CDATA маркирана секция

<para>Here is an example of how you would include some text
  that contained many &lt; and &amp; symbols.  The sample
  text is a fragment of HTML.  The surrounding text (<para> and
  <programlisting>) are from DocBook.</para>

<programlisting>
  <![ CDATA [  
    <p>This is a sample that shows you some of the elements within
      HTML.  Since the angle brackets are used so many times, it is
      simpler to say the whole example is a CDATA marked section
      than to use the entity names for the left and right angle
      brackets throughout.</p>

    <ul>
      <li>This is a listitem</li>
      <li>This is a second listitem</li>
      <li>This is a third listitem</li>
    </ul>

    <p>This is the end of the example.</p>
  ]]>
</programlisting>

Ако можете да видите сорс кода на този документ ще видите, че тази техника се използва широко.

3.8.1.2 INCLUDE и IGNORE

Ако ключовата дума е INCLUDE тогава съдържанието на маркираната секция ще бъде обработено. Ако ключовата дума е IGNORE тогава маркираната секция ще бъде игнорирана и няма да бъде обработена. Няма да се появи в резултатния документ.

Example 3-16. Използване на INCLUDE и IGNORE в маркирани секции

<![ INCLUDE [
  This text will be processed and included.
]]>

<![ IGNORE [
  This text will not be processed or included.
]]>

Само по себе си това не е много полезно. Ако искате да премахнете текст от документ, бихте могли просто да го изрежете с cut или да го покриете в коментари.

Става интересно, когато откриете, че можете да използвате параметрични етикети за да контролирате това. Не забравяйте, че параметричните етикети могат да бъдат използвани само в SGML съдържание, а ключова дума в маркирана секция е SGML съдържание.

Например, да допуснем, че искате печатно и електронно копие на документация. В електронната версия искате да включите съдържание, което да не съществува в печатната версия.

Създайте параметричен етикет и сложете стойността му като INCLUDE. Напишете документ използвайки маркирана секция за да разделите съдържанието, което трябва да бъде включено само в електронната версия. В тези маркирани секции използвайте параметрични етикети на мястото на ключовата дума.

Когато искате да генерирате печатна версия на документа, променете стойността на параметричния етикет на IGNORE и генерирайте документа.

Example 3-17. Използване на параметричен етикет за контролиране на маркирана секция

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

...

<![ %electronic.copy [
  This content should only appear in the electronic
  version of the document.
]]>

Когато генерирате печатна версия, променете дефиницията на етикета, както следва;

<!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>An example using marked sections</title>
      </head>
    
      <body>     
        <p>This paragraph <![ CDATA [contains many <
          characters (< < < < <) so it is easier
          to wrap it in a CDATA marked section ]]></p>
    
        <![ IGNORE [
        <p>This paragraph will definitely not be included in the
          output.</p>
        ]]>
    
        <![ %text.output [
        <p>This paragraph might appear in the output, or it
          might not.</p>
    
        <p>Its appearance is controlled by the %text.output
          parameter entity.</p>      
        ]]>
      </body>
    </html>
    
  2. Нормализирайте този файл с помощта на sgmlnorm(1) и разгледайте резултата. Обърнете внимание кои параграфи са там и кои са изчезнали, както и какво е станало със съдържанието на CDATA маркираната секция.

  3. Променете дефиницията на text.output етикет от INCLUDE на IGNORE. Нормализирайте отново файла и разгледайте резултата.

Този и други документи можете да намерите в ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

За въпроси отностно FreeBSD, прочетете документацията преди да попитате в <questions@FreeBSD.org>.
За въпроси отностно този документ, e-mail <doc@FreeBSD.org>.