CMS Made Simple Forums
https://forum.cmsmadesimple.org/

UDT - table_of_contents
https://forum.cmsmadesimple.org/viewtopic.php?f=36&t=23173
Page 1 of 1

Author:  osvaldo [ Tue Jun 24, 2008 8:25 am ]
Post subject:  UDT - table_of_contents

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:
/**
 * 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

Page 1 of 1 All times are UTC
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/