UDT - table_of_contents

Sezione per discutere di Moduli/Plugin sviluppati dalla comunità italiana
Post Reply
osvaldo

UDT - table_of_contents

Post by osvaldo »

Genera un box (div) contenente un indice dei contenuti della pagina in base ai tag presenti nel contenuto ai quali sia stata impostata la proprietà id.
E' possibile specificare un testo che viene mostrato come titolo nel box (parametro header).
Il div generato ha id="toc", mentre l'elemento header ha classe "head" per poterli manipolare via CSS.

Code: Select all

/**
 * Genera un indice della pagina (Tabella dei Contenuti) a partire dai tag Header
 * definiti nella pagina stessa che presentano il parametro id
 * Ad Esempio: <h2 id="Titolo1">Titolo 1</h2>
 *
 * Uso:
 * {contents assign=pagecontent}
 * {table_of_contents thepagecontent="$pagecontent" header="Titolo"}
 */
function get_table_of_contents($page_contents, $header)
{
    // Genera l'Indice dei Contenuti (TOC=Table Of Contents)
    // cercando tutte le occorrenze dei tag <h> per le quali è stato definita la proprietà id
    // e restituisce un array 2D contenente, per ciascun, tag riconosciuto, il testo completo del tag,
    // il livello, il valore della proprietà ID e il testo racchiuso dal tag stesso.

    preg_match_all("/<h([[:digit:]]).* id=\"([a-z0-9]+).*>(.*)<\/[^>]+>/i", $page_contents, $match);


    if (FALSE == empty($match[0])) {
        
        // E' stato trovato almeno un tag valido!
        // Prepara l'inizio del contenitore xhtml per visualizzare il box col relativo titolo
        $contents  = "<div id=\"toc\"><ul>\n     <li class=\"head\">".$header."</li>\n";

        // Per ciascun tag trovato crea un entry nella TOC
        foreach ($match[0] as $key => $value) {

            // Indenta il codice generato per maggiore leggibilità
            if (2 == $match[1][$key]) {
                $contents .= '';
            } else {
                $contents .= '        ';
            }

            // Crea la voce nella TOC con associato il link all'elemento nella pagina
            $contents .= '<li><a href="'.$_SERVER['REQUEST_URI'].'#'.$match[2][$key].'">'.$match[3][$key].'</a>';

            // Se il livello è maggiore di quello precedente, crea una sotto-lista per rientrare le
            // le voci del livello inferiore
            if (FALSE == empty($match[1][$key + 1]) && $match[1][$key + 1] == $match[1][$key] + 1) {
                $contents .= "\n    <ul>\n";
                $unclosed_list = TRUE;
            } else {
                $contents .= "</li>\n";
            }

            // Se il prossimo elemento ha un livello maggiore, chiude questo livello della TOC
            // (Esempio: elemento corrente h3 e il prossimo è h2)
            if (FALSE == empty($match[1][$key + 1]) && $match[1][$key + 1] == $match[1][$key] - 1) {
                $contents .= "    </ul>\n</li>\n";
                $unclosed_list = FALSE;
            }
        }
        if (FALSE == empty($unclosed_list)) {
            $contents .= "    </ul>\n</li>\n";
        }
        $contents .= "</ul></div>\n";
    } else {
        $contents = '';
    }

    // Retituisce il codice che genera il box della TOC
    return $contents;
}
echo get_table_of_contents($params['thepagecontent'], $params['header']);
Osvaldo
Last edited by osvaldo on Wed Jul 02, 2008 1:17 pm, edited 1 time in total.
Post Reply

Return to “Moduli/Plugins”