[iomega ZIP] [About] [Copertina] [Postscript] |
Articoli
Qualche giorno fa, leggendo un niusgrup, ho incontrato
una affermazione che prima mi ha fatto sorridere, poi mi ha
fatto indignare, e quindi, smaltito il sacro furore, mi ha fatto
riflettere sulla necessità di scrivere questo articolo.
Non lo avrei fatto altrimenti, più che altro per la delusione
dovuta ai miei precedenti interventi su queste pagine cui,
senza mia richiesta, erano stati promessi prima tre, poi due,
infine un CD premio, che non si è mai degnato di farsi vedere.
Segno che i miei precedenti interventi non erano all'altezza, e
su questo sono certamente d'accordo. Vediamo se mi riesce di
fare meglio stavolta.
Ma torniamo alla nostra affermazione; qualcuno ha scritto:
Come sarebbe a dire Chi?
Come direbbe il celebre parroco di Dalla, si dice il
peccato, non il peccatore!
L'SGML e' un sistema generalizzato per scrivere documenti,
tipo HTML ma con i tag leggermente diversi.
Lo Structured Generalized Markup Language, detto comunemente SGML, è un metalinguaggio, definito in svariati e corposi standard ISO, che consente di descrivere formalmente un linguaggio a markup. Il beneficio della descrizione formale risiede nella possibilità di usare strumenti automatici per la verifica di documenti (non voglio chiamarli testi), la loro stampa/visualizzazione e/o la loro conversione ad altri formati. Con questo voglio mettere in chiaro che la cosa non è limitata ai soli testi, ma spazia in un campo vastissimo di applicazioni (un esempio per tutti: l'industria aeronautica utilizza un'applicazione SGML per archiviare disegni e descrizioni delle parti che compongono un aereoplano).
L'HTML è invece una applicazione
dell'SGML in quanto la sua grammatica può essere
descritta formalmente in SGML.
Questa descrizione formale è composta dal DTD,
il Document Type Definition e dallo Style Sheet (a sua volta
definito in base al linguaggio DSSSL) che descrive grosso modo
come gli oggetti referenziati dagli elementi
del DTD vadano elaborati.
Si può illustrare questa relazione con una bella analogia:
L'SGML corrisponde ad un linguaggio di programmazione di alto
livello, con la sua sintassi formalmente definita.
L'HTML è una applicazione, un programma scritto in questo
linguaggio di programmazione, e il suo DTD ne è il sorgente.
Il documento, la vostra pagina HTML sono i dati oggetto
dell'elaborazione del programma.
Fatte queste premesse (doverose, per soddisfare il mio smodato ego), voglio subito entrare nel vivo di questo monologo e parlarvi dell'argomento di questo articolo:
un modo
diverso
di scrivere in HTML
Diverso da che?
Ma dalla moda imperante degli editor HTML, vere e proprie
contraddizioni nei termini; dall'abuso di tomi e libroni tutti
tesi nello sforzo di spiegarvi quanto belle sembreranno
le vostre pagine sugli schermi di Netscape o, peggio, di
Explorer.
Intendiamoci: se siete tra quelli che ritengono che l'HTML serva solo per creare pagine fugaci da far apparire sul Web come comete, allora potete tranquillamente smettere di leggere e andare a pascolare nel cortile del Netscape Gold e degli altri editor Wysiwyg per HTML! Qui non troverete nulla per voi, e vi annoierete a morte.
Scopo di questo articolo è di liberarvi da questo ciarpame e portarvi ad abbeverarvi direttamente alla fonte, cioè a scrivere HTML consultandone il DTD.
Suona terribilmente difficile, vero?
Beh, non lo è.
Anche il compilare il kernel di Linux suona come un'operazione
terribilmente difficile, molto più che installare il DOS.
Eppure io e voi sappiamo benissimo che è, in realtà, assai più
facile.
Così è anche per il DTD dell'HTML.
Seguitemi, vi porterò per mano a scoprirne i temibili segreti!
Dentro i segreti dell'SGML
Della sua sintassi, per il momento, ci occuperemo solo di Entità, Elementi ed Attributi.
Le
ENTITÀ
Per gli scopi di questo articolo, ci basti dire che una
Entità SGML è simile ad una macro che
verrà espansa nel DTD o nel documento stesso.
Troviamo perciò definiti come entità dei nomi
riferiti a liste di elementi sintattici o terminali, o
a singoli caratteri o addirittura ad interi documenti
pubblici, cioè implicitamente noti, o reperibili in ben
determinati cataloghi. Il termine #PCDATA
indica del testo che non deve essere considerato ai fini
del riconoscimento degli elementi propri dell'SGML, come ad
esempio un testo da considerare letteralmente.
La sintassi di una entità è la seguente:
<!ENTITY
%
e potranno essere usate solo all'interno delle dichiarazioni
degli elementi SGML.
SYSTEM
seguita da un identificatore
di un oggetto del sistema operativo (tipicamente un file)
il cui contenuto verrà usato in sostituzione del nome
dell'entità.
Gli
ELEMENTI
Gli elementi sono le componenti strutturali principali
dell'SGML, e sono utilizzati per marcare, all'interno del
documento, le sue componenti logiche.
I tag, insomma.
Gli elementi sono nomi normali e quindi virtualmente
indistinguibili dal testo che li circonda. Perciò vanno
racchiusi tra entità speciali, chiamati STAGO
(start of tag open = "<"),
ETAGO
(end of tag open = "</") e
TAGC
(tag close = ">").
Queste entità sono riservate ed il loro uso all'interno dei
documenti è inibito. Speciali entità sono definite per
consentirne la rappresentazione all'interno di un
documento.
La sintassi di un elemento è la seguente:
<!ELEMENT
-
)
ovvero l'opzionalità
( o
)
rispettivamente dell'Apertura di Tag
e
della Chiusura di Tag
EMPTY
.
Raggruppamenti.
Indicatori di ripetizione.
Seguono sempre, senza spazi interposti, gli elementi o il
raggruppamento cui si applicano.
Connettori di gruppo.
Si interpongono tra due o più elementi o raggruppamenti.
Inclusori ed Esclusori.
Precedono sempre, senza spazi interposti, gli elementi o il
raggruppamento cui si applicano.
Gli
ATTRIBUTI
Gli attributi descrivono caratteristiche di un elemento che non fanno parte del suo contenuto.
La sintassi di un attributo è la seguente:
<!ATTLIST
CDATA
,
IDREF
,
NMTOKEN
o
NUMBER
)
#REQUIRED
,
#IMPLIED
o
#CURRENT
)
indicanti nell'ordine,
l'obbligatorietà, l'opzionalità o la persistenza del
valore dell'attributo).
Diamo un'occhiata al DTD.
Per poter consultare un DTD, la prima cosa da fare, la più ovvia, è procurarsi il documento. Nel nostro caso, quello dell'HTML 3.2, dobbiamo frugare il sito Web di W3.org, dove troviamo il nostro DTD.
Stampiamolo, per prima cosa, perché il contatto fisico stimola
la libido.
Lo so, non c'entra niente, ma ... suonava tanto bene!
<!ENTITY % HTML.Version "-//W3C//DTD HTML 3.2 Draft//EN" -- Typical usage: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Draft//EN"> <html> ... </html> -- >Questa dichiara una entità parametro di nome % HTML.Version il cui utilizzo tipico è mostrato nel commento inglobato nella dichiarazione (e che io ho evidenziato in rosso, per chi ha un browser a colori).
--
(doppi
trattini)
<!--============ Text Markup ==============================--> <!ENTITY % font "TT | I | B | U | STRIKE | BIG | SMALL | SUB | SUP"> <!ENTITY % phrase "EM | STRONG | DFN | CODE | SAMP | KBD | VAR | CITE"> <!ENTITY % special "A | IMG | APPLET | FONT | BR | SCRIPT | MAP"> <!ENTITY % form "INPUT | SELECT | TEXTAREA"> <!ENTITY % text "#PCDATA | %font | %phrase | %special | %form"> <!ELEMENT (%font|%phrase) - - (%text)*> <!ELEMENT FONT - - (%text)* -- local change to font --> <!ATTLIST FONT size CDATA #IMPLIED -- [+]nn e.g. size="+1", size=4 -- color CDATA #IMPLIED -- #RRGGBB in hex, e.g. red: color="#FF0000" -- > <!ELEMENT BR - O EMPTY -- forced line break --> <!ATTLIST BR clear (left|all|right|none) none -- control of text flow -- >In testa vediamo subito la dichiarazione di quattro entità parametro che fungono da nome per altrettante liste di elementi correlati tra loro. Una quinta entità dichiara una lista delle precedenti quattro più, ovviamente, normale testo, e la pone sotto il significativo nome di %text. Vedremo ora come, grazie ad un sapiente gioco di entità, si ottengano dichiarazioni recursive di elementi che ammettono sè stessi nel loro contenuto. Infatti, la riga
<!ELEMENT (%font|%phrase) - - (%text)*>dichiara che uno qualunque degli elementi delle due liste %font oppure %phrase può essere composto da zero o più occorrenze dell'entità %text, che contiene recursivamente anche l'elemento in questione, che potrà perciò essere annidato a volontà in sè stesso da solo o intervallato da altri elementi presenti nella lista. Capirete subito come una tale informazione non possa essere elencata in alcuna tavola o manuale di riferimento HTML (pena la noiosità e l'inutilità di tale elenco) mentre sia chiarissima a chi sa leggere queste dichiarazioni.
<!ATTLIST FONT size CDATA #IMPLIED -- [+]nn e.g. size="+1", size=4 -- color CDATA #IMPLIED -- #RRGGBB in hex, e.g. red: color="#FF0000" -- >Questa dichiarazione ci informa che l'elemento FONT dispone di due attributi, SIZE e/o COLOR, ciascuno dei quali ammette del testo come valore dell'attributo, mentre la costante #IMPLIED indica l'opzionalità di questi attributi, che possono cioe essere entrambi presenti, o uno dei due, o essere totalmente assenti. I commenti ricordano con esempi i valori ammessi per gli attributi. In particolare occorre ricordare che se il testo contiene spazi o caratteri non alfanumerici (come il +/- o il # degli esempi) allora il testo dovrà essere racchiuso tra virgolette. Un altro commento ci dà l'elenco dei nomi dei colori ammessi nel relativo attributo:
aqua, black, blue, fuchsia, gray, green, lime, maroon, navy, olive, purple, red, silver, teal, white, and yellowIo, di norma, preferisco usare questi nomi per la chiarezza del testo, benchè si debba notare come i colori effettivamente usati siano dipendenti dall'applicativo.
<!ELEMENT BR - O EMPTY -- forced line break --> <!ATTLIST BR clear (left|all|right|none) none -- control of text flow -- >Notate l'opzionalità del tag di chiusura (la
O
)
e l'assenza del contenuto del tag (la parola chiave
EMPTY
);
indicano che il tag viene utilizzato da solo, senza contenuto nè
chiusura.
<!--================= Preformatted Text ======================--> <!-- excludes images and changes in font size --> <!ENTITY % pre.exclusion "IMG|BIG|SMALL|SUB|SUP|FONT"> <!ELEMENT PRE - - (%text)* -(%pre.exclusion)> <!ATTLIST PRE width NUMBER #implied -- is this widely supported? -- >Ripetiamo anche la dichiarazione dell'entità text, che abbiamo visto prima:
<!--============ Text Markup ==============================--> <!ENTITY % font "TT | I | B | U | STRIKE | BIG | SMALL | SUB | SUP"> <!ENTITY % phrase "EM | STRONG | DFN | CODE | SAMP | KBD | VAR | CITE"> <!ENTITY % special "A | IMG | APPLET | FONT | BR | SCRIPT | MAP"> <!ENTITY % form "INPUT | SELECT | TEXTAREA"> <!ENTITY % text "#PCDATA | %font | %phrase | %special | %form"> <!ELEMENT (%font|%phrase) - - (%text)*>Osservate la dichiarazione dell'elemento:
<!ELEMENT PRE - - (%text)* -(%pre.exclusion)>dove si nota l'obbligatorietà dei tag di apertura e di chiusura, il contenuto del tag (zero o più elementi definiti dall'entità %text) con l'esclusione (il meno immediatamente precedente la parentesi) di qualunque elemento definito dall'entità %pre.exclusion.
Il resto ve lo lascio come esercizio: leggetevi il DTD, seguite le varie definizioni incrociate; le liste e le tabelle sembrano incredibilmente intricate, ma, se vi dedicate qualche minuto a seguire la rincorsa di elementi, attributi ed entità, scoprirete che tutto appare semplice e familiare.
Infine ...
A questo punto spreo di avere stimolato sufficientemente la
vostra curiosità. Se vi siete domandati come abbia fatto a
modificare il colore dei marcatori degli elementi di una lista o
a cambiare il colore entro un testo taggato con <pre> senza
usare il tag <font> (che Netscape visualizza, ma che è
vietato dal DTD), vi consiglio di rileggervi questo articolo
usando un ... normale editor (sempre nella speranza che gli
impaginatori del PLUTO JOURNAL non l'abbiano stravolto, sigh).
Potrete osservare come, con pochi accorgimenti stilistici, un
testo html possa essere reso leggibilissimo fin dal suo
sorgente. Se vi venisse il sospetto che tutto quello spazio
poteva essere risparmiato per diminuire la lunghezza del file,
allora ho una sorpresa per voi: nonostante sul vostro schermo il
testo appaia molto spaziato (e di conseguenza leggibile) questo
è ottenuto inserendo solo un paio di newline per paragrafo ed un
tab per riga. Poche centinaia di byte, ma in compenso ho usato
molti meno tag di quanti ne inserisca un editor HTML, ad esempio
ho sempre omesso i tag di chiusura che sono indicati come
opzionali nel DTD. Solo di </p> e di </li> sono circa 300
byte in meno!
E il compianto? Non so, non saprei in verità dirvi quanto e cosa c'entri il compianto Elvis in tutto questo, eccetto che elvis è il nome di un editor della classe vi che ha una interessante capacità di visualizzare ed editare un testo HTML sia dandogli una leggera formattazione per rendere l'idea di come apparirebbe il vostro testo su un browser, sia di evidenziare con l'uso dei colori, i commenti e gli elementi sintattici dell'HTML, rendendo più piacevole (e facile) il lavoro.
A risentirci!
[iomega ZIP] [About] [Copertina] [Postscript] |