Sommaire automatique

Ce plugin repère les intertitres des textes de vos articles et s’en sert pour génèrer un sommaire. Ce dernier peut être inséré automatiquement au début de chaque article, ou utilisé dans les squelettes pour générer un sommaire sur n’importe quel autre contenu.

Il est une alternative au plugin Table des Matières ainsi qu’à la lame Un sommaire pour vos articles du plugin Couteau Suisse.

Configuration

Après l’installation, il convient de configurer le mode de fonctionnement du plugin parmi les trois possibles :

  • Insertion automatique sur tous les articles : le sommaire sera calculé et affiché en début de chaque article, sauf si il contient une seule entrée
  • Insertion dans le texte des articles à la demande : le sommaire sera ajouté uniquement en présence du raccourci <sommaire> dans le texte de l’article
  • Aucune insertion dans le texte des articles : le plugin ne fera aucune insertion automatique. Cette configuration est utile si vous voulez gérer l’affichage du sommaire directement dans le squelette

Fonctionnement

Le plugin commence par repérer tous les intertitres du texte. Il intervient après transformation des raccourcis SPIP et reconnaît ainsi tous les types d’intertitre :

  • ceux obtenus par le raccourci {{{   }}} de SPIP ;
  • ceux obtenus par un raccourci spécial d’un plugin qui permet de générer des niveaux intermédiaires d’intertitre
  • les intertitres directement saisis en HTML comme <h4>

Pour chaque intertitre :

  • une ancre est calculée à partir de son texte, sur le même principe que pour le calcul des URLs (suppression des accents et caractères exotiques, remplacement des espaces par des tirets, et coupe si trop long) ;
  • le niveau de l’intertitre est mémorisé ;
  • un lien de retour vers le sommaire est ajouté.

Un sommaire est alors automatiquement construit à partir du modèle modeles/sommaire.html auquel est fournie la liste des intertitres. Par défaut cela génère un sommaire sous la forme d’une liste de liens hiérarchisés, reproduisant la hiérarchie des intertitres.

Pour les Rédacteurs

Si le fonctionnement automatique ou semi-automatique du plugin est retenu, les rédacteurs peuvent indiquer à quel endroit insérer le sommaire au moyen du raccourci <!--inserer_sommaire-->.

Il est possible de préciser le niveau max : <sommaire|niveau_max=2>.

Pour faciliter la migration depuis l’outil du Couteau Suisse, le raccourci [sommaire] est aussi pris en charge, mais son utilisation est déconseillée car ce raccourci apparaitra dans vos textes si vous désactivez le plugin, au contraire du premier.

Pour les Webmestres

Le plugin fournit aussi des filtres et une balise pour mieux contrôler l’affichage du sommaire, ou le contenu sur lequel il s’applique. Cela concerne le cas où vous avez sélectionné le mode manuel du plugin, mais cela peut aussi concerner certains cas particuliers de pages pour lesquelles vous voulez désactiver le sommaire automatique, ou si vous voulez générer un sommaire sur un autre contenu.

Filtre |retire_sommaire

Ce filtre permet de retirer un sommaire généré automatiquement sur un texte d’article. Les ancres sur les intertitres et les liens de retour au sommaire seront laissés intacts. Ce filtre est donc utile sur une page donnée où l’on veut afficher le sommaire à un autre endroit de la page.

Exemple d’utilisation :

<BOUCLE_art(ARTICLES){id_article}>
[(#TEXTE|retire_sommaire)]
</BOUCLE_art>

Filtre |retire_ancres_sommaire

Ce filtre permet de retirer les ancres, les liens de retour au sommaire et le sommaire générés automatiquement sur un texte d’article.
Il est utile pour retirer complètement sur une page particulière le sommaire généré automatiquement.
Exemple d’utilisation :

<BOUCLE_art(ARTICLES){id_article}>
[(#TEXTE|retire_ancres_sommaire)]
</BOUCLE_art>

Balise #SOMMAIRE

La balise sert à afficher le sommaire d’un texte qu’on lui fournit en argument :

<BOUCLE_art(ARTICLES){id_article}>
#SOMMAIRE{#TEXTE}
</BOUCLE_art>

Elle peut servir à afficher le sommaire à un endroit particulier du texte de l’article, mais aussi à générer un sommaire pour un texte d’un autre objet, ou de plusieurs champs concaténés :

<BOUCLE_art(ARTICLES){id_article}>
[(#SOMMAIRE{[#CHAPO (#TEXTE) #PS]}
</BOUCLE_art>

Dans ce dernier cas, il conviendra d’utiliser le filtre qui suit sur chaque champ lors de son affichage.

Filtre |ancres_sommaire

Ce filtre permet d’ajouter les ancres et les liens de retour au sommaire sur les intertitres. Il est complémentaires de la balise #SOMMAIRE précédente. À noter que si un sommaire automatique avait été généré il est supprimé par le filtre.

Exemple d’utilisation où l’on affiche le sommaire calculé à partir du chapeau, du texte et du post-scriptum, ainsi que chacun de ces champs :

<BOUCLE_art(ARTICLES){id_article}>
[(#SOMMAIRE{[#CHAPO (#TEXTE) #PS]}
[(#CHAPO|ancres_sommaire)]
[(#TEXTE|ancres_sommaire)]
[(#PS|ancres_sommaire)]
</BOUCLE_art>

Filtre |sommaire_propre

Le sommaire n’est calculé automatiquement que sur le texte des articles.
Ce filtre permet de générer le sommaire de n’importe quelle balise de texte qui contient un <sommaire> mais il doit être appliqué à la place du filtre propre.

Exemple pour générer un sommaire sur une rubrique (ou autre objet) :

[<div class="texte #EDIT{texte}">(#TEXTE*|sommaire_propre)</div>]

Personnalisation

Le plugin ajoute la feuille de style css/sommaire.css dans le site public. Vous pouvez la copier dans un sous-répertoire css/ de votre dossier squelettes/ et la modifier pour personaliser l’apparence du sommaire ou des liens de retour.

Le sommaire est calculé à partir du modèle modeles/sommaire.html. Vous pouvez aussi le copier dans votre dossier squelettes/ et le modifier. Vous pouvez notamment choisir d’afficher tous les liens vers les intertitres sur un seul niveau, ou n’afficher que les liens de premier niveau, modifier la structure HTML du bloc etc.

updated on 22 April 2020

Discussion

13 discussions

  • 2

    Hello

    Ce qui serait un plus serait de pouvoir activer l’insertion automatique sur tous les articles mais avoir la possibilité de ne pas l’afficher pour un article précis en rajoutant un raccourci dans le texte de l’article.

    En tout cas j’aimerais bien !

    • Hello

      Autre remarque ; si on choisit de n’afficher qu’un niveau d’intertitre dans le sommaire, les intertitres de niveau 2 ou 3 reçoivent quand même une image avec un lien de retour, ce qui ne me parait pas très cohérent.

      Et tant que j’y suis : le retour se fait au niveau de l’intertitre dans le sommaire.
      Comment faire pour que le retour se fasse sur le haut du sommaire, quelque soit l’intertitre d’où on vient ?

    • De plus, pour ma première remarque du message précédent, l’icône de retour vers le sommaire est inactif pour les intertitres de niveau 2. Donc autant ne pas l’afficher.

    Reply to this message

  • Bonjour,

    nous utilisons le plugin Sommaire et cela est rûdement utile pour strucurer un long texte, donc avant tout merci aux dev!

    Un conflit apparait cependant lorsqu’on utilise ce plugin avec le plugin oEmbed : les titres des articles intégrés avec oEmbed sont detectés comme des titres de chapitre et sont inclus, à tort, dans le sommaire. Voir par exemple tout en bas de cette page

    NB : j’ai testé également la balise <sommaire|sommaire_propre>, le résultat est identique

    Bien à vous

    Reply to this message

  • Bonsoir,
    J’ai tenté d’appliquer un effet dépliant sur le titre du bloc “SOMMAIRE” avec le plugin https://contrib.spip.net/Accordion-JQuery
    Cela fonctionne si le sommaire est appliqué manuellement via <sommaire> inséré dans le texte d’un article.
    Mais lorsque le sommaire est inséré automatiquement via un modèle les liens depuis le sommaire vers les h3 du texte ne fonctionnent pas (les URLS sont corrects mais ne mènent nul part ; il doit y avoir une interférence javascript).

    Reply to this message

  • Je viens de tomber sur un truc curieux... Ce plugin installé et configuré pour insérer automatiquement le sommaire (je pense que ce sera pareil avec la balise mais pas encore vérifié) et le plugin Alias d’articles aussi. Je fais donc un alias et je découvre que le sommaire est dupliqué...

    Reply to this message

  • 6

    Petit bug
    -  si on utilise <sommaire> le sommaire est bien inséré là où l’appel est fait
    -  si on utilise <sommaire|>, le sommaire est systématiquement mis en début de texte

    • Sauf qu’`a la lecture de la présente page, rien n’indique que cette syntaxe est supportée et qu’elle est supposée se comporter autrement :-/

    • c’est un modèle, donc normalement un modèle est censé avoir la syntaxe <modele|> (notamment si on veut ajouter des paramètres). En fait le plus étonnant c’est la syntaxe <sommaire> qui est pas standard dans SPIP.

      Par contre oui le fonctionnement autre est étrange.

    • ajoutons que <sommaire|niveau_max=X> non documenté mais existant dans le code. Mais par contre bug de placement.

    • Arf bien vu ..pour la syntaxe officielle des modules et bravo pour le paramètre non documenté (du coup tu as levé deux fonctionnalités cachées ...ou un bogue et un manque dans la doc)

      Affaire à suivre

    • Glop,

      Le bug devrait être corrigé, explication dans le message de commit
      Tldr : <sommaire> n’est effectivement pas un raccourci standard de modèle, alors que <sommaire|truc> si, ce qui provoquait 2 traitements différents.

      La gestion de la profondeur pourrait être ajoutée dans l’article effectivement, cf. commit

    • Merci :). J’ai ajouté dans l’article sur la profondeur.

    Reply to this message

  • 1

    Salut,

    merci pour ce plugin bien pratique. Un petit souci à l’installation: on a un modèle “lien” qui utilise des h4. On voudrait que ces h4 n’apparaissent pas dans les sommaires, mais on n’arrive pas à les virer. Apparemment il est prévu de pouvoir éviter le traitement de certaines balises dans sommaire_fonctions.php, mais c’est pas évident de comprendre ce qu’il faut modifier / surcharger.

    function sommaire_filtre_texte_echappe($texte, $filtre, $balises = 'lien', $args = null) {
            if (!strlen($texte)) {
                    return '';
            }

    ne suffit pas en tout cas. Une piste ? Ca pourrait être chouette de pouvoir exclure des balises / modèles dans la page de configuration, ou d’avoir un filtre à appliquer sur la balise h4 concernée.

    • Profondeur non prise en compte pour les ancres du texte
      Merci pour ce chouette plugin. Je me demande si il n’y a pas une petite incohérence dans le fonctionnement du plugin concernant la prise en compte du niveau de profondeur.
      Soit un texte contenant des h3 et des h4. Si on choisit dans le panneau de configuration du plugin une profondeur de 1,
      -  seuls les h3 sont pris en compte dans le sommaire, les ancres correspondantes et les boutons “retour au sommaire” sont présents : c’est OK
      -  les h4 présents dans le texte sont traités par le plugin : une ancre et un bouton “retour au sommaire” (qui pointe vers une ancre qui n’existe pas) sont créés. Il me semble que ça ne devrait pas dans le sens où on pourrait s’attendre à un comportement similaire bloc de sommaire / corps du texte. Enfin, j’ai l’impression que ce serait plus cohérent...

    Reply to this message

  • 2
    Spipmalion

    Bonjour,

    Comment faire pour que fonctionne sur le texte des mots-clés ?

    Merci !

    • Je viens de chercher pour utiliser un <sommaire> dans le texte des rubriques, en fait il faut simplement appliquer le filtre sommaire_propre sur le texte de l’objet :

      [<div class="texte #EDIT{texte}">(#TEXTE|sommaire_propre)</div>]

      Ça mériterait un petit ajout dans la doc.

    • Je rectifie, le filtre sommaire_propre doit être appliqué à la place du filtre propre, donc le code à utiliser est :

      [<div class="texte #EDIT{texte}">(#TEXTE*|sommaire_propre)</div>]

      J’ai mis à jour la doc.

    Reply to this message

  • Hello,

    Lorsque les URL arborescentes sont activées, les ancres générées par Spip (donc, aussi dee ce plugin ) pointent vers l’URL de base du site.

    Cela est dû à l’ajout de la balise “base href” dans le head
    Dans ce cas, les ancres générées par le plugin devraient donc pointer vers : #URL_SITE_SPIP/[ma_page]/#[mon_ancre]

    Reply to this message

  • Jaseur Boreal

    Bonjour Cédric,

    En utilisant la balise <sommaire> dans le champs texte d’un article,
    on observe que les titres des images d’un diaporama Cycle2 inclus dans l’article, apparaissent dans le sommaire en niveau 2.
    Exemple sur ce lien :

    Comment éviter ces apparitions ?

    merci des solutions.

    Reply to this message

  • 4
    Mathieu

    J’avais un souci où la balise #SOMMAIRE{#TEXTE} affichait le #TEXTE si (et seulement si) il n’avait pas de balise h* dans le #TEXTE.

    Je l’ai résolu en modifiant la fonction “sommaire_post_propre” :

    function sommaire_post_propre($texte, $ajoute=true, $sommaire_seul=false){
    
            if (strpos($texte, '<h')!==false)
                    $texte = sommaire_filtre_texte_echappe($texte,'sommaire_filtre','html|code|cadre
    |frame|script|acronym|cite',array($ajoute,$sommaire_seul));
            elseif($sommaire_seul)
                    return "";
    
            return $texte;
    }
    • Je viens de rencontrer le même bug et la correction que tu proposes Mathieu fonctionne. Merci !

    • Même problème. Ta solution fonctionne nickel.
      Il faudrait corriger le plugin.

    • la solution sans surcharger le plugin :

      [(#SOMMAIRE|oui) [(#SOMMAIRE{[#CHAPO (#TEXTE) #PS]})] ]
    • en fait ce que je disais juste ci-dessus ne se confirme pas... (que s’était-il passé ?)

    Reply to this message

Ajouter un commentaire

Who are you?
[Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom