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

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

   Oszlop | Jelentés
   --- | ---
   1 | A hibát jelző program neve. Ez minden esetben az `nsgmls`.
   2 | A hibát tartalmazó állomány neve.
   3 | A hibát tartalmazó sor száma.
   4 | A hibát tartalmazó oszlop száma.
   5 | A 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.
   6 | Az ü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.

Előző | Tartalom | Következő
SGML alapismeretek | Fel | A DOCTYPE deklarációk

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