A FreeBSD Dokumentációs Projekt irányelvei kezdőknek
Előző | Fejezet 3. SGML alapismeretek | Következő

# 3.6. Egyedek

Az egyedek felhasználásával neveket tudunk rendelni a tartalom egyes darabjaihoz. Az SGML elemző a dokumentum feldolgozása közben ezeket az egyedeket megtalálja és helyükre beszúrja az általuk hivatkozott tartalmat.

Ezzel az SGML dokumentumokban könnyedén ki tudunk alakítani újrafelhasználható, gyorsan cserélhető tartalmat, illetve kizárólag ezen a módon lehet jelölőkkel ellátott SGML állományokat beletenni egy másik hasonló SGML állományba.

Az egyedek kétfajta típusa létezik, amelyek mindegyike eltérő helyzetekben használható: ezek az általános egyedek és a paraméteregyedek.

## 3.6.1. Általános egyedek

Általános egyedeket nem lehet SGML környezetben használni (habár definiálni igen), egyedül magában a dokumentumban. Vessük össze a paraméteregyedekkel.

Mindegyik általános egyed rendelkezik egy névvel. Így tudunk hivatkozni egy általános egyedre (ezáltal mindarra a szövegre, amelyet képvisel a dokumentumunkban): `&`egyednév`;`. Vegyük például, hogy van egy `jelenlegi.valtozat` nevű egyedünk, amely a termékünk jelenlegi verziószámát helyettesíti be a szövegbe. Ezt így fogalmaznánk meg:

    <para>A termékünk jelenlegi változata a(z)
      &jelenlegi.valtozat;.</para>

Így a verziószám változásakor egyszerűen csupán az általános egyed definícióját kell megváltoztatni, majd újra feldolgozni a dokumentumot.

Az általános egyedek segítségével olyan karakterek is megadhatóvá válnak, amelyeket egyébként nem tudnánk SGML dokumentumokban leírni. Például a `<` és a `&` normális esetben nem lehet része SGML dokumentumoknak. Amikor ugyanis az SGML elemző egy `<` szimbólumot észlel, feltételezi, hogy ezzel egy (kezdő- vagy záró) címke kezdődik, illetve amikor pedig egy `&` szimbólumot talál, akkor a következő lépésben egy egyed nevét várja.

Szerencsére ezek a szimbólumok a szövegben bármikor kiválthatóak az `&lt;` és `&amp;` általános egyedek használatával.

Általános egyedek csak SGML környezetben definiálhatóak. Ezeket általában közvetlenül a DOCTYPE deklaráció után sorolják fel.

Példa 3-10. Általános egyedek definíciója

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
    <!ENTITY jelenlegi.valtozat    "3.0-RELEASE">
    <!ENTITY legutolso.valtozat    "2.2.7-RELEASE">
    ]>

Figyeljük meg, hogy a DOCTYPE deklarációt a sor végén egy szögletes nyitó zárójel elhelyezésével kibővítettük: a kiegészítésként felvett két egyedet az utána következő két sorban definiáltuk, majd bezártuk a szögletes zárójelet és DOCTYPE deklarációt.

A szögletes zárójelek szükségesek ahhoz, hogy jelezzük a DOCTYPE deklarációban megadott DTD további kiegészítéseit.

## 3.6.2. Paraméteregyedek

Az általános egyedekhez hasonlóan a paraméteregyedek is újrafelhasználható szövegrészek elnevezését engedik meg. Miközben azonban az általános egyedek csak a dokumentumokban alkalmazhatóak, addig a paraméteregyedek csak SGML környezetekben használhatóak.

A paraméteregyedek az általános egyedekhez hasonló módon definiálhatóak, az `&`egyednév`;` felírás helyett azonban az `%`egyednév`;` alakban tudunk rájuk hivatkozni. Továbbá a definíciójukban az `ENTITY` kulcsszó és az egyed neve közé be kell szúrni a `%` (százalékjel) szimbólumot.

Példa 3-11. Paraméteregyedek megadása

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
    <!ENTITY % param.valami "valami">
    <!ENTITY % param.szoveg "szöveg">
    <!ENTITY % param.uj  "%param.valami más %param.szoveg">

    <!-- A %param.uj értéke most már "valami más szöveg" -->
    ]>

Ez most még nem tűnik különösebben hasznosnak. Később viszont majd az lesz.

## 3.6.3. Egy kis gyakorlás...

1. Tegyük bele a `próba.sgml` állományunkba a következő általános egyedet:

       <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" [
       <!ENTITY valtozat "1.1">
       ]>

       <html>
         <head>
           <title>Egy minta HTML állomány</title>
         </head>

         <!-- Az állományba rakhatunk azért még megjegyzéseket -->

         <body>
           <p>Ebben a bekezdésben van egy kis szöveg.</p>

           <p>Ez a bekezdés még tartalmaz némi szöveget.</p>

           <p align="right">Ennek a bekezdésnek jobbra zártnak kellene lennie.</p>

           <p>A dokumentum jelenlegi változata: &valtozat;</p>
         </body>
       </html>

2. Az `nsgmls` használatával vizsgáltassuk meg a dokumentum érvényességét.

3. Töltsük be a `próba.sgml` állományt a böngészőnkbe (előfordulhat, hogy másolatot kell készíteni róla `próba.html` néven, mert a böngészőnk csak így ismerné fel HTML dokumentumként).

   Hacsak a böngészőnk nem annyira fejlett, a dokumentumban a `&valtozat;` egyedhivatkozás nem fog lecserélődni a verziószámra. A böngészők többségében nagyon primitív elemzők találhatóak, amelyek nem képesek rendesen kezelni az SGML dokumentumokat[1].

4. A megoldást a dokumentum normalizálása jelenti, amelyet egy SGML normalizálóval tudunk elvégezni. A normalizáló beolvas egy érvényes SGML állományt és eredményként egy szintén érvényes, de valamilyen módon átalakított SGML állományt készít. Az SGML állományok átalakításának egyik ilyen módja a dokumentumban található egyedhivatkozások helyettesítése az általuk képviselt szöveggel.

   Erre a célra az `sgmlnorm` használható.

       % sgmlnorm próba.sgml > próba.html

   Ennek hatására `próba.html` néven létrejön a dokumentum normalizált (vagyis a kifejtett egyedhivatkozásokkal létrehozott) változata, és most már betölthető a böngészőnkbe.

5. Ha most megnézzük az `sgmlnorm` által gyártott végeredményt, akkor tapasztalhatjuk, hogy az elején nem szerepel DOCTYPE deklaráció. Ezt a `-d` kapcsolóval tehetjük hozzá:

       % sgmlnorm -d próba.sgml > próba.html

### Megjegyzések

[1] | Micsoda szégyen! Képzeljük csak el, mennyi gondot és ügyeskedést (mint például a szerver oldalán beemelt állományokat) el tudnánk kerülni, ha rendesen támogatnák.

Előző | Tartalom | Következő
Megjegyzések | Fel | Állományok tartalmának elérése egyedeken keresztül

Ha kérdése van a FreeBSD-vel kapcsolatban, a következő címre írhat (angolul): <freebsd-questions@FreeBSD.org>.
Ha ezzel a dokumentummal kapcsolatban van kérdése, kérjük erre a címre írjon: <gabor@FreeBSD.org>.