| ![[iomega ZIP]](images/a_left.png)  | [iomega ZIP] [About] [Copertina] [Postscript] | ![[Postscript]](images/a_right.png)  | 
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]](images/a_left.png)  | [iomega ZIP] [About] [Copertina] [Postscript] | ![[Postscript]](images/a_right.png)  |