Ho implementato un UDT per ottenere la table-of-contents relativa al contenuto di una pagina modificando leggermente la versione originale dell'UDT presente in http://wiki.cmsmadesimple.org/index.php ... f_contents.
Le modifiche che ho apportato più che altro riguardano l'HTML generato in modo da inserire il tutto in un div e l'aggiunta di id e class per rendere il tutto modificabile facilmente via CSS...
Il tutto funziona piuttosto bene salvo la presenza di un difetto un po' noioso. La TOC la costruisco cercando tutti i tag di tipo Header, come nella versione originale dell'UDT, (il livello lo uso per indentare gli elementi nella TOC) che presentano la proprietà id impostata: il valore di id diventa l'anchor generato.
Il problema è che la regola espressa nella funzione preg_match_all() seleziona gli header che hanno id ma scarta tutti quelli che presentano altre proprietà impostate!!! Ad esempio:
pippo
viene considerata valida, mentre
pippo
viene scartata.
Ho provato a modificare la regola e il codice in modo da riconoscere questa forma, ma non sono molto pratico di PHP e meno ancora delle regole della funzione in questione. Al momento sono riuscito a ottenere il riconoscimento delle forme:
...
ma se id non è il primo e style subito il secondo o se ci sono altre prorpietà non funziona più niente!

Di seguito c'è il codice dell'UDT che sto usando ora... qualcuno può aiutarmi a trovare una regola che permetta al codice di funzionare e rilevare correttamente tutti i tag header che presentano id="..." in qualsiasi posizione questi si trovino?
Il problema è noioso perché uso FCKeditor e questo quando mi mostra la pagina in WYSIWYG mode altera l'ordine delle prorpietà nei tag! Non pretendo di poter inserire con in modo comodo la proprietà id (anche se sarebbe bello farlo con una dialog dall'editor direttamente senza passare a modificare il codice a mano...


Grazie a Tutti!
Osvaldo
p.s. Il codice dell'UDT:
function get_table_of_contents($page_contents, $header)
{
// Generate table of contents
preg_match_all("/(.*)/i", $page_contents, $match);
if (FALSE == empty($match[0])) {
$contents = "\n ".$header."\n";
foreach ($match[0] as $key => $value) {
if (2 == $match[1][$key]) {
$contents .= '';
} else {
$contents .= ' ';
}
$contents .= ''.$match[4][$key].'';
// Start a new sub-list if this item has children otherwise just end the list item
if (FALSE == empty($match[1][$key + 1]) && $match[1][$key + 1] == $match[1][$key] + 1) {
$contents .= "\n \n";
$unclosed_list = TRUE;
} else {
$contents .= "\n";
}
// If the next item is higher level then close this list item (I.E. current item is h3 and next is h2
if (FALSE == empty($match[1][$key + 1]) && $match[1][$key + 1] == $match[1][$key] - 1) {
$contents .= " \n\n";
$unclosed_list = FALSE;
}
}
if (FALSE == empty($unclosed_list)) {
$contents .= " \n\n";
}
$contents .= "\n";
} else {
$contents = '';
}
return $contents;
}
echo get_table_of_contents($params['thepagecontent'], $params['header']);