Pas satisfait du tag j'ai commencé à coder le mien que je vous laisse à disposition.
le principe : je récupère toutes les balises <hn>blabla</hn> avec N compris entre 1 et 6, il faut impérativement qu'elles ne soient pas encombrée de quoi que ce soit : id, class, js pour être prises en compte
code valable :
<h2>blabla</h2>
code pas valable :
<h2 class='sous_titre'>blabla</h2>
code pas valable
<H2>blabla</H2>
Je récupère donc les différentes balises et génère un sommaire hiérarchisé avec des listes ul/li imbriquées pour respecter la hiérarchie.
Deux appels possibles :
{table_of_contents content="$content" action='sommaire'}
{table_of_contents content="$content"}
Le premier génère un sommaire, le second affiche votre {content} habituel en prenant soit d'effectuer 2/3 modif sur les balises Hn pour permettre aux liens du sommaires de pointer dessus (système d'ancres)
Le code pourrait être revu pour les besoins de chacun et clairement il n'est pas optimisé au mieux.. mais ça fonctionne.
Dans une UDT nommée table_of_contents claquer ce code
Code :
$text = $params['content'];
$idPattern = 'anchor_';
$i = 0;
$resultats = array();
if(isset($params['action']) && $params['action'] == "sommaire")
{
preg_match_all('#<h([1-6])[ ]*>([^<]*)</h[1-6]>#' , $text, $resultats);
$previous = 0;
$sommaire = "";
$niveau = 0;
$liopen = false;
foreach($resultats[1] as $resultat)
{
// Si on descend d'un cran)
if($previous < $resultat)
{
$sommaire .= '<ul>';
$niveau++;
} else if($previous > $resultat)
{
$sommaire .= '</ul>';
$sommaire .= '</li>';
$niveau--;
$liopen=false;
} else
{
if($liopen)
{
$sommaire .= '</li>';
$liopen=false;
}
}
$sommaire .= '<li><a href="'.$_SERVER['REQUEST_URI'].'#'.$idPattern.$i.'" >'.$resultats[2][$i].'</a>';
$previous = $resultat;
$liopen = true;
$i++;
}
if($liopen)
$sommaire .= '</li>';
while($niveau > 0)
{
$sommaire .= '</ul>';
if($niveau > 1)
$sommaire .= '</li>';
$niveau--;
}
return $sommaire;
} else
{
$search = array('<pre>', '<code>');
$replace = array('<pre class="brush: php">', '<code class="exec">');
//On ajoute les classes aux balises
$text = str_replace ($search , $replace , $text);
$resultats_ids = array();
preg_match_all('#<h([1-6])[ ]*>([^<]*)</h[1-6]>#' , $text, $resultats);
foreach($resultats[1] as $resultat)
{
$resultats_ids[] = '<h'.$resultat.' id="'.$idPattern.$i.'">'.$resultats[2][$i].'</h'.$resultat.'>';
$i++;
}
$text = str_replace ($resultats[0], $resultats_ids , $text);
return $text;
}
Vous pouvez retrouver le rendu sur cette page :
http://mmmfs.furie.be/fr/exercices/exo-02-entite