3.6 Етикети

Етикетите са механизъм за именуване на част от съдържание. Когато SGMl парсер обработва документ, всички етикети които намери ще бъдат заменени със съдържанието на етикета.

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

Има два типа етикети които могат да бъдат използвани в две различни ситуации; общи етикети и параметрични етикети.

3.6.1 Общи етикети

Не можете да използвате общи етикети в SGML контекст. Те могат да се използват само в документ. Сравнете това с параметрични етикети.

Всеки общ етикет има име. Когато искате да се обърнете към общ етикет (и като резултат да включите текста, който той представлява в документа) трябва да напишете &име на етикета ;. Например, да допуснем, че имате етикет наречен current.version, който ще вмъкне текущата версия на продукта ви. Можете да напишете;

<para>Текущата верси&#255; на наши&#255;т продукт е
      &current.version;.</para>

При промяна на номера на версията можете просто да смените дефиницията на стойността на общият етикет и да обработите документа си.

Можете да използвате общи етикети за да въведете символи, които иначе не бихте могли да включите в SGML документ. Например, < и & не могат нормално да съществуват в SGML документ. Когато SGML парсер види < символ той предполага, че ще се появи маркер (начален или краен), когато види & символ той предполага, че следващият текст е име на етикет.

Все пак бихте могли да използвате двата общи етикета &lt; и &amp; когато е необходимо да включите един или друг от тях.

Общ етикет може да бъде дефиниран само в SGML контекст. Обикновенно, това се прави веднага след DOCTYPE декларацията.

Example 3-10. Дефиниране на общи етикети

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
<!ENTITY current.version    "3.0-RELEASE">
<!ENTITY last.version       "2.2.7-RELEASE">
]>

Забележете как DOCTYPE декларацията е разширена чрез добавянето на квадратна скоба в края на първата линия. Двата етикета са дефинирани в следващите две линии, преди квадратната скоба да се затвори, след това се затваря DOCTYPE декларацията.

Квадратните скоби са необходими за да покажат, че ние разширяваме DTD указан от DOCTYPE декларацията.

3.6.2 Параметрични етикети

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

Параметричните етикети се дефинират по подобен на общите начин. Вместо &име-на-етикет; се използва %име-на-етикет;[1]. Дефиницията включва % между ключовата дума ENTITY и името на етикета.

Example 3-11. Дефиниране на параметрични етикети

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
<!ENTITY % param.some "some">
<!ENTITY % param.text "text">
<!ENTITY % param.new  "%param.some more %param.text">

<!-- %param.new now contains "some more text" -->
]>

Това може и да не изглежда особено полезно. Ще видите, че е.

3.6.3 За упражнение...

  1. Добавете общ етикет в example.sgml.

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" [
    <!ENTITY version "1.1">
    ]>    
    
    <html>
      <head>         
        <title>An example HTML file</title>
      </head>
    
      <!-- You might well have some comments in here as well -->
          
      <body>        
        <p>This is a paragraph containing some text.</p>
    
        <p>This paragraph contains some more text.</p>
    
        <p align="right">This paragraph might be right-justified.</p>
    
        <p>The current version of this document is: &version;</p>     
      </body>       
    </html>
    
  2. Валидизирайте документа с помощта на nsgmls(1)

  3. Заредете example.sgml във вашия уеб браузер (може да е необходимо да го копирате в example.html преди браузера да го разпознае като HTML документ).

    Освен ако браузера ви е твърде съвременен, няма да видите обръщението към етикета &version; заменено с номера на версията. Повечето браузери имат много опростени парсери, които няма да се справят с истински SGML.[2].

  4. Решението е да нормализирате документа използвайки SGML нормализатор. Нормализатора прочита валиден SGML файл и връща еднакво валиден SGML, които е променен по определен начин. Един от начините по които нормализатора променя документа е да замени всички етикети към които има обръщения в документа с текста който те представят.

    Можете да използвате sgmlnorm(1) за да направите това.

    % sgmlnorm example.sgml > example.html
    

    Ще намерите нормализираната версия (т.е. със заменени обръщения) на документа в example.html готова за зареждане в браузер.

  5. Ако прегледате резултата от sgmlnorm(1) ще видите, че той не включва DOCTYPE декларация в началото. За да накарате нормализатора да я включи, трябва да използвате -d опция;

    % sgmlnorm -d example.sgml > example.html
    

Notes

[1]

Параметричните етикети използват Процент.

[2]

Това е срамота. Представете си всичките проблеми (като Server Side Includes), които биха били предотвратени ако браузерите бяха коректни.

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

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