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.

3.10. példa - Á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.

3.11. példa - 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">

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.xml á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>
    
      <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 onsgmls használatával vizsgáltassuk meg a dokumentum érvényességét.

  3. Töltsük be a próba.xml á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 osgmlnorm használható.

    % osgmlnorm próba.xml > 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 osgmlnorm á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á:

    % osgmlnorm -d próba.xml > próba.html


[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.

Ha kérdése van a FreeBSD-vel kapcsolatban, a következő címre írhat (angolul): <questions@FreeBSD.org>.

Ha ezzel a dokumentummal kapcsolatban van kérdése, kérjük erre a címre írjon: <gabor@FreeBSD.org>.