Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5

Recherche un tag/plugin/astuce/autre pour auto-générer un sommaire
#1

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 ?
Répondre
#2

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/...f_contents

je vous dit ce que ça donne Smile
Répondre
#3

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
Répondre
#4

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

{SEO}
Inscrivez-vous à notre Newsletter sur le site (colonne de droite, en bas).
Vous appréciez CMSMS et l'aide qui vous est fournie ici, aidez-nous en participant au projet.
Formation CMS Made Simple | Création de site CMS Made Simple.

C'est en se plantant qu'on devient cultivé.
J'ai un string dans l'Array (Paris Hilton)
Répondre
#5

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
Répondre
#6

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

Comme quoi, CMSMS mène à tout Cool

{SEO}
Inscrivez-vous à notre Newsletter sur le site (colonne de droite, en bas).
Vous appréciez CMSMS et l'aide qui vous est fournie ici, aidez-nous en participant au projet.
Formation CMS Made Simple | Création de site CMS Made Simple.

C'est en se plantant qu'on devient cultivé.
J'ai un string dans l'Array (Paris Hilton)
Répondre
#8

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"
Répondre
#9

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 :/
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 3 visiteur(s)