Il validatore XML integrato

Da quando il World Wide Web Consortium ha lanciato la Web Accessibility Initiative, le problematiche di validazione XML e di accessibilità del Web per gli ipovedenti si sono incontrate. SPIP si è interessato molto presto ai problemi di accessibilità, con la versinoe 1.5 nel 2002. Di contro, da molto tempo l’XML non ha seguito tale direzione, riguardo alla rarità delle pagine conformi: l’abbondanza delle pagine in HTML non XHTML fa in modo che i browser hanno il proprio analizzatore, e i linguaggi basati sull’XML, come SVG e XQuery, hanno sperimentato un avvio molto lento. Tuttavia, la convergenza delle problematiche di accessibilità e di validazione da un lato, e dell’implementazione in linguaggio nativo di SVG in diversi browser dall’altro lato, ha condotto SPIP, nella sua versione 1.8.1, a offrire una interfaccia con degli strumenti di validazione come Tidy o il validatore ufficiale del W3C. Questi strumenti, come indicano francamente le home page del proprio sito, soffrono di alcuni limiti, rivelano delle divergenze nei loro messaggi di errore, e non sono installabili dall’utente medio [1] Inoltre essi sono inoperanti riguardo alle nuove tecnologie come Ajax, che modificano in maniera incrementale il contenuto di una pagina Web. Ancor più grave, i Document Type Definition del W3C hanno anch’essi dei limiti, compresi il DTD XHTML 1.0 cosiddetto strict: mentre le specificazioni ufficiali vietano la nidificazione dei tag a, label o form, la definizione formale della grammatica descritta considera valide le costruzioni <label for='x'><label... o <form action='.'><div><form... per esempio [2].

Di fronte a questa situazione, SPIP 1.9.2 innova radicalmente proponendo un validatore estensibile, integrato, incrementale e opzionale, basato sul Simple Analyzer for XML fornito nel pacchetto standard di PHP. Questa pluralità di aspetti lo rende indicato sia per i webmaster che per i grafici e gli sviluppatori di plugin di SPIP ovviamente con delle manipolazioni diverse.

Validazione per i webmaster

Per i webmaster, mettere semplicemente nel file mes_options.php l’istruzione $xhtml = 'sax'; causerà una nuova impaginazione del HTML prodotto da un modello di layout, ogni riga avrà un solo tag di apertura e un attributo eventuale, con rafforzamento del margine sinistro proporzionale al numero di tag aperte e non chiuse. Nel caso in cui la pagina non venga validata, questo lavoro sarà ignorato, e il testo iniziale sarà inviato al client HTTP. Nei due casi, la messa in cache eventuale ha luogo ovviamente dopo l’azione del validatore, che qui si accontenta di una formattazione semplice.

Alcune precisazioni per quel che riguarda il trattamento degli attributi. Il loro valore sarà sistematicamente circondato da un apostrofo, salvo che se contiene un apostrofo, nel qual caso esso sarà circondato da virgolette (e se contiene anche virgolette, queste saranno scritte come &quot;). A causa di un errore di concezione di SAX [3], le entità XML saranno precedentemente convertite nel charset del sito ad eccezione di &amp; &lt; &gt; e &quot; che vengono trattati correttamente da SAX (poiché ciò è indispensabile). L’elenco delle entità e del loro valore saranno dedotte dal DOCTYPE indicato dal modello di layout; in mancanza di esso SPIP prenderà un insieme predefinito equivalente alla DTD del latin1 arricchito da &euro;, &oelig; e &OElig; definiti nella DTD dei simboli speciali.

Validazione per i grafici

Per i creatori di modelli il validatore è disponibile attraverso il debugger introdotto nella versione SPIP 1.8. Questo strumento è visibile solo agli amministratori del sito, poiché dispongono di pulsanti di amministrazione quando visitano le pagine del sito pubblico. Uno di questi pulsanti si chiama Analisi XML e causa esplicitamente la richiesta di validazione della pagina visitata. Questa analisi è innanzitutto data a SAX che, anche in mancanza di DOCTYPE, analizza:

  • le erronee nidificazioni di tag di apertura e chiusura;
  • gli attributi privi di valore;
  • gli attributi senza delimitatore;
  • gli attributi senza spazio prima seguente;
  • le entità XML scritte erroneamente (in particolare un & letterale, mentre l’XML impone di scrivere &amp;).

Al primo errore trovato il debugger di SPIP tenterà immediatamente di ritrovare da quale modello proviene l’errore (ve ne sono diversi in caso di inclusioni) e in quale riga, dando dei link verso i file sorgenti (questa individuazione non ha sempre successo, bisogna tenere conto di un margine di errore).

Se questa prima analisi è corretta, questa nuova versione di SPIP va ben oltre prendendo in considerazione il DOCTYPE della pagina. Esso può essere di tipo PUBLIC o SYSTEM, e nel primo caso il DTD sarà messo in cache per accelerare le analisi ulteriori. Ogni DTD può comprenderne altri, che saranno caricati in maniera simile. Al fine di evitare le ridondanze di calcolo pur tenendo in considerazione il sistema di inclusione condizionale dei DTD, SPIP mette ugualmente in cache una struttura di dati che deduce dalla lettura di tutte le definizioni di elementi, di attributi e di entità provenienti dal DOCTYPE indicato. Appoggiandosi a questa struttura, SPIP valida la pagina, in altre parole verifica che:

  • tutti i nomi di attributi utilizzati in un tag sono accettati dal DTD;
  • tutti gli attributi obbligatori di un tag sono presenti;
  • tutti i valori di attributi sono conformi al motivo indicato eventualmente nel DTD;
  • tutti gli attributi di tipo ID hanno un valore composto di lettere, cifre, sottolineati, trattini e due punti;
  • tutti gli attributi di tipo IDREF o IDREFS fanno riferimento degli ID effettivamente presenti nella pagina;
  • tutte le entità XML utilizzate sono definite nella DTD;
  • tutti i nomi di tag utilizzati sono definiti nel DTD;
  • qualsiasi tag non vuoto è autorizzato ad esserlo dal DTD (per esempio, un img vuoto sarà denunciato) ;
  • qualsiasi tag vuoto è autorizzato ad esserlo dal DTD (per esempio, un tr vuoto sarà denunciato) ;
  • qualsiasi tag utilizzato è figlio di un tag che l’ammette come tale nel DTD;
  • qualsisi tag che deve apparire prima di uno di questi tag fratelli appare effettivamente così (per esempio, head prima di body)
  • qualsiasi tag che deve apparire un numero fisso di volte appare effettivamente così (per esempio, title una sola volta dentro head).

Se si individuano degli errori il validatore mostrerà una tabella di tutti gli errori, con il numero di occorrenze, i link verso le righe incriminate, e dei suggerimenti di correzione dedotte automaticamente dalle costruzioni autorizzate dal DTD. In mancanza di errori il debugger mostrerà il codice secondo l’impaginazione descritta in precedenza.

Validazione per gli sviluppatori

Le pagine Web con accesso limitato hanno particolare bisogno di un validatore integrato per essere rifinite, poiché gli strumenti esterni di validazione non hanno accesso a tali pagine. Per ciò che riguarda gli script, siano essi standard o provenienti da plugin, dello spazio di redazione di SPIP gli si applica il validatore XML mettendo $GLOBALS['transformer_xml'] = 'valider_xml'; nel file mes_options.php. L’area riservata di SPIP 1.9.2 è stata resa conforme all’XHTML 1.0 grazie a questo meccanismo. Cambiare questa variabile globale con 'indenter_xml' causerà l’identazione del sorgente HTML se questo è conforme XML, senza cercare di validarlo.

E’ anche possibile lanciare, con il mouse, l’analisi XML del risultato di un o script Ajax attivato nell’area di redazione. Un tale script non restituice una pagina HTML completa ma solo un frammento di essa, il validatore integrato costruirà una pagina con il DOCTYPE attuale, un header limitato al tag Title, e un tag Body composto da tale frammento. Si aprirà una finestra con il risultato dell’analisi, come per una pagina normale, mentre la finestra iniziale riceverà il risultato dello script Ajax come al solito. A causa di una specifica W3C inutilizzabile per i modelli di eventi [4], questo lancio del validatore non è provocato da un pulsante specifico del mouse, ma da un clic durante il quale almeno uno dei due tasti Alt o Meta viene premuto.

D’altronde, il validatore di SPIP può essere applicato a qualsiasi pagina presente sul Web. Qualsiasi sito SPIP installato all’URL http://u contiene la pagina http://uecrire/valider_xml che gli autori del sito possono invocare esplicitamente per validare pagine non limitate a quella del sito. Questo validatore si applica tuttavia ai documenti XML; in mancanza del DOCTYPE, verrà preso il DTD XHTML1.0 Transitional.

Come suggeriscono le righe soprastanti, il validatore si applica a qualsiasi DOCTYPE, compresi quelli che si riferiscono a DTD residenti sul sito. Rendere accessibile delle pagine Web vuol dire essere più rigorosi nell’utilizzo degli attributi e dei tag, quindi si può facilmente construirsi uno strumento di validazione di accessibilità scrivendo dei DTD meno tolleranti dell’XHTML 1.0 cosiddetto strict. Sostituire #IMPLIED con #REQUIRED negli attributi giudicati indispensabili è immediato. Obbligare input, select, textarea e button a essere esclusivamente figli del tag label è poco più difficile. Inoltre, il validatore accetta qualsiasi motivo (nel senso di PCRE) come tipo di attributo, quindi esso sarà applicato ad ogni occorrenza di questo attributo nella pagina analizzata.

Infine, è possibile definire le proprie regole di validazione associate a un attributo. I tipi soliti ID, IDREF e IDREFS sono implementati dalle funzioni validerAttribut_ID, validerAttribut_IDREF, validerAttribut_IDREFS. E’ sufficiente introdurre un nuovo tipo S1 ... Sn nel DTD, e definire le funzioni associate al file mes_options per causare i controlli personalizzati. Alla fine dell’analisi, la funzione in ovverride inc_valider_passe2 viene chiamata, al fine di effettuare i controlli retrospettici (è qui che gli attributi IDREF vengono verificati come referenti di attributi effettivamente presenti). Questa interfaccia di programmazione è ancora un po’ manchevole e verrà rivista dopo la sperimentazione. Ma essa permette fin da ora di attuare delle nuove specificazioni di accessibilità.

Note

[1Il validatore del W3C si presenta sotto forma di un archivio di oltre 1MB, costituito essenzialmente da uno script CGI in Perl, che necessita di diversi moduli di questo linguaggio e della sua interfaccia con il server HTTP. Inoltre, l’analisi sintattica e la validazione non vengono effettuate da questo programma ma delegata all’analizzatore onsgmls programmato in C++ e che quindi deve essere compilato dopo aver caricato i sorgenti del progetto OpenSP di 1MB (tuttavia alcuni sistemi operativi comprendono già l’eseguibile di 128Kb). Questa difficolta spiega forse la rarità delle sue installazioni, che di colpo sono spesso saturate.

[2Questa carenza è giustificata da questo brano della raccomandazione XHTML che afferma: The HTML 4 Strict DTD forbids the nesting of an ’a’ element within another ’a’ element to any descendant depth. It is not possible to spell out such prohibitions in XML. Tale affermazione non è supportata da alcuna dimostrazione o riferimento scientifici. I teoremi che stabiliscono le capacità di analisi sintattica automatica sono stati enunciati e dimostrati già dagli anni Cinquanta, e contraddicono tale affermazione. W3C, go to school?

[3Incontrando quel che lui considera un lessema, SAX chiama un catturatore di eventi. Poiché egli considera gli attributi come dei lessemi, esso causerà la stessa sequenza di chiamata per i tre testi seguenti:

&eolig;&EOlig;<a ...


&eolig;<a title='&EOlig;' ...


<a title='&eolig;' href='&EOlig;' ....


Di conseguenza, il catturatore di eventi Entité XML non saprà se l’entità che lo chiama fa parte dell’elemento di testo che precede il prossimo tag, o se fa parte di uno degli attributi di questo tag, e quale. L’ambiguïtà non può essere risolta con l’aiuto dei numeri di riga e di colonna (o del carattere del flusso), che indicano in tutti i casi la localizzazione che precede il tag.

[4Mentre il sistema operativo più diffuso nel mondo seguiva - per una votla - saggiamento le lezioni di Unix e più precisamente di X-Window, descrivendo un pulsante del mouse con una maschera di bit, il W3C ha ritenuto giusto produrre una specifica incompatibile e mal concepita che non segue praticamente nessun browser.

Autore Fausto Barbarito Publié le : Mis à jour : 26/10/12

Traductions : عربي, català, English, Español, français, italiano