[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 454.   XSL-FO: impaginazione

L'impaginazione secondo XSL-FO viene definita attraverso dei modelli a cui si fa riferimento per mezzo di un nome. Quando si dichiara il modello, l'elemento relativo utilizza l'attributo master-name; quando vi si fa riferimento, l'elemento utilizza l'attributo master-reference.

454.1   Impaginazione semplificata

La definizione minima della pagina e del contenuto si ottiene con una struttura XSL-FO simile a quella seguente, dove però non sono ancora stati annotati gli attributi obbligatori:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fo:root SYSTEM "fo.dtd">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <fo:layout-master-set>
        <fo:simple-page-master>
        ...
        </fo:simple-page-master>
        ...
        <fo:region-body />
    </fo:layout-master-set>
    <fo:page-sequence>
        <fo:flow>
        ...
        </fo:flow>
        ...
    </fo:page-sequence>
    ...
</fo:root>

All'interno di fo:layout-master-set si collocano gli elementi che descrivono le caratteristiche delle pagine. Nella situazione più semplice si usano elementi fo:simple-page-master, all'interno dei quali si definiscono delle «regioni»:

<fo:simple-page-master
    master-name="nome_tipo_impaginazione"
    [page-height="altezza_pagina"]
    [page-width="ampiezza_pagina"]
    [writing-mode="direzione"]
    [space-before="spazio_prima"]
    [space-after="spazio_dopo"]
    [start-indent="rientro_iniziale"]
    [end-indent="rientro_finale"]
    [altri_attributi]>

    regioni

</fo:simple-page-master>

Il significato degli attributi mostrati nello schema è abbastanza intuitivo (in modo particolare il problema dei margini delle scatole è già stato descritto nel capitolo 452), a parte l'attributo obbligatorio master-name, che ha lo scopo di dare un nome al tipo di impaginazione che viene dichiarato in quel contesto. Successivamente, quando si descrivono le componenti del corpo della pagina, viene fatto riferimento a questo nome per richiamare il tipo di impaginazione desiderato.

All'interno dei margini fissati con gli attributi appropriati dell'elemento fo:simple-page-master si collocano delle regioni, dichiarate attraverso gli elementi fo:region-before, fo:region-after, fo:region-start, fo:region-end e fo:region-body.

Figura 454.2. Regioni all'interno dei margini di una pagina.

magini nelle scatole XSL-FO

Guardando la figura 454.2, che rappresenta lo spazio interno ai margini di una pagina, si deve osservare che la scatola definita dall'elemento fo:region-body contiene, sovrapposte, le altre quattro regioni. Inoltre, è importante osservare i nomi delle regioni, che rappresentano una collocazione relativa alla direzione della scrittura; per esempio, con una scrittura che procede dal basso verso l'altro, si scambiano di posto le regioni fo:region-before e fo:region-after rispetto alla figura; inoltre, una scrittura che procede da destra verso sinistra fa sì che si scambi la collocazione delle regioni dichiarate dagli elementi fo:region-start e fo:region-end.

<fo:region-body
    [space-before="spazio_prima"]
    [space-after="spazio_dopo"]
    [start-indent="rientro_iniziale"]
    [end-indent="rientro_finale"]
    [writing-mode="direzione"]
    [reference-orientation="rotazione"]
    [altri_attributi] />
<fo:region-{before|after|start|end}
    extent="dimensione"
    [writing-mode="direzione"]
    [reference-orientation="rotazione"]
    [altri_attributi] />

Gli elementi che dichiarano le regioni sono vuoti. A esclusione dell'elemento fo:region-body, gli altri hanno tutti un attributo obbligatorio che ne definisce l'estensione (l'ampiezza per fo:region-start e fo:region-end; l'altezza per fo:region-before e fo:region-after).

Nei modelli sintattici mostrati appare un attributo che non è ancora stato preso in considerazione: reference-orientation. Con questo è possibile fa ruotare il contenuto, in multipli di 90 gradi, cosa che può risultare particolarmente utile per il contenuto delle regioni laterali.

Si comprende intuitivamente il significato di queste regioni che si trovano ai bordi del corpo della pagina: consentono di inserire delle intestazioni, dei piè di pagina, delle note a margine e simili. Ciò che è importante è rendersi conto che l'area che descrivono si sovrappone al corpo della pagina; pertanto, solitamente il contenuto che si va a inserire nel corpo viene controllato da margini ulteriori.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fo:root SYSTEM "fo.dtd">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <fo:layout-master-set>
        <fo:simple-page-master
                master-name="normale"
                page-width="210mm"
                page-height="297mm"
                margin-top="2cm"
                margin-bottom="2cm"
                margin-left="2cm"
                margin-right="2cm">
            <fo:region-body   margin-top="1cm" margin-bottom="1cm"/>
            <fo:region-before extent="1cm" />
            <fo:region-after  extent="1cm" />
        </fo:simple-page-master>
        ...
    </fo:layout-master-set>
    <fo:page-sequence>
        ...
    </fo:page-sequence>
    ...
</fo:root>

L'esempio che appare sopra mostra l'uso di un elemento fo:simple-page-master, con il quale si dichiara un tipo di impaginazione denominato normale, con le dimensioni di un foglio A4 (21 cm × 29,7 cm), con margini uguali di 2 cm, all'interno dei quali si trova un corpo, che a sua volta ha margini superiori e inferiori, pari all'estensione delle regioni rispettive.

Per riempire effettivamente le pagine di contenuti, occorre intervenire all'interno di elementi fo:page-sequence, con cui si fa riferimento al tipo di impaginazione che si vuole usare:

<fo:page-sequence
    master-reference="nome_tipo_impaginazione"
    [initial-page-number="numero_iniziale"]
    [force-page-count="auto"|"odd"|"even"|altro]
    [country="nazionalità_iso_3166"]
    [language="lingua_iso_639"]
    [altri_attributi]>

    contenuti

</fo:page-sequence>

Dal modello sintattico si vede che il riferimento al tipo di impaginazione si ottiene con l'attributo master-reference, che pertanto è obbligatorio. Sono inoltre da considerare gli attributi initial-number e force-page-count: il primo consente di stabilire il numero di pagina iniziale e il secondo permette di stabilire se il gruppo di pagine in questione deve essere complessivamente dispari, pari o se debbano essere rispettate altre regole.

Gli attributi country e language, nell'insieme servono a definire le caratteristiche locali del testo, stabilendo la nazionalità e il linguaggio. Formalmente, le sigle che si utilizzano per questo sono quelle definite nel documento RFC 1766, che in pratica corrisponde agli standard ISO 3166 (sezione 105) e ISO 639 (sezione 104).

Un elemento fo:page-sequence contiene necessariamente l'elemento fo:flow (uno solo), che a sua volta contiene ciò che viene distribuito nelle pagine (di solito il testo), come se fosse un flusso di informazioni. L'elemento fo:flow deve dichiarare, attraverso l'attributo flow-name, in quale regione della pagina si inserisce il flusso in questione:

<fo:flow
    flow-name="xsl-region-{body|before|after|start|end}"

    flusso

</fo:flow>

L'esempio seguente riprende quanto già presentato a proposito della dichiarazione del tipo di impaginazione, associato a un flusso che riguarda il corpo della pagina stessa:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fo:root SYSTEM "fo.dtd">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <fo:layout-master-set>
        <fo:simple-page-master
                master-name="normale"
                page-width="210mm"
                page-height="297mm"
                margin-top="2cm"
                margin-bottom="2cm"
                margin-left="2cm"
                margin-right="2cm">
            <fo:region-body   margin-top="1cm" margin-bottom="1cm"/>
            <fo:region-before extent="1cm" />
            <fo:region-after  extent="1cm" />
        </fo:simple-page-master>
    </fo:layout-master-set>
    <fo:page-sequence
            master-reference="normale"
            initial-page-number="1"
            force-page-count="even"
            language="it"
            country="it">
        <fo:flow flow-name="xsl-region-body">
            <fo:block>
                Bla bla bla Bla bla bla bla bla bla bla bla bla bla bla
                bla bla bla bla bla bla bla bla bla bla bla bla bla bla
                bla bla bla bla bla bla bla bla bla bla bla bla bla bla
                bla bla bla bla bla.
            </fo:block>
            <fo:block>
                Bla bla bla Bla bla bla bla bla bla bla bla bla bla bla
                bla bla bla bla bla bla bla bla bla bla bla bla bla bla
                bla bla bla bla bla bla bla bla bla bla bla bla bla bla
                bla bla bla bla bla.
            </fo:block>
        </fo:flow>
    </fo:page-sequence>
</fo:root>

Quello che si ottiene dalla trasformazione di questo file XSL-FO sono due pagine (l'ultima è bianca) che contengono il testo che si può vedere, suddiviso in due capoversi. Si può osservare che il margine superiore è di 3 cm, perché 2 cm definiti dall'impaginazione si sommano al margine del corpo della pagina.

Le pagine ottenute sono due perché è stato richiesto espressamente di impiegare una quantità pari (even) di pagine con l'attributo force-page-content dell'elemento fo:page-sequence.

Se si tralasciano gli attributi, la sintassi completa di fo:page-sequence corrisponde al modello seguente:

<fo:page-sequence attributi>
    [<fo:title attributi>
        titolo
    </fo:title>]
    [<fo:static-content flow-name="regione">
        contenuto_statico
    </fo:static-content>]
    ...
    <fo:flow flow-name="regione">
        flusso
    </fo:flow>
</fo:page-sequence>

L'elemento fo:title consente di attribuire un titolo, che non fa parte, necessariamente, del risultato della composizione. Gli elementi fo:static-content si comportano in modo simile a fo:flow, per quanto riguarda la selezione della regione di competenza, ma servono per definire del testo che si vuole appaia su tutte le pagine (come può essere per una riga di intestazione o alla base della pagina).

L'esempio seguente espande quanto già visto in quello precedente, aggiungendo un'intestazione e una riga a piè pagina, dove, in particolare, viene collocato anche il numero della pagina. Ovviamente, per poter apprezzare il fatto che l'intestazione e il piè di pagina rimangono costanti, occorre mettere qualcosa di più nel corpo:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fo:root SYSTEM "fo.dtd">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <fo:layout-master-set>
        <fo:simple-page-master
                master-name="normale"
                page-width="210mm"
                page-height="297mm"
                margin-top="2cm"
                margin-bottom="2cm"
                margin-left="2cm"
                margin-right="2cm">
            <fo:region-body   margin-top="1cm" margin-bottom="1cm"/>
            <fo:region-before extent="1cm" />
            <fo:region-after  extent="1cm" />
        </fo:simple-page-master>
    </fo:layout-master-set>
    <fo:page-sequence
            master-reference="normale"
            initial-page-number="1"
            force-page-count="even"
            language="it"
            country="it">
        <fo:static-content flow-name="xsl-region-before">
            <fo:block>
                Un esempio per cominciare.
            </fo:block>
        </fo:static-content>
        <fo:static-content flow-name="xsl-region-after">
            <fo:block>
                pagina <fo:page-number />
            </fo:block>
        </fo:static-content>
        <fo:flow flow-name="xsl-region-body">
            <fo:block>
                Bla bla bla Bla bla bla bla bla bla bla bla bla bla bla
                bla bla bla bla bla bla bla bla bla bla bla bla bla bla
                bla bla bla bla bla bla bla bla bla bla bla bla bla bla
                bla bla bla bla bla.
            </fo:block>
            <!-- Inserire qui altri fo:block per ottenere più pagine -->
            <fo:block>
                Bla bla bla Bla bla bla bla bla bla bla bla bla bla bla
                bla bla bla bla bla bla bla bla bla bla bla bla bla bla
                bla bla bla bla bla bla bla bla bla bla bla bla bla bla
                bla bla bla bla bla.
            </fo:block>
        </fo:flow>
    </fo:page-sequence>
</fo:root>

Si osservi che gli esempi devono essere salvati in file con codifica UTF-8, altrimenti diventa indispensabile usare delle entità che facciano riferimento al punto di codifica, quando si usano simboli al di sopra di U+007F. Pertanto, se necessario, anche il commento va scritto nel modo corretto, per non creare problemi al programma che lo elabora:

            <!-- Inserire qui altri fo:block per ottenere pi&#x00F9; pagine -->

Oppure:

            <!-- Inserire qui altri fo:block per ottenere piu` pagine -->

Figura 454.8. L'aspetto di una pagina ottenuta dalla composizione dell'esempio. Si osservi che i caratteri sono stati ingranditi rispetto a quanto si otterrebbe normalmente, considerando le proporzioni.

esempio-002.fo

454.2   Impaginazione più articolata

Nella sezione precedente è stata mostrata la possibilità di richiedere espressamente una quantità pari o dispari di pagine per una certa sequenza di pagine. Tuttavia questo non basta per controllare l'estetica di un bel libro, perché di solito si vuole che le pagine cambino impostazione in modo automatico all'inizio di un capitolo. Per raggiungere risultati come questo, al posto di usare l'elemento fo:simple-page-master, si usa piuttosto fo:page-sequence-master, che però si avvale in pratica delle dichiarazioni di altri elementi fo:simple-page-master:

<fo:page-sequence-master master-name="nome_tipo_impaginazione">
    [<fo:single-page-master-reference master-reference=nome_tipo_impaginazione />]
    [<fo:repeatable-page-master-reference
        master-reference=nome_tipo_impaginazione
        [maximum-repeat=max_ripetizioni] />]
    [<fo:repeatable-page-master-alternatives
        [maximum-repeat=max_ripetizioni]>
        <fo:conditional-page-master-reference
            master-reference="nome_tipo_impaginazione"
            page-position="posizione"
            [altri_attributi] />
        ...
    </fo:repeatable-page-master-alternatives>]
    ...
</fo:page-sequence-master>

Inizialmente, l'insieme è piuttosto complesso. L'elemento più esterno, fo:page-sequence-master definisce un tipo di impaginazione a cui in seguito è possibile fare riferimento. All'interno di questo elemento possono apparire tre tipi di elementi, anche ripetutamente, con lo scopo di descrivere in sequenza i tipi di pagina da usare.

L'elemento fo:single-page-master-reference, che si riferisce a un certo tipo di pagina in base all'attributo master-reference, stabilisce che deve apparire una sola pagina con quelle caratteristiche. L'elemento fo:repeatable-page-master-reference stabilisce di utilizzare un certo tipo di pagina, attraverso l'attributo master-reference, per una quantità imprecisata di pagine (salvo l'uso dell'attributo maximum-repeat. Si osservi l'esempio seguente:

      1 <?xml version="1.0" encoding="UTF-8"?>
      2 <!DOCTYPE fo:root SYSTEM "fo.dtd">
      3 <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
      4     <fo:layout-master-set>
      5         <fo:simple-page-master
      6                 master-name="normale"
      7                 page-width="210mm"
      8                 page-height="297mm"
      9                 margin-top="2cm"
     10                 margin-bottom="2cm"
     11                 margin-left="2cm"
     12                 margin-right="2cm">
     13             <fo:region-body   margin-top="1cm" margin-bottom="1cm"/>
     14             <fo:region-before extent="1cm" />
     15             <fo:region-after  extent="1cm" />
     16         </fo:simple-page-master>
     17         <fo:simple-page-master
     18                 master-name="speciale"
     19                 page-width="210mm"
     20                 page-height="297mm"
     21                 margin-top="2cm"
     22                 margin-bottom="2cm"
     23                 margin-left="2cm"
     24                 margin-right="2cm">
     25             <fo:region-body   margin-bottom="1cm"/>
     26             <fo:region-after  extent="1cm" />
     27         </fo:simple-page-master>
     28         <fo:page-sequence-master master-name="capitolo">
     29             <fo:single-page-master-reference master-reference="speciale" />
     30             <fo:repeatable-page-master-reference master-reference="normale" />
     31         </fo:page-sequence-master>
     32     </fo:layout-master-set>
     33     <fo:page-sequence
     34             master-reference="capitolo"
     35             initial-page-number="1"
     36             force-page-count="even"
     37             language="it"
     38             country="it">
     39         <fo:static-content flow-name="xsl-region-before">
     40             <fo:block>
     41                 Un esempio per cominciare.
     42             </fo:block>
     43         </fo:static-content>
     44         <fo:static-content flow-name="xsl-region-after">
     45             <fo:block>
     46                 pagina <fo:page-number />
     47             </fo:block>
     48         </fo:static-content>
     49         <fo:flow flow-name="xsl-region-body">
     50             <fo:block>
     51                 Bla bla bla Bla bla bla bla bla bla bla bla bla bla bla
     52                 bla bla bla bla bla bla bla bla bla bla bla bla bla bla
     53                 bla bla bla bla bla bla bla bla bla bla bla bla bla bla
     54                 bla bla bla bla bla.
     55             </fo:block>
     56             <!-- Inserire qui altri fo:block per ottenere più pagine -->
     57             <fo:block>
     58                 Bla bla bla Bla bla bla bla bla bla bla bla bla bla bla
     59                 bla bla bla bla bla bla bla bla bla bla bla bla bla bla
     60                 bla bla bla bla bla bla bla bla bla bla bla bla bla bla
     61                 bla bla bla bla bla.
     62             </fo:block>
     63         </fo:flow>
     64     </fo:page-sequence>
     65 </fo:root>

Questa volta vengono dichiarati due tipi di impaginazione «semplice»; una denominata normale, l'altra denominata speciale (righe da 5 a 27). La differenza tra i due tipi di impaginazione sta nell'assenza, nel secondo caso, della regione superiore, con la conseguente assenza del margine superiore nel corpo. In questo modo, si vuole fare sì che un capitolo utilizzi come prima pagina questo secondo tipo di impaginazione, senza usare la riga di intestazione. Pertanto, si definisce un tipo di impaginazione più complesso, denominato proprio capitolo, che prevede come prima pagina l'impaginazione speciale e come pagine successive l'impaginazione normale. Per quanto riguarda l'elemento fo:page-sequence nulla è cambiato rispetto all'esempio precedente.

Figura 454.10. L'aspetto delle prime due pagine ottenute dalla composizione dell'esempio. Si osservi che i caratteri sono stati ingranditi rispetto a quanto si otterrebbe normalmente, considerando le proporzioni.

esempio-003.fo esempio-003.fo

Per ottenere effetti più complessi si può usare l'elemento fo:repeatable-page-master-alternatives, che contiene necessariamente elementi fo:conditional-page-master-reference:

<fo:repeatable-page-master-alternatives
        [maximum-repeat=max_ripetizioni]>
    <fo:conditional-page-master-reference
        master-reference="nome_tipo_impaginazione"
        page-position="first"|"last"|"rest"|"any"
        [altri_attributi] />
    ...
</fo:repeatable-page-master-alternatives>

In pratica, attraverso gli elementi conditional-page-master-reference si vanno a individuare dei sottogruppi di pagine in base a una condizione. La sintassi mostra la selezione più semplice, attraverso l'attributo page-position, con il quale si può individuare la prima pagina, l'ultima, le pagine successive alla prima oppure qualunque pagina. Tuttavia sono disponibili altri attributi per condizioni più sofisticate, che qui non vengono descritti. L'esempio seguente svolge lo stesso lavoro di quello precedente, con l'uso di queste selezioni condizionali:

      1 <?xml version="1.0" encoding="UTF-8"?>
      2 <!DOCTYPE fo:root SYSTEM "fo.dtd">
      3 <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
      4     <fo:layout-master-set>
      5         <fo:simple-page-master
      6                 master-name="normale"
      7                 page-width="210mm"
      8                 page-height="297mm"
      9                 margin-top="2cm"
     10                 margin-bottom="2cm"
     11                 margin-left="2cm"
     12                 margin-right="2cm">
     13             <fo:region-body   margin-top="1cm" margin-bottom="1cm"/>
     14             <fo:region-before extent="1cm" />
     15             <fo:region-after  extent="1cm" />
     16         </fo:simple-page-master>
     17         <fo:simple-page-master
     18                 master-name="speciale"
     19                 page-width="210mm"
     20                 page-height="297mm"
     21                 margin-top="2cm"
     22                 margin-bottom="2cm"
     23                 margin-left="2cm"
     24                 margin-right="2cm">
     25             <fo:region-body   margin-bottom="1cm"/>
     26             <fo:region-after  extent="1cm" />
     27         </fo:simple-page-master>
     28         <fo:page-sequence-master master-name="capitolo">
     29             <fo:repeatable-page-master-alternatives>
     30                 <fo:conditional-page-master-reference
     31                     master-reference="speciale"
     32                     page-position="first" />
     33                 <fo:conditional-page-master-reference
     34                     master-reference="normale"
     35                     page-position="rest" />
     36             </fo:repeatable-page-master-alternatives>
     37         </fo:page-sequence-master>
     38     </fo:layout-master-set>
     39     <fo:page-sequence
     40             master-reference="capitolo"
     41             initial-page-number="1"
     42             force-page-count="even"
     43             language="it"
     44             country="it">
     45         <fo:static-content flow-name="xsl-region-before">
     46             <fo:block>
     47                 Un esempio per cominciare.
     48             </fo:block>
     49         </fo:static-content>
     50         <fo:static-content flow-name="xsl-region-after">
     51             <fo:block>
     52                 pagina <fo:page-number />
     53             </fo:block>
     54         </fo:static-content>
     55         <fo:flow flow-name="xsl-region-body">
     56             <fo:block>
     57                 Bla bla bla Bla bla bla bla bla bla bla bla bla bla bla
     58                 bla bla bla bla bla bla bla bla bla bla bla bla bla bla
     59                 bla bla bla bla bla bla bla bla bla bla bla bla bla bla
     60                 bla bla bla bla bla.
     61             </fo:block>
     62             <!-- Inserire qui altri fo:block per ottenere più pagine -->
     63             <fo:block>
     64                 Bla bla bla Bla bla bla bla bla bla bla bla bla bla bla
     65                 bla bla bla bla bla bla bla bla bla bla bla bla bla bla
     66                 bla bla bla bla bla bla bla bla bla bla bla bla bla bla
     67                 bla bla bla bla bla.
     68             </fo:block>
     69         </fo:flow>
     70     </fo:page-sequence>
     71 </fo:root>

La differenza rispetto all'esempio precedente si trova precisamente nelle righe da 29 a 36.

454.3   Contenuto

A proposito del contenuto del documento, è già stato mostrato l'uso e la struttura successiva all'elemento fo:page-sequence:

<fo:page-sequence
        master-reference="nome_tipo_impaginazione"
        [initial-page-number="numero_iniziale"]
        [force-page-count="auto"|"odd"|"even"|altro]
        [country="nazionalità_iso_3166"]
        [language="lingua_iso_639"]
        [altri_attributi]>
    [<fo:title attributi>
        titolo
    </fo:title>]
    [<fo:static-content flow-name="regione">
        contenuto_statico
    </fo:static-content>]
    ...
    <fo:flow flow-name="regione">
        flusso
    </fo:flow>
</fo:page-sequence>

L'elemento fo:page-sequence rappresenta letteralmente una sequenza di pagine, come potrebbe essere un capitolo o una parte di un libro, dove, tra le altre cose, può essere utile ripartire con una nuova numerazione delle pagine. Pertanto, un documento può avere più elementi fo:page-sequence distinti.

Gli elementi fo:flow, o fo:static-content, rappresentano in pratica la destinazione del contenuto, che va inserito nella regione appropriata. Questi elementi possono contenere dei «blocchi», o più precisamente elementi fo:block, fo:block-container, fo:list-block, fo:table, fo:table-and-caption.

L'elemento fo:block ha la particolarità di contenere sia testo lineare, sia altri blocchi (quindi anche se stesso). Pertanto viene usato indifferentemente come un equivalente dell'elemento DIV o dell'elemento P di HTML.

454.4   Riferimenti

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome xsl_fo_impaginazione.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico]

Valid ISO-HTML!

CSS validator!