In questo articolo introdurremo il lettore all'utilizzo dell'estensione Tidy per PHP, disponibile fin dalle prime minor release di PHP 5. L'estensione è basata sulla libreria TidyLib e permette allo sviluppatore di operare su sorgenti HTML, XHTML ed XML applicando funzioni per la validazione, la formattazione, il parsing ed addirittura la risoluzione degli errori in modo quasi automatico. L'utilizzo di un'estensione come Tidy permette allo sviluppatore di assicurarsi che dei documenti in input siano validi rispetto a determinate esigenze, e permette allo stesso sviluppatore di assicurarsi che l'HTML, l'XML o l'XHTML prodotti siano correttamente formattati e non contengano errori rispetto agli standard elencati nelle specifiche W3C.
Installare la libreria
La libreria Tidy è disponibile come estensione all'interno del repository PECL o anche come parte della distribuzione sorgente ufficiale e necessita della libreria libtidy per essere installata correttamente. Dato che non è compresa nella distribuzione standard, procederemo per prima cosa con lo spiegare il semplice processo di installazione.
Nel caso si stia utilizzando PHP 5 su un sistema Windows, l'unica operazione necessaria è abilitare manualmente l'estensione rimuovendo il commento che precede la linea extension=php_tidy.dll
all'interno del file php.ini
, dato che la distribuzione di PHP per Windows viene rilasciata con il supporto per Tidy integrato.
Nel caso invece si stia operando su sistemi operativi diversi, l'iter da seguire è molto semplice e tipico per qualunque estensione si decida di includere o aggiungere a PHP. Per prima cosa è necessario recuperare ed installare la libreria libtidy, presente sul sito del progetto, che rappresenta l'unico requisito essenziale per il funzionamento di Tidy per PHP. Dopo aver provveduto al download ed all'installazione è possibile ricompilare PHP 5 includendone il supporto, sfruttando il comando di configurazione con l'opzione aggiuntiva --with-tidy
:
./configure --with-tidy=/usr/local/lib/libtidy
Nel caso in cui il path non sia specificato, lo script di configurazione utilizzerà il valore di default; dopo aver configurato PHP 5 con l'opzione aggiuntiva, è possibile procedere con la normale compilazione e controllare che la libreria sia correttamente installata analizzando l'output della funzione phpinfo()
.
Utilizzare la libreria
Come molte altre librerie disponibili per PHP, la libreria Tidy per PHP espone sia un'interfaccia procedurale che un'interfaccia ad oggetti. Sebbene ritenga questa un'opzione che influenza in modo negativo la standardizzazione del codice PHP, è comunque interessante conoscere quali sono i due tipi di approccio utilizzabili anche in modo pratico.
Durante l'articolo opterò per un approccio ad oggetti:
<?php
$tidy = new Tidy();
$tidy->parseFile("/path/to/file.xml");
$tidy->cleanRepair();
echo $tidy;
?>
Per un approccio procedurale invece le regole seguite sono simili a quelle utilizzate dalle altre librerie: parole separate da underscore e funzioni precedute dal prefisso tidy.
<?php
$tidy = tidy_parse_file("/path/to/file.xml");
tidy_clean_repair($tidy);
echo tidy_get_output($tidy);
?>
È possibile anche mescolare le due soluzioni, ma è un'operazione altamente sconsigliata che evito di illustrare per non indirizzare qualcuno sulla strada sbagliata.
Per prima cosa vediamo come è possibile creare una rappresentazione Tidy di un documento XHTML o HTML oppure di una stringa di testo che contenga dati in questo formato. Per caricare una risorsa presente su disco è possibile utilizzare direttamente il costruttore oppure, se si desidera caricare il file dopo aver inizializzato la libreria, il metodo parseFile
. Entrambe le soluzioni accettano come unico parametro obbligatorio il path del file da caricare; oltre a questo argomento è possibile specificare un array di opzioni, la codifica da utilizzare per la lettura del file ed un valore boolean che specifica se cercare il path specificato all'interno dell'include_path di PHP oppure no.
L'array delle opzioni è molto importante perchè ci permette di configurare in modo adeguato alle nostre esigenze il parser interno di Tidy. Le opzioni di configurazione sono moltissime (potete visualizzare una lista esaustiva di queste a questo indirizzo sul sito del progetto) ma vedremo di includere un elenco delle più significative per spiegarne l'utilizzo:
wrap
: un numero intero che specifica il numero di caratteri dopo i quali si desidera che il testo venga mandato a capo;force-output
: valore booleano che indica a Tidy se restituire comunque l'output generato anche nel caso in cui si generino degli errori;output-html
: valore booleano che indica se restituire l'output in formato HTML;output-xml
: valore booleano che indica se restituire l'output in formato XML;output-xhtml
: valore booleano che indica se restituire l'output in formato XHTML;join-classes
: valore booleano che indica se combinare o meno le classi CSS;join-styles
: valore booleano che indica se combinare o meno gli stili inline CSS;indent
: può assumere i valori true, false o auto ed indica se l'output generato dovrà essere indentato o meno;
Al posto di specificare un array di opzioni è anche possibile specificare una stringa che contiene il path di un file di configurazione; questo file conterrà l'elenco delle direttive di configurazione utilizzate separate dal loro valore con i due punti (:).
Ripuliamo un file HTML
Vediamo ora un semplice esempio di utilizzo per correggere e ripulire un file HTML scritto in modo errato. Il contenuto HTML verrà recuperato da una stringa e per questo motivo utilizzeremo il metodo parseString
per completare l'oggetto Tidy e verrà trasformato in codice XHTML valido e correttamente formattato:
<?php
$html = "<p>Hello <B>World</i> da <U>Tidy</P>";
$config = array(
"indent" => true,
"output-xhtml" => true,
"wrap" => 200
);
$tidy = new Tidy();
$tidy->parseString($html, $config);
$tidy->cleanRepair();
echo $tidy;
?>
Eseguendo questo codice otterremo il seguente risultato:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="generator" content="HTML Tidy for Mac OS X (vers 1st December 2004), see www.w3.org" />
<title></title>
</head>
<body>
<p>Hello <b>World</b> da <u>Tidy</u></p>
</body>
</html>
Il metodo cleanRepair
è utilizzato per correggere il codice, ripulirlo dall'eventuale markup in eccesso in modo da renderlo corrispondente alle opzioni specificate in fase di parsing; capita spesso che vengano generati errori di validazione o trasformazione, ed in questo caso è necessario operare per la loro correzione oppure ignorarli tramite opzioni di configurazione specifiche.
Ottimizzare un file XHTML
L'estensione Tidy però non è utile solo per formattare e validare il codice inserito, ma anche per ottimizzare il peso dei file XHTML in modo da ottimizzare il consumo di banda. In alcune situazioni anche pochi byte in eccesso dovuti a distrazioni o ripetizioni di classi e stili inline possono comportare uno spreco eccessivo di banda ed una diminuzione della qualità del servizio. Grazie ad un accorto utilizzi dell'estensione Tidy è possibile ovviare a questi problemi, anche se non sostituisce una scrittura accorta dei sorgenti XHTML e dei CSS:
<?php
$options = array(
"clean" => true,
"drop-proprietary-attributes" => true,
"drop-font-tags" => true,
"drop-empty-paras" => true,
"hide-comments" => true,
"join-classes" => true,
"join-styles" => true,
"word-2000" => true /* spero non dobbiate mai usare questa opzione ... */
);
$tidy = new Tidy();
$tidy->parseFile("https://www.html.it/", $options);
$tidy->cleanRepair();
echo $tidy;
?>
Come ultimo accorgimento è utile sapere che è possibile anche impostare l'utilizzo automatico di Tidy usando l'output handler fornito con la libreria:
<?php
ob_start("ob_tidyhandler");
?>
L'handler permette di apportare automaticamente modifiche di compressione e formattazione del codice restituito in output in base alle opzioni di configurazione impostate.
Conclusioni
Abbiamo visto brevemente come installare ed utilizzare la libreria Tidy per PHP in modo da poter ottimizzare e correggere eventuali errori presenti nei nostri documento XHTML, HTML ed XML. Tidy è un progetto interessante e molto utile, anche se rimane sempre in primo posto l'accortezza del designer nello scrivere codice corretto e conforme agli standard che si è deciso di adottare. L'ottimizzazione del codice è molto importante anche per ridurre l'utilizzo eccessivo di banda ed utilizzato in parallelo con strumenti di compressione dei sorgenti o handler GZ può portare veramente molti vantaggi e risparmio di soldi e risorse.