Salut tout le monde, Je suis en train de m'arracher les cheveux sur la recherche du forum pour remettre la main sur un message d'un membre qui avait pondu un petit bout de code capable de parser le {content} d'un gabarit pour extraire les balises <h1><h2>....<h6>
et créer à la volée une table des matières (+ lien?).
un peu comme sur ce site (fait avec dokuwiki) :
http://www.furie.be/wiki/doku.php?id=downcnt
ça parle à quelqu'un ?
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
tiens tiens!
dans le wiki, ça serait pas mal ça, non?
ouais mais j'ai pas assez testé le code et pour exemple je viens juste de rendre mon code valide Xhtml sur mon site d'exemple (2h que je suis dessus) et je n'ai pourtant que 2 niveaux de profondeur de géré.
C'est assez galère de pondre un algo capable de descendre et remonter les niveaux en ouvrant et fermant les balises <ul><li> là ou il faut :/
J'ai modifié le code dans le premier post
Comme quoi, CMSMS mène à tout
bess a écrit :Vous pouvez retrouver le rendu sur cette page : http://mmmfs.furie.be/fr/exercices/exo-02-entite
oups ! => Syntax Error in template "747f77658f14250b2feee72c1351f3808db013b8" on line 5 "{Exo02Entite exo=1}" unknown tag "Exo02Entite"
ouais je sais pas si vous avez remarqué mais mon post date de Octobre 2011 ^^ alors oui, le site d'exemple est un peu en carafe depuis :/