Intertitres hiérarchiques

Intertitres pour le porte plume

Nativement la syntaxe SPIP ne propose qu’un seul niveau de titre. Le niveau de départ h2.spip est configurable depuis le fichier d’options xxx_options.php, en utilisant les variables de personnalisations :

$GLOBALS['debut_intertitre'] = "\n<h3 class=\"spip\">\n";
$GLOBALS['fin_intertitre'] = "</h3>\n";

Ce plugin ajoute au porte plume de spip la gestion de niveaux de titres supplémentaires, en prenant en compte le niveau de base configuré dans SPIP ou mes_options.php.

Le plugin reprend les syntaxes proposées par Enluminures typographiques et Intertitres hiérarchisés et table des matières :

  • soit {{{*** pour les intertitres simples de différents niveaux
  • {{{### pour les titres de type référence universitaire. Ex:1.1, 1.1.2.

Les icônes affichées dans le porte plume (barre typographique), reflète le niveau sémantique au sens HTLM pour sensibiliser le rédacteur à son plan de page, et s’adapte en fonction de la globale spip $debut_intertitre.

Différences avec les plugins Enluminures typographiques et Intertitres hiérarchisés et table des matières

  • Ce plugin utilise textwheel , ceci permettant entre autre :
    • de pouvoir surcharger les wheels déclarées pour un besoin spécifique,
    • tester et maintenir plus facilement les expressions/ étudiées/raccourcis traités.
    • utiliser les fonctionnalités de SPIP 3.
  • il ne gère que les titres et ne crée pas de sommaire.
  • une syntaxe additionnelle expérimentale permet d’ajouter des attributs aux titres (classes CSS, id spécifique, data-xx). Cette syntaxe est reprise de celle proposée par Markdown Extra.

Plugins compatibles

Etant donné que le plugin ne crée pas de sommaire, il est totalement compatible avec le plugin Sommaire automatique qui produit un sommaire de l’article.

Syntaxe & raccourcis

Il n’est plus possible (depuis la version 1.2.0) de mélanger dans un même article la syntaxe des titres et des références : ça n’a d’ailleurs aucun sens. C’est la syntaxe du premier titre rencontré qui déterminera l’interprétation de la suite des titres et intertitres. Par exemple, il suffit de choisir {{{# Référence }}} comme premier titre pour que tous les autres titres et intertitres soient interprétés comme des références.

Raccourci Description
{{{* … }}} équivalent au raccourcis spip intertitre {{{…}}}. h2 ou h3 suivant spip_debut_intertitre
{{{** Titre}}} h3 ou h4
{{{*** Titre}}} h4 ou h5
{{{**** Titre}}} h5 ou h6
{{{***** Titre}}} h6 ou div.h7
{{{# Référence }}}
{{{## Référence }}}
{{{### Référence }}}
{{{#### Référence }}}
Attributs Les attributs additionnels sont inclus si nécessaire dans une chaine incluse entre parenthèses et accolée sans espace au raccourci du titre. Il est possible d’ajouter plusieurs attributs en les séparant par un espace : {raz .classe #id} par exemple
{{{ Titre }}}{raz} L’extension raz permet de remettre à zéro la numérotation des titres. Cette fonctionnalité est à utiliser sur le premier titre d’un champ d’objet si l’on veut insérer des titres dans plusieurs champs d’un même objet
{{{ Titre }}}{.test-class1 .test--extender} Ajouter des attributs css supplémentaires aux titres
{{{ Titre }}}{#id_du_titre} Insérer un identifiant unique
{{{ Titre }}}{attribut="valeur attribut" data-appear="left" itemprop="name"} Insérer des attributs libres

A savoir

Si les icônes du porte plume n’apparaissent pas après l’activation du plugin, supprimez les dossiers /local/cache-css et js.

Si vous avez installé une version précédente, il peut être nécessaire de supprimer le dossier /tmp/cache/wheels, pour que les traitements typo soient pris en compte.

Participation & todo

Le plugin est disponible sur le dépôt Gitea. Tout retour est apprécié : suggestions, tests, bugs, idées d’amélioration, pull request.
Bugs et retours sur le forum de l’article ou en utilisant les tickets associés au dépôt sur Gitea : https://git.spip.net/spip-contrib-extensions/porte_plume_intertitres/issues

A partir de la version 1.2.0, la refonte du code permet de facilement proposer des modèles de numérotation pour les titres de type référence via une constante ou une variable de configuration.

Discussion

3 discussions

  • 15

    Salut ici !

    J’ai 2 petits bugs rencontrés, en SPIP 4.1 dès lors que l’on utilise les intertitres numérotés :

    1- si sur 5 titres, je décide de ne numéroter que les 4 premiers, le 5e va se numéroter quand même, même si je ne mets pas de # dans le raccourcis

    2- Lorsqu’on utilise les intertitres numérotés conjointement avec le plugin sommaire_automatique... comment dire... une capture vaudra mieux que tous discours ... 😬
    Pour celui-ci, je ne sais pas auquel des 2 plugins c’est lié ...

    A toute fin utile, je précise que le sommaire est intégré dans mon squelette avec sa balise #SOMMAIRE{#TEXTE}. Je ne sais pas dans quelle mesure ça joue ?

    • Je répond uniquement au point 1) pour l’instant. Je pense que tu as zappé le paragraphe suivant dans la documentation :

      Il n’est plus possible (depuis la version 1.2.0) de mélanger dans un même article la syntaxe des titres et des références : ça n’a d’ailleurs aucun sens. C’est la syntaxe du premier titre rencontré qui déterminera l’interprétation de la suite des titres et intertitres. Par exemple, il suffit de choisir {{{# Référence }}} comme premier titre pour que tous les autres titres et intertitres soient interprétés comme des références.

      Pour le point 2) je regarde.

    • Utilisateur SPIP

      Bonjour,

      Merci pour ce plugin.

      Je reviens sur le problème 2 - de numérotation évoqué ici par l’oiseau2nuit.

      1/ Bug de numérotation uniquement sur le site public avec :
      -  un SPIP 4.1.5
      -  Intertitres hierarchiques 2.0.1
      -  squelettes-dist pour les squelettes.
      Par exemple pour 4 titres de niveau 1, en BO, la numérotation démarre bien à 1, mais en public elle démarre à 5. Ici on est sur article.html, mais on retrouve le problème sur d’autres via la balise #INTRODUCTION si celle-ci retourne des titres numérotés.
      2/ Suite du bug avec Sommaire automatique :
      -  un SPIP 4.1.5
      -  Intertitres hierarchiques 2.0.1
      -  Sommaire automatique 1.3.4.
      -  squelettes-dist pour les squelettes.
      -  balise #SOMMAIRE#TEXTE placée avant la balise #TEXTE (quelque soit l’option de listes)
      Par exemple pour 4 titres numérotés de niveau 1, le sommaire automatique commence sa numérotation à 5 et le premier titre du texte démarre à 9.

      Merci pour vos retours.

    • Je viens de faire une correction avec une version 2.0.2 de Intertitres hiérarchiques pour le problème numéro 2.
      Comme je n’ai pas exactement reproduit votre configuration pouvez-vous tester et me dire si c’est ok ?

      Merci d’avance.

    • Alors non c’est pas bon du tout et c’est même une grosse régression.
      J’avais surement un cache non vidé mais en recalculant tout je m’aperçois que ça ne fonctionne plus.

      Par contre, en creusant le sujet, je pense que étant donné que les champs texte ou chapeau par exemple sont affichés dans le même hit, il n’est pas possible de distinguer si le titre concerne l’un ou l’autre de ces champs et donc remettre le contexte à zéro.

      Donc je pense qu’il n’est pas possible de mettre une liste de titres numérotés dans plusieurs champs d’un même objet. On ne pourra jamais faire autre chose que de continuer la numérotation. Pour cela il faudrait introduire un indicateur pour dire RAZ dans le premier titre.

    • Bon je reviens encore une fois pour la correction du mauvais fix précédent et une nouvelle fonctionnalité pour éviter vos soucis. C’est la version 2.0.3.

      Si on veut mettre des titres numérotés dans le chapeau et le texte par exemple, on possède maintenant un extender {raz} à positionner comme les autres extenders d’un titre (voir la documentation plus haut) et qui permet de forcer la remise à zéro de la numérotation.
      Cette extender est donc à utiliser sur le premier titre de chaque champ concerné.

      Si vous pouvez me dire si cela fonctionne maintenant en positionnant cet extender svp ?

    • Hello Eric,

      J’ai un petit « Woopsie » sur l’action de mise à jour (v2.0.1 vers la 2.0.4 qui était signalée ce matin)

      Après vidage de cache il semble que la MAJ soit passée malgré tout et que le plugin fonctionne comme une fleur

    • En revanche, le soucis de numérotation avec sommaire_auto persiste ...
      Et si j’ai bien lu et compris, je ne suis pas certain que {raz} soit la réponse à mon problème ...

    • Hello,

      Je ne comprends pas d’où vient ce bug d’installation car en plus ce plugin ne fait aucun traitement spécifique.

      Sinon, tu as raison, le raz ne joue pas sur ton souci mais sur le fait que si tu mets 2 numérotations dans deux champs du même article tu as bien une remise à zéro, sinon, sans cela la numérotation s’incrémente entre les deux champs.

      Pour ton cas, je suis perplexe parce que je ne reproduis pas.
      Il faudrait que tu me donnes exactement le contexte et comment ton article et le sommaire sont affichés.

    • Hello Loiseau2nuit,

      Bon j’ai refait des tests en utilisant l’instruction #SOMMAIRE{#TEXTE} dans le content de l’article où le #TEXTE est affiché et aussi dans un bloc extra séparé de là où je mets le #TEXTE et je ne reproduis pas, le sommaire est bien affiché correctement.

      Je pense qu’il faudrait que tu me donnes le contenu exact de l’article.

    • Hello,

      Bon je pense que j’ai trouvé le souci.
      C’est en fait Sommaire Automatique qui provoque cet effet de bord sur Intertitres Hiérarchisés.

      En effet, il peut appeler plusieurs fois propre() (si on utilise la balise #SOMMAIRE justement) et, en conséquence, activer plusieurs fois la wheel Intertitres dans le même hit. De fait, comme on est dans le même hit Intertitres pense qu’il s’agit de nouveaux titres et incrémente chacun provoquant ce résultat incohérent mais explicable.

      J’ai ajouté une vérification permettant de savoir si le titre a déjà été traité pour ne pas incrémenter le titre mais renvoyer le titre déjà numéroté. En outre, c’est plus performant.

      Pouvez-vous me dire si cette version 2.0.5 corrige tous vos soucis ?

    • Salut Eric !

      Bonne année (déjà !)
      Ensuite, désolé pour le délai de réponse mais j’étais encore en congés, je reprends tout juste sur ce projet là.

      Vu, et installé la version 2.0.6 mais hélas, le problème subsiste toujours chez moi.

      J’ai testé sur plusieurs articles, le sommaire persiste à poursuivre la numérotation, donc ce n’est pas lié au contenu de l’article en lui même, à priori.
      .
      Je finis par me demander si des fois c’est pas la position du sommaire dans le squelette qui met le brin (chez moi, la balise #SOMMAIRE est placée APRES le #TEXTE). Il faut que je teste cette hypothèse dans la journée. J’essaie de te faire un retour ASAP.

      En tout cas merci à toi pour l’effort de recherche et débug !

      PS : en revanche, j’ai reproduis le même bug que l’autre jour au moment de mettre le plugin à jour. Ya un truc qui cause mal à porte_plume_intertire dans le process d’upgrade, manifestement ...

    • Hello,

      Meilleurs vœux aussi.

      Bon c’est bizarre que ça ne fonctionne pas car le coup du propre() est assez clair. Ça veut dire qu’il y a encore un cas non traité et que je ne peux pas tester dans mon environnement.

      Peux-tu me fournir le squelette exact que tu utilises pour que je teste avec stp ?

    • Utilisateur SPIP

      Bonjour,

      Merci pour votre aide.
      Pardon de ne revenir vers vous que maintenant, j’étais en congé longue durée.

      Avec : le squelette article de la dist de SPIP 4.1.5. / sans et avec la balise sommaire / avec et sans le plugin Sommaire automatique.

      Balise #TEXTE
      Le rendu en BO est bon (elle démarre à 1), la numérotation est également correct à l’enregistrement en édition direct avec le Crayon avant le recalcule de la page. Après le recalcule, la numérotation n’est plus bonne (ici elle démarre à 3).

      Balise #SOMMAIRE
      S’il y a la balise sommaire, même problème dans #TEXTE de numérotation, mais si la balise sommaire est avant : la numérotation commence sur elle ; si elle est après : la numérotation s’enchaine.

      Voici le code généré FO :

      <!--sommaire--><div class="well nav-sommaire nav-sommaire-4" id="nav6448ea0d867c89.88040095">
      <h2>Sommaire</h2><ul class="spip"><li> <a id="s-t3-Titre-niveau-1"></a><a href="#t3-Titre-niveau-1" class='spip_ancre'>3 -  Titre niveau 1</a>
      <ul class="spip"><li> <a id="s-t3-1-Titre-niveau-2"></a><a href="#t3-1-Titre-niveau-2" class='spip_ancre'>3.1 -  Titre niveau 2</a></li><li> <a id="s-t3-2-Titre-niveau-2"></a><a href="#t3-2-Titre-niveau-2" class='spip_ancre'>3.2 -  Titre niveau 2</a></li></ul></li><li> <a id="s-t4-Titre-niveau-1"></a><a href="#t4-Titre-niveau-1" class='spip_ancre'>4 -  Titre niveau 1</a></li></ul></div><!--/sommaire-->
      			
      <div class="crayon article-texte-154 texte surlignable clearfix"><p>Titre</p>
      <h2  class="r2">5 -  Titre niveau 1</h2>
      <p>blabla</p>
      <h3  class="r3">5.1 -  Titre niveau 2</h3>
      <p>blabla</p>
      <h3  class="r3">5.2 -  Titre niveau 2</h3>
      <p>blabla</p>
      <h2  class="r2">6 -  Titre niveau 1</h2>
      <p>blabla</p></div>

      Voici le code génér en BO :

      <div class="champ contenu_texte">
      <div class='label'>Texte</div>
      <div dir='ltr' class='crayon article-texte-154 texte'><p>Titre</p>
      <h2  class="r2">1 -  Titre niveau 1</h2>
      <p>blabla</p>
      <h3  class="r3">1.1 -  Titre niveau 2</h3>
      <p>blabla</p>
      <h3  class="r3">1.2 -  Titre niveau 2</h3>
      <p>blabla</p>
      <h2  class="r2">2 -  Titre niveau 1</h2>
      <p>blabla</p></div>
      </div>

      Si ça peut aider,
      Bien à vous...

    • Utilisateur SPIP

      Bonjour,

      Je crois qu’il compte les <li> de l’<ul> située au-dessus de l’emplacement du premier titre.

      En espérant que cela aide.

    • Samuel Degoul

      Bonjour,

      Après exploration sur SPIP 4.1.11 :
      je pense que l’origine du bug de numérotation est lié au double appel de la fonction propre() dans le squelette par défaut des articles squelettes-dist/article.html :
      -  lors de l’appel de la balise #TEXTE bien sûr
      -  mais aussi lors de l’appel, antérieur, à la balise #INTRODUCTION « coupée » à une certaine longueur maximale (150) pour renseigner un champ meta du head de la page html.

      D’où un bug bizarre :
      -  si le texte de l’article est plus long que 150 caractères, l’appel au filtre |couper (du moins je crois) pour raccourcir l’« introduction » transforme les titres {{{# }}} en #, avec suppression des accolades. Ainsi, la Textwheel n’y reconnaît pas les titres,
      -  par contre, si le texte de l’article est très court, < 150 caractères, l’« introduction » contient l’ensemble de ce texte, qui n’est pas modifié et contient toujours les titres dans leur forme originale {{{# }}}, d’où 2 passages par le « compteur de numérotation » du plugin.

      Je pense que le plugin devrait corriger le calcul de la balise #INTRODUCTION afin qu’elle ne contiennent pas les accolades des titres (mais peut-être conserver les # ?).

      Je ne sais pas bien comment faire ça. Corriger la fonction filtre_introduction_dist() (dans ecrire/public/fonctions.php ?
      Pour ma part, je supprime pour l’instant la balise #INTRODUCTION du squelette de mes articles.

    Répondre à ce message

  • 6

    Merci pour ton plugin. Bien pratique.

    Une remarque : pour chaque intertitres (h2, h3, etc.) tu remplaces la class « spip » par le nom du tag.
    Ainsi <h3 class='spip'> devient <h3 class='h3'>.
    Du coup cela casse/modifie l’affichage puisque la CSS h3.spip{…} n’est plus prise en compte.

    Il y a t-il une raison à ce choix ?

    Cheers

    • Hello

      Merci pour le retour.

      De mémoire, la raison est que à l’époque c’était le standard spip ;-)

      ça peut se surcharger depuis mes options en utilisant les globales

      https://github.com/mistergraphx/porte_plume_intertitres/blob/master/porte_plume_intertitres_options.php

      Une évolution serait de pouvoir spécifier la classe depuis la config si on utilise un framework (bootstrap ou autre).

      Quel serait ton besoin ou idée sur le sujet ?

    • Yop,

      La surcharge via /porte_plume_intertitres_options.php ne marche pas.
      En cause qqs instructions dans /porte_plume_intertitres/wheels/porte_plume_intertitres.php

      Du coup, juste pour tester, j’ai forké ton plugin + et modifié ce fichier.
      Voir la modif.

      Une évolution serait de pouvoir spécifier la classe depuis la config si on utilise un framework (bootstrap ou autre).

      Oui ! Du coup là config pourrait proposer :
      -  la valeur du tag (pour pas chambouler les installs existantes )
      -  ’spip’ (parce que quand même, cela remet le plugin compatible avec la dist)
      -  champ input où l’utilisateur pourrait saisir ce qu’il veut.

      Je veux bien te donner un coup de main si tu veux ?
      Faudrait juste virer les notices PHP existantes en l’état. Sur ce point, je préfère te laisser la main…

    • Voui le « stantard spip » c’est pas le nom de la balise en classe, c’est bien plutôt « spip » justement, pour être raccord avec la dist et ce que produit la syntaxe légère de SPIP de base.

      Il me semble que ça devrait donc produire hX.spip à chaque fois par défaut.

    • Est ce que cette modification peut avoir des conséquences su l’existant ou pas ?

      Sinon, c’est une ligne de code à changer, je peux commiter quand on souhaite.

    • Si ça casse de l’existant c’est qu’il était conçu bizarrement (du genre des gens qui ne stylent QUE les classes CSS et jamais les vraies balises HTML h2, h3, etc, ce qui est hautement improbable).

      Donc non en théorie pour 99,9% des sites ça casse rien (à commencer par la dist), puisque les thèmes styles les balises de titres avant tout.

    • (3 métros après la bataille)
      Si je raconte pas de *plop*eries <hx class="hx"> ça vient de ooCSS (Nicole Sullivan / modèle et FW présenté à Paris Web 2009) mais ça n’a effectivement jamais été natif dans SPIP à ma connaissance.
      Cela dit c’est une très bonne pratique pour remettre d’aplomb une sémantique hasardeuse, conçue par des gens qui pensent que les niveau de titres ne servent qu’à faire de la cosmétique. A une certaine époque, j’en ai glissé pas mal du h2 class h4, du h3 class h1, ... 😁

    Répondre à ce message

  • 4

    Salut,

    avec SPIP 3.3, le niveau d’intertitre par défaut est maintenant H2

    Cf :
    https://core.spip.net/issues/2381
    https://git.spip.net/spip/textwheel/commit/57de289c88fae817058b501899d2fc0db150e941

    Tu verrais une objection à passer en H2 aussi dans ce plugin ?
    C’est à dire ici :
    https://git.spip.net/spip-contrib-extensions/porte_plume_intertitres/src/branch/master/porte_plume_intertitres_options.php#L20

    • Hello,

      Non aucune ;-) j’ai toujours utilisé sur des sites en define h2, c’était ainsi dans le plugin pour conserver le comportement standard de spip.

      Donc aucun soucis.

    • Peut être avec un test sur la version de SPIP pour ne pas péter des sites ?
      Ou bien go direct #H2_for_all ?

    • Honnêtement je n’ai jamais compris que l’on commence par un h3 la structure sémantique du contenu de l’article, J’ai donc toujours surchargé en h2.

      De mémoire je crois que c’était surtout pour la compat avec la dist de spip, mais ne l’utilisant pas et surchargeant la totalité, ou utilisant un spip-reset à la place ... je dirais que je suis pour un h2 en standard ^^.

      aussi l’idée était de ne pas rajouter une config pour ça, dans le plugin comme il y’avait dans typo enluminée, ou le CS ...

    • je dirais pour ma part de quand même tester la version de SPIP pour pas peter. On suit la logique de SPIP, même si elle nous semble illogique.

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom