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']);