3.2. Elemek, címkék és tulajdonságok

Az SGML használatával készített dokumentumtípus-definíciók mindegyikének vannak közös jellemzői. Ez viszont aligha lesz számunkra meglepő, ahogy majd fokozatosan megismerkedünk az SGML kialakítása mögött álló alapvető gondolatokkal. Ezek közül a legkézenfekvőbbek a tartalom és az elem.

A dokumentáció minden esetben (legyen az most egy normál honlap vagy éppen egy vaskos könyv) rendelkezik valamilyen tartalommal, amelyet aztán tovább (esetleg még tovább) osztunk elemekre. A jelölők elhelyezésének ezen elemek határainak kijelölésében és elnevezésében van szerepe a feldolgozás későbbi szakaszaiban.

Ehhez példaként tekintsünk egy hagyományos könyvet. A legfelső szinten ez a könyv önmagában egy elemet képvisel. Ez a “könyv” elem aztán magától értetődő módon tartalmaz fejezeteket, amelyek szintén önálló elemeknek tekinthetőek. Minden ilyen fejezet további elemeket foglal magában, például bekezdéseket, idézeteket és lábjegyzeteket. Minden egyes bekezdésben találhatunk újabb elemeket, amelyek elárulják nekünk, hogy a bennük szereplő szövegben melyik részében beszélnek egymással a szereplők, vagy éppen hogy hívják az egyes karaktereket.

Az egészet úgy képzelhetjük el mint a tartalom “feldarabolását”. A legfelső szinten adott egy darab, maga a könyv. Ahogy haladunk kicsivel lentebb, újabb darabokat találunk, a fejezeteket. Ezeket aztán tovább bomlanak bekezdésekre, lábjegyzetekre, a karakterek neveire és a többi.

Meglepő, hogy az SGML lehetőségeinek igénybevétele nélkül milyen könnyen különbséget tudunk tenni az egyes elemek közt. Ehhez valójában elegendő a könyv nyomtatott változata, néhány különböző színű kiemelő, amelyekkel aztán bejelöljük a tartalom egyes részeit.

Sajnos a kiemelőknek nem létezik elektronikus változata, ezért találnunk kell valamilyen egyéb módot a tartalom egyes részeinek megjelölésére. Az SGML-ben megfogalmazott nyelvek (HTML, DocBook és társaik) ezt címkékkel oldják meg.

A címkékkel mondhatjuk meg hol kezdődnek és hol fejeződnek be az egyes elemek. A címke nem az elem része. Mivel a DTD általában azért készül, hogy a szövegben adott típusú információkat tudjunk jelölni, adott típusú elemeket fog elfogadni, ezért ezeknek megfelelően kell címkéket létrehoznunk.

Egy elem elemhez tartozó kezdőcímke általános alakja az <elem>. Az hozzátartozó zárócímke pedig az </elem>.

Példa 3-1. Elem (kezdő- és zárócímkék) használata

A HTML-ben a bekezdéseket a <p> (mint paragrafus) elemmel jelölhetjük. Ehhez az elemhez tartozik kezdő- és zárócímke.

<p>Ez egy bekezdés.  A 'p' elem kezdőcímkéjétől indul és a 'p'
  zárócímkéjénél fejezdődik be.</p>

<p>Ez meg egy másik bekezdés.  Ez viszont már rövidebb.</p>

Nem mindegyik elemnél kell zárócímkét használnunk, egyes elemekhez ugyanis nem járul semmilyen tartalom. Például egy HTML állományban jelölhetjük, hogy legyen a dokumentumban egy vízszintes elválasztó. Ehhez a vonalhoz értelemszerűen nem kapcsolódik tartalom, ezért elég egy kezdőcímkét beszúrni.

Példa 3-2. Elem (csak kezdőcímke) használata

A HTML-ben van egy <hr> nevű elem, amellyel vízszintes elválasztókat (horizontal rule) jelölhetünk. Ennek az elemnek nincs tartalma, ezért csak kezdőcímkével rendelkezik.

<p>Ez itt egy bekezdés.</p>

<hr>

<p>Ez pedig egy másik bekezdés.  Az előző bekezdéstől egy vízszintes
  vonal választja el.</p>

Ha eddig még nem sejtettük volna, megemlítjük, hogy az elemek természetesen elemeket is tartalmazhatnak. A korábbi könyves példánkban a könyv elem magában foglalta az összes fejezet elemet, amelyek pedig a bekezdés elemeket és így tovább.

Példa 3-3. Elemek elemekben, az <em> elem

<p>Ez egy egyszerű <em>bekezdés</em>, amelyben néhány <em>szót</em>
  szépen <em>kiemeltünk</em>.</p>

A DTD pontosan tartalmazza mely elemek tartalmazhatnak további elemeket, valamint az elemek egymásba ágyazhatóságának szabályait.

Fontos: Az emberek gyakran összetévesztik a címkéket az általuk jelölt elemekkel, és egymás szinonímájaként használják ezeket a kifejezéseket. Ez viszont helytelen.

A dokumentumokat elemekből építjük fel. Minden elem előre meghatározott módon kezdődik és fejeződik be. Az elemek kezdetét és végét címkék jelölik.

Amikor ez a dokumentum (vagy bárki, az SGML használatában járatos személy) “a <p> címkére” hivatkozik, akkor ez alatt a <, p, > karakterekből álló sorozatot érti. Ezzel szemben viszont “a <p>” a teljes elemre vonatkozik.

Ez egy nagyon kicsi eltérés, de mindig tartsuk észben!

Az elemeknek lehetnek tulajdonságaik. A tulajdonságokat nevek és értékek párosai alkotják, segítségükkel az elemhez fejthetünk ki további információkat. Ez lehet az adott elem által jelölt tartalom megjelenítésére vonatkozó utasítás, esetleg az elem valamilyen azonosítója vagy valami más.

Az elemek tulajdonságait mindig az adott elem kezdőcímkéjén belül soroljuk fel, tulajdonság="érték" alakban.

A HTML újabb változataiban például a <p> elemnek van egy <align> tulajdonsága, amely a HTML megjelenítése során javasolja, hogy az általa jelölt bekezdést merre igazítsuk.

Ez az <align> tulajdonság négy előre meghatározott érték valamelyikét kaphatja meg: left (balra zárt), center (középre zárt), right (jobbra zárt) és justify (sorkizárt). Ha nem adjuk meg a tulajdonság értékét a kezdőcímkében, akkor alapértelmezés szerint left lesz.

Példa 3-4. Tulajdonság használata elemben

<p align="left">Az 'align' tulajdonság ebben a bekezdésben igazából
  teljesen felesleges, hiszen alapértelmezés szerint is balra zárt
  lenne.</p>

<p align="center">Ennek viszont már középre kellene kerülnie.</p>

Egyes tulajdonságok csak adott értékeket vehetnek fel, mint például left vagy justify, másoknál viszont lényegében bármit megadhatunk. Ha a tulajdonság értékének megfogalmazása során idézőjeleket (") is használni akarunk, akkor az egész kifejezést tegyük egyszeres idézőjelbe.

Példa 3-5. A tulajdonságok értékének megadása egyszeres idézőjellel

<p align='right'>Jobbra zárt!</p>

Előfordulhat, hogy az érték megadásakor egyáltalán nem kell semmilyen idézőjelet használni. Ennek szabályai viszont nagyon halványak, ezért sokkal egyszerűbb mindig idézőjelbe tenni a tulajdonságok értékeit.

Az elemekhez, címkékhez és tulajdonságokhoz tartozó információk SGML katalógusokban kerülnek tárolásra. A Dokumentációs Projektben használt eszközök ilyen katalógusok mentén nézik át a munkánkat. A textproc/docproj csomagban a segédprogramok mellett rengeteg ilyen SGML-katalógust találhatunk. A FreeBSD Dokumentációs Projektnek is vannak saját katalógusai. Az alkalmazott eszközöknek mind a két fajta katalógusokat ismerniük kell.

3.2.1. Egy kis gyakorlás...

A szakaszban szereplő példák kipróbálásához telepítenünk kell bizonyos szoftvereket, illetve beállítani egy környezeti változó értékét.

  1. Töltsük le és telepítsük a textproc/docproj portot a FreeBSD Portgyűjteményéből. Ez portoknak a portja, tehát egy metaport, így a Dokumentációs Projektben használt összes eszköz rajta keresztül letöltődik és telepítődik.

  2. A parancssorunk konfigurációs állományában állítsuk be az SGML_CATALOG_FILES környezeti változó értékét. (Amennyiben nem az angol nyelvű dokumentációval dolgozunk, itt érdemes a nyelvünknek megfelelő könyvtárakat megadni.)

    Példa 3-6. Minta .profile állomány sh(1) és bash(1) parancssorokhoz

    SGML_ROOT=/usr/local/share/sgml	    
    SGML_CATALOG_FILES=${SGML_ROOT}/jade/catalog
    SGML_CATALOG_FILES=${SGML_ROOT}/docbook/4.1/catalog:$SGML_CATALOG_FILES
    SGML_CATALOG_FILES=${SGML_ROOT}/html/catalog:$SGML_CATALOG_FILES
    SGML_CATALOG_FILES=${SGML_ROOT}/iso8879/catalog:$SGML_CATALOG_FILES
    SGML_CATALOG_FILES=/usr/doc/share/sgml/catalog:$SGML_CATALOG_FILES
    SGML_CATALOG_FILES=/usr/doc/en_US.ISO8859-1/share/sgml/catalog:$SGML_CATALOG_FILES
    export SGML_CATALOG_FILES

    Példa 3-7. Minta .cshrc állomány csh(1) és tcsh(1) parancssorokhoz

    setenv SGML_ROOT /usr/local/share/sgml
    setenv SGML_CATALOG_FILES ${SGML_ROOT}/jade/catalog
    setenv SGML_CATALOG_FILES ${SGML_ROOT}/docbook/4.1/catalog:$SGML_CATALOG_FILES
    setenv SGML_CATALOG_FILES ${SGML_ROOT}/html/catalog:$SGML_CATALOG_FILES
    setenv SGML_CATALOG_FILES ${SGML_ROOT}/iso8879/catalog:$SGML_CATALOG_FILES
    setenv SGML_CATALOG_FILES /usr/doc/share/sgml/catalog:$SGML_CATALOG_FILES
    setenv SGML_CATALOG_FILES /usr/doc/en_US.ISO8859-1/share/sgml/catalog:$SGML_CATALOG_FILES

    A módosítások elvégzése után vagy jelentkezzük ki majd be, vagy pedig adjuk ki a közvetlenül parancssorban az adott parancsokat.

  1. Hozzunk létre egy próba.sgml nevű állományt, és írjuk bele az alábbi szöveget:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    
    <html>
      <head>
        <title>Próba HTML állomány</title>
      </head>
    
      <body>
        <p>Ebben a bekezdésben legyen valamennyi szöveg.</p>
    
        <p>Az utána következő bekezdésbe is rakjunk még valamennyi szöveget.</p>
    
        <p align="right">Ennek a bekezdésnek jobbra zártnak kellene lennie.</p>
      </body>
    </html>
  2. Próbáljuk meg az állományt érvényesíteni valamelyik SGML elemezővel.

    A textproc/docproj csomagnak része az nsgmls nevű érvényesítést végző elemező. Az nsgmls beolvas egy tetszőleges SGML DTD szerint definiált elemekkel jelölt dokumentumot és ebből elkészíti a hozzátartozó elemstruktúra-információs halmazt (Element Structure Information Set, ESIS, de ezzel itt most nem foglalkozunk).

    Ha viszont az nsgmls parancsnak megadjuk a -s paramétert, akkor nem generál tényleges eredményt, csupán a hibaüzenetek jeleníti meg. Ennek köszönhetően könnyen ellenőrizni tudjuk, hogy az általunk készített dokumentum érvényes vagy sem.

    Az nsgmls parancs használatával tehát ellenőrizzük az imént létrehozott dokumentumunk érvényességét:

    % nsgmls -s próba.sgml

    Láthatjuk, hogy az nsgmls nem jelez semmiféle hibát, ami azt jelenti, hogy a dokumentumunk valóban érvényes.

  3. Nézzük meg mi történik akkor, ha kihagyjuk a kötelező elemeket. Töröljük például a <title> és </title> címkéket, majd próbáljuk meg újra az érvényesítést.

    % nsgmls -s próba.sgml
    nsgmls:próba.sgml:5:4:E: character data is not allowed here
    nsgmls:próba.sgml:6:8:E: end tag for "HEAD" which is not finished

    Az nsgmls által generált hibaüzenetek kettőspontokkal tagolt csoportokba vagy oszlopokba sorolhatóak.

    OszlopJelentés
    1A hibát jelző program neve. Ez minden esetben az nsgmls.
    2A hibát tartalmazó állomány neve.
    3A hibát tartalmazó sor száma.
    4A hibát tartalmazó oszlop száma.
    5A generált üzenet jellegét megadó egybetűs kód. Az I információt, a W figyelmeztetést, az E hibát [a], végül pedig az X a kereszthivatkozást jelez. Ebből megállapítható, hogy az iménti üzenetek hibákra vonatkoznak.
    6Az üzenet szövege.
    Megjegyzések:
    a. Ez nem minden esetben az ötödik oszlopban szerepel. Az nsgmls -sv például az nsgmls:I: SP version "1.3" üzenetet adja vissza (a tényleges verziójától függően). Ez például egy információs üzenet.

    Egyedül a <title> címke elhagyásával két különböző hibát kaptunk.

    Ezek közül az első jelzi, hogy az SGML elemző olyan helyen találkozott tartalommal (amely ebben esetben konkrétan karaktereket jelent és nem az elemet bevezető kezdőcímkét), ahol valami másra számított. Az elemző itt ugyanis valamelyik, a <head> elemen belül szabályosan elhelyezhető elem kezdőcímkéjét várja (amilyen például a <title>).

    A második hibát pedig azért kaptuk, mert a <head> elemeknek tartalmazniuk kell <title> elemet. Az nsgmls ezt azonban nem ebben a formában közli: mivel az elemet még a befejeződése (tehát a <title> megemlítése) előtt lezártuk, szerinte egyszerűen csak nem ért véget rendesen.

  4. Tegyük vissza a <title> elemet.

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