[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]


133. Dichiarazione SGML

Fino a questo punto è stata ignorata la dichiarazione SGML, che in generale non dovrebbe essere un problema per l'utilizzatore, ma rappresenta pur sempre un elemento determinante per la comprensione della filosofia di questo linguaggio.

La dichiarazione SGML è qualcosa che viene prima del DTD; serve a definire la forma del sorgente e alcune caratteristiche del linguaggio utilizzato. Attraverso la dichiarazione si possono modificare molti comportamenti convenzionali, facendo anche cambiare aspetto notevolmente al linguaggio stesso. Tutto quello che è stato descritto di SGML nei capitoli precedenti, fa affidamento sulla dichiarazione SGML raccomandata, ma volendo si potrebbero cambiare molte cose. Per fare un esempio pratico, XML può essere inteso come un modo di utilizzare SGML in base a una dichiarazione particolare, realizzata per le esigenze specifiche della pubblicazione di documentazione attraverso la rete.

La dichiarazione SGML si fa generalmente in un file apposito; tutte le direttive sono contenute all'interno di un'istruzione sola del tipo seguente:

<!SGML "ISO 8879:1986"
...
...
...
>

In pratica, nel modello mostrato, le direttive occupano il posto dei puntini di sospensione.

Si osservi che lo standard originale ISO prevedeva la definizione `8879-1986', che successivamente è stata modificata nel modo mostrato, ovvero `8879:1986'. Lo stesso ragionamento vale per gli altri standard ISO che prevedono l'indicazione dell'anno.

Esiste una variante recente allo standard ISO 8879:1996 e precisamente si tratta di cambiamenti pensati per facilitare la comunicazione attraverso la rete. La stringa che fa riferimento a questo standard esteso è:

"ISO 8879:1986 (WWW)"

La si ritrova in particolare nella dichiarazione dell'HTML 4.* e nell'XML.

In questo capitolo vengono mostrate solo alcune direttive che possono essere utili per capire il senso della dichiarazione SGML. Per approfondire lo studio di questo linguaggio, bisogna procurarsi la documentazione originale ISO.

133.1 Codifica

La codifica dei caratteri utilizzata nel sorgente SGML non può essere ignorata, soprattutto perché alcuni codici hanno significati speciali che vanno oltre il carattere vero e proprio. Le direttive riferite alla codifica del sorgente iniziano con la parola chiave `CHARSET' che delimita la sezione relativa:

CHARSET
    <definizione-riferita-all'insieme-di-caratteri>
    ...

In generale, si inizia con la definizione di un insieme standard di riferimento, attraverso l'uso di un identificatore standard:

BASESET <insieme-di-caratteri>

L'identificatore che definisce lo standard è normalmente una stringa abbastanza dettagliata. L'esempio seguente definisce l'insieme di partenza corrispondente all'ISO 646:1983, ovvero all'ASCII tradizionale:

    BASESET	"ISO 646:1983//CHARSET
		International Reference Version (IRV)//ESC 2/5 4/0"

La direttiva appare su due righe, ma si tratta solo di una possibilità e non di una necessità, tanto che in alcuni casi la si può vedere anche distribuita su tre righe. Dopo la definizione dell'insieme di partenza, si può descrivere nel dettaglio l'utilizzo e la conversione dei codici corrispondenti ai caratteri:

    DESCSET
	<inizio>  <quantità>  {<corrispondenza>|UNUSED}
	...

Si osservi l'esempio:

    DESCSET
	  0  9 UNUSED
          9  2  9
         11  2 UNUSED
         13  1 13
         14 18 UNUSED
         32 95 32
        127  1 UNUSED

Il primo numero indica il codice corrispondente al carattere iniziale di un raggruppamento composto da una sequenza di n caratteri; il secondo valore indica una quantità di caratteri che possono essere ignorati oppure anche trasformati, partendo dal codice rappresentato dal terzo valore.

Nell'esempio, i codici che vanno da 0 a 8, in decimale, non sono utilizzati; inoltre i codici da 9 a 10 vengono convertiti con il codice 9 e seguenti (in pratica non vengono convertiti affatto). In sostanza, ciò che mostra l'esempio non ha lo scopo di convertire alcunché, ma solo di filtrare codici inutili: vengono lasciati passare i caratteri grafici, a partire dallo spazio, oltre a <HT>, <LF> e <CR>. Volendo esprimere la cosa in modo più esplicito, si possono usare anche dei commenti descrittivi:

    DESCSET
	  0  9 UNUSED
          9  1  9	-- HT --
         10  1 10	-- LF --
         11  2 UNUSED
         13  1 13	-- CR --
         14 18 UNUSED
         32 95 32	-- SP e altri caratteri grafici --
        127  1 UNUSED

La sequenza di direttive `BASESET' e `DESCSET' può anche essere ripetuta, quando dopo l'ASCII normale, i primi 7 bit, si vuole fare riferimento a qualcosa di più. Per esempio, la dichiarazione relativa alla codifica dell'HTML 3.2, si presenta come si vede di seguito:

CHARSET
     BASESET  "ISO 646:1983//CHARSET
               International Reference Version
               (IRV)//ESC 2/5 4/0"
     DESCSET  0   9   UNUSED
              9   2   9
              11  2   UNUSED
              13  1   13
              14  18  UNUSED
              32  95  32
              127 1   UNUSED
     BASESET  "ISO Registration Number 100//CHARSET
               ECMA-94 Right Part of
               Latin Alphabet Nr. 1//ESC 2/13 4/1"
     DESCSET  128  32   UNUSED
              160  96    32

Rispetto a quanto già visto si aggiunge il riferimento allo standard ISO 8859-1 (Latin-1). Si può vedere che vengono esclusi i primi 32 codici a partire dal numero 128, che non contengono simboli grafici utili.

133.2 Capacità

Per qualche ragione storica, che ormai non avrebbe più motivo di sussistere, è prevista una sezione attraverso la quale si definisce la capacità elaborativa dell'analizzatore SGML. Si tratta di stabilire dei limiti di spazio per la gestione di una serie di informazioni. In generale, non dovrebbe essere determinante la dimensione da attribuire ai vari attributi riferiti a questa capacità; tuttavia, si tratta di un'indicazione che rimane, per la quale si fa riferimento allo standard, oppure si indica semplicemente che non ci sono limiti. Nel primo caso si indica,

CAPACITY PUBLIC  "ISO 8879:1986//CAPACITY Reference//EN"

nel secondo soltanto

CAPACITY NONE

A titolo di esempio si mostra anche la direttiva relativa riferita all'HTML 3.2 e 4:

CAPACITY        SGMLREF
                TOTALCAP        150000
                GRPCAP          150000
                ENTCAP          150000

Si osservi la parola chiave `SGMLREF' che può essere usata anche altrove. Rappresenta il riferimento ai valori predefiniti SGML, prima di modificarli o integrarli con le richieste successive.

133.3 Ambito

La sintassi del linguaggio SGML può essere alterata in parte, attraverso una serie di direttive descritte nella prossima sezione. L'ambito della definizione della sintassi SGML può essere controllato attraverso la direttiva `SCOPE':

SCOPE DOCUMENT|INSTANCE

La direttiva `SCOPE DOCUMENT' indica che la sintassi si applica sia al DTD, sia al sorgente SGML; nell'altro caso, `SCOPE INSTANCE' si riferisce solo al sorgente, mentre il DTD va interpretato in base alla sintassi standard predefinita (la sintassi concreta di riferimento).

Di solito si usa la direttiva `SCOPE DOCUMENT'.

133.4 Sintassi concreta

La sintassi concreta è ciò che definisce i delimitatori dei marcatori SGML, il ruolo dei codici di controllo e altri dettagli riferiti alla sintassi SGML. In particolare si parla di sintassi concreta di riferimento quando si vuole indicare quella predefinita, ovvero quella a cui si fa riferimento di solito. Le direttive che compongono la definizione della sintassi concreta sono introdotte dalla sezione `SYNTAX', a cui spesso segue la stringa di un identificatore pubblico, per richiamare inizialmente una serie di caratteristiche standard che poi vengono alterate o integrate dalle direttive successive:

SYNTAX   PUBLIC  "ISO 8879:1986//SYNTAX Reference//EN"

133.4.1 Caratteri da evitare

La prima cosa che si specifica all'interno della dichiarazione della sintassi concreta è l'elenco dei numeri decimali corrispondenti ai codici, o caratteri, che non devono essere usati nel testo del sorgente. Questi non verranno passati all'applicazione successiva dall'analizzatore SGML. All'interno dei codici esclusi in questo modo ci possono essere comunque simboli o caratteri di controllo che servono in altri ambiti, come si vedrà in seguito.

La codifica a cui si fa riferimento, non è quella ottenuta dopo la trasformazione con la direttiva `DESCSET' della sezione `CHARSET', ma quella della stessa direttiva della sezione `SYNTAX', come verrà descritto tra poco.

La direttiva in questione è molto semplice; spesso, quando si tratta dell'ASCII, si utilizza direttamente l'esempio seguente:

    SHUNCHAR CONTROLS 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
	     17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 127

133.4.2 Codifica nell'ambito della sintassi concreta

Nell'ambito della definizione della sintassi concreta, è necessario specificare nuovamente la codifica di partenza e la conversione eventuale. Tutto procede esattamente come è già stato visto in precedenza, nella sezione `CHARSET', con la differenza che in generale si preferisce lasciare tutto come si trova:

    BASESET  "ISO 646:1983//CHARSET
             International Reference Version
             (IRV)//ESC 2/5 4/0"
    DESCSET  0 128 0

L'esempio si riferisce al caso in cui si utilizzi solo l'ASCII. Comunque, si può osservare che la direttiva `DESCSET' non esclude alcunché e non trasforma alcun carattere.

133.4.3 Codici con funzioni speciali

Si possono definire alcuni codici con funzioni speciali, attribuendo loro un nome, a cui si accede con macro del tipo `&#<nome>;'. Spesso si fa uso di queste macro nel DTD, precisamente nelle mappe di sostituzione. Si ricorderà che la macro `&RE;' fa riferimento convenzionalmente alla fine del record. Si osservi l'esempio seguente:

    FUNCTION
	RE    13
        RS    10
        SPACE 32
        TAB   SEPCHAR 9

Si tratta della direttiva `FUNCTION' a cui segue la dichiarazione di una serie dei nomi, abbinati al codice relativo. Si può osservare il caso del nome `TAB', a cui si aggiunge la parola chiave `SEPCHAR': si tratta effettivamente del carattere <HT>, che però, ai fini della sintassi concreta, viene tradotto con ciò che corrisponde a `&SPACE;', cioè uno spazio normale.

L'esempio mostra la definizione tipica di questa direttiva. Si può osservare che `RE' è abbinato a <CR>, per cui si suppone che il file sorgente SGML sia organizzato in modo da avere dei codici di interruzione di riga pari a <CR><LF>, come avviene in Dos. Dipende molto dall'analizzatore SGML come funziona la cosa. In pratica, l'analizzatore potrebbe convertire autonomamente il file in questo modo, oppure potrebbe fare altre considerazioni.

133.4.4 Nomi

Attraverso la sottosezione `NAMING' è possibile definire quali caratteri possono essere usati nei «nomi». In questo modo si intendono i nomi degli elementi, delle entità, degli attributi e di alcuni tipi di valori da associare agli attributi.

In generale, si fa riferimento alle lettere latine dell'alfabeto inglese e alle cifre numeriche, tenendo conto che in generale è concesso solo di iniziare con una lettera. Per modificare questo assunto si interviene in direttive particolari, che limitano il primo carattere, oppure quelli restanti.

Nell'SGML normale si utilizza abitualmente la sezione `NAMING' nel modo seguente:

        NAMING
            LCNMSTRT  ""
            UCNMSTRT  ""
            LCNMCHAR  "-."
            UCNMCHAR  "-."
            NAMECASE
                GENERAL     YES
                ENTITY      NO

In questo modo, si può osservare che i nomi possono contenere anche il trattino (`-') e il punto (`.'), anche se non possono iniziare così; inoltre, tutti i nomi, tranne quelli delle entità, vengono convertiti in maiuscolo (si parla di normalizzazione), per cui non fa differenza in che modo sono stati scritti.

133.4.5 Delimitatori

La sottosezione introdotta dalla parola chiave `DELIM' può servire per intervenire nella definizione dei delimitatori. In generale non si modifica nulla e ci si limita a confermare lo standard di riferimento, attraverso la parola chiave `SGMLREF':

        DELIM
            GENERAL   SGMLREF
            SHORTREF  SGMLREF

A volte viene disabilitato l'uso delle mappe di sostituzione nel DTD, attraverso la direttiva `SHORTREF NONE', come avviene in XML.

Nell'HTML 4 e in XML è stata aggiunta la possibilità di indicare delle macro carattere nella forma `&xn;', per rappresentare i caratteri attraverso cifre esadecimali. Per ottenere questo risultato, dopo la direttiva `GENERAL SGMLREF', si aggiunge la dichiarazione di `HCRO':

        DELIM
            GENERAL   SGMLREF
	    HCRO      "&#38;#x"
            SHORTREF  SGMLREF

Naturalmente, in XML ci sono poi altre aggiunte, che qui non vengono mostrate.

133.4.6 Nomi riservati

Alcune nomi che hanno significati speciali possono essere modificati nella sottosezione `NAMES'. In generale, queste cose non si fanno, per cui si abbina semplicemente la dichiarazione predefinita: `SGMLREF':

        NAMES
            SGMLREF

133.4.7 Quantità

Nell'ambito della sintassi concreta è possibile definire il limite a una serie di quantità. Di solito non ci si preoccupa di queste cose, oppure si scrivono direttive per richiedere limiti molto elevati. Per fare riferimento allo standard, si utilizza la parola chiave `SGMLREF' come al solito:

        QUANTITY SGMLREF

Eventualmente si aggiungono le varianti che si ritiene necessario apportare. L'esempio seguente è tratto dalla configurazione predefinita di SP e appare evidente l'intenzione di estendere al massimo i limiti, anche senza spiegare nel dettaglio il significato di ogni parametro:

        QUANTITY SGMLREF
            ATTCNT    99999999
            ATTSPLEN  99999999
            DTEMPLEN  24000
            ENTLVL    99999999
            GRPCNT    99999999
            GRPGTCNT  99999999
            GRPLVL    99999999
            LITLEN    24000
            NAMELEN   99999999
            PILEN     24000
            TAGLEN    99999999
            TAGLVL    99999999

Con XML, o comunque con la dichiarazione «Web SGML», `ISO 8879:1986 (WWW)', è possibile usare una forma differente e più intuitiva per indicare che non si vogliono porre limiti:

         QUANTITY NONE

133.5 Proprietà

L'ultima sezione della dichiarazione SGML serve a raccogliere la definizione delle proprietà: `FEATURES'. Contiene in particolare tre sottosezioni intitolate rispettivamente `MINIMIZE', `LINK' e `OTHER'. Non è il caso di approfondire queste definizioni, a parte qualche direttiva che può essere interessante.

Per cominciare, conviene osservare la sezione `FEATURES' dell'HTML 4:

FEATURES
    MINIMIZE
	DATATAG  NO
	OMITTAG  YES
	RANK     NO
	SHORTTAG YES
    LINK
	SIMPLE   NO
	IMPLICIT NO
	EXPLICIT NO
    OTHER
	CONCUR   NO
	SUBDOC   NO
	FORMAL   YES

Nella sottosezione `MINIMIZE' è importante tenere in considerazione l'opzione `DATATAG', che in generale è bene sia disattivata come appare nell'esempio. Questa dovrebbe servire per specificare una stringa che nel testo deve essere presa in considerazione come una chiusura implicita di un elemento. L'opzione `OMITTAG' consente di utilizzare le regole di minimizzazione nel DTD.

La sottosezione `OTHER' permette di definire delle caratteristiche interessanti riguardo all'organizzazione del DTD, del sorgente e dei cataloghi. L'opzione `CONCUR' consente, se attivata, di gestire più DTD nello stesso documento. Ciò può servire quando è consentita l'aggregazione di più sorgenti che a loro volta utilizzano DTD differenti. Data la complessità che si creerebbe in questo modo, tale opzione viene disabilitata normalmente. L'opzione `SUBDOC' permette, se abilitata, di aggregare più sorgenti SGML assieme (che di solito condividono lo stesso DTD implicitamente); se si abilita l'opzione occorre aggiungere l'indicazione del numero massimo di livelli di annidamento a cui si può arrivare. L'opzione `FORMAL', se attivata, serve a richiedere l'uso corretto degli identificatori pubblici; se non è attivata, l'identificazione può avvenire in modo meno rigoroso.

L'esempio seguente mostra l'impostazione tradizionale di un sistema SGML:

    FEATURES

        MINIMIZE
            DATATAG   NO
            OMITTAG   YES
            RANK      YES
            SHORTTAG  YES
    
        LINK
            SIMPLE    YES 1000
            IMPLICIT  YES
            EXPLICIT  YES 1
    
        OTHER
            CONCUR    NO
            SUBDOC    YES 99999999
            FORMAL    YES
    
    APPINFO NONE

133.6 Applicazione di una dichiarazione SGML in pratica

La dichiarazione SGML può essere attribuita attraverso il catalogo, con la direttiva `SGMLDECL':

SGMLDECL "HTML4.dcl"

L'esempio mostra il riferimento al file `HTML4.dcl', contenente la dichiarazione SGML desiderata.

Potrebbe essere impossibile selezionare tra più dichiarazioni alternative. In tal caso, diventa necessario predisporre più cataloghi, uno per ogni tipo di dichiarazione che si intende utilizzare.

133.7 Esempio conclusivo

Per concludere viene mostrato un esempio completo di una dichiarazione SGML realizzata per poter utilizzare nel sorgente la codifica ISO 8859-1, che potrebbe essere adatta alle situazioni più comuni (appare anche la sezione `APPINFO' che non è stata descritta). Altri esempi possono essere trovati nel pacchetto SP sorgente, nel quale si può trovare anche la dichiarazione di XML.

<!SGML "ISO 8879:1986 (WWW)"
    CHARSET
        BASESET  "ISO 646-1983//CHARSET
                 International Reference Version (IRV)//ESC 2/5 4/0"
        DESCSET
            0  9 UNUSED
            9  2  9
            11  2 UNUSED
            13  1 13
            14 18 UNUSED
            32 95 32
            127  1 UNUSED
        BASESET  "ISO Registration Number 100//CHARSET
                 ECMA-94 Right Part of
                 Latin Alphabet Nr. 1//ESC 2/13 4/1"
        DESCSET  128  32   UNUSED
                 160  96    32

    CAPACITY PUBLIC    "ISO 8879:1986//CAPACITY Reference//EN"
    
    SCOPE    DOCUMENT
    
    SYNTAX
    
        SHUNCHAR CONTROLS 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
                 18 19 20 21 22 23 24 25 26 27 28 29 30 31 127
    
        BASESET  "ISO 646-1983//CHARSET International Reference Version
                 (IRV)//ESC 2/5 4/0"
    
        DESCSET
	    0 128 0
    
        FUNCTION
            RE                    13
            RS                    10
            SPACE                 32
            TAB       SEPCHAR     9
    
        NAMING
            LCNMSTRT  ""
            UCNMSTRT  ""
            LCNMCHAR  "-."
            UCNMCHAR  "-."
            NAMECASE
                GENERAL     YES
                ENTITY      NO

        DELIM
            GENERAL   SGMLREF
            HCRO      "&#38;#x"
            SHORTREF  SGMLREF

        NAMES    SGMLREF

        QUANTITY NONE

    FEATURES

        MINIMIZE
            DATATAG   NO
            OMITTAG   YES
            RANK      NO
            SHORTTAG  NO
    
        LINK
            SIMPLE    YES 1000
            IMPLICIT  YES
            EXPLICIT  YES 1
    
        OTHER
            CONCUR    NO
            SUBDOC    YES 99999999
            FORMAL    YES
    
    APPINFO NONE
>

133.8 Riferimenti

---------------------------

Appunti Linux 2000.04.12 --- Copyright © 1997-2000 Daniele Giacomini --  daniele @ pluto.linux.it


[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]