Forum CMS Made Simple FR
Recherche un tag/plugin/astuce/autre pour auto-générer un sommaire - Version imprimable

+- Forum CMS Made Simple FR (https://forum.cmsmadesimple.fr)
+-- Forum : Général (https://forum.cmsmadesimple.fr/forum-3.html)
+--- Forum : Modules, Tags (https://forum.cmsmadesimple.fr/forum-14.html)
+--- Sujet : Recherche un tag/plugin/astuce/autre pour auto-générer un sommaire (/thread-1547.html)



Recherche un tag/plugin/astuce/autre pour auto-générer un sommaire - bess - 28/10/2011

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 ?


Recherche un tag/plugin/astuce/autre pour auto-générer un sommaire - bess - 28/10/2011

comme à mon habitude, la création du topic provoque l'apparition de la solution comme cela d'un coup ....

http://wiki.cmsmadesimple.org/index.php/Share_your_tags_here#table_of_contents

je vous dit ce que ça donne Smile


Recherche un tag/plugin/astuce/autre pour auto-générer un sommaire - bess - 28/10/2011

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


Recherche un tag/plugin/astuce/autre pour auto-générer un sommaire - jissey - 28/10/2011

tiens tiens!
dans le wiki, ça serait pas mal ça, non?


Recherche un tag/plugin/astuce/autre pour auto-générer un sommaire - bess - 28/10/2011

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


Recherche un tag/plugin/astuce/autre pour auto-générer un sommaire - Jean le Chauve - 05/03/2013

Bravo Bess Smile
Autrement, il y a un tuto JQuery sur le site du zéro


Recherche un tag/plugin/astuce/autre pour auto-générer un sommaire - jissey - 05/03/2013

Comme quoi, CMSMS mène à tout Cool


Recherche un tag/plugin/astuce/autre pour auto-générer un sommaire - boullu - 05/03/2013

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"


Recherche un tag/plugin/astuce/autre pour auto-générer un sommaire - bess - 05/03/2013

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