Changeset 110485 in spip-zone


Ignore:
Timestamp:
Jun 2, 2018, 3:28:28 PM (19 months ago)
Author:
tcharlss@…
Message:

Pour les chapitres, la hiérarchie des titres est régie par leur imbrication, il ne faut donc pas de vrais intertitres dans le texte. Ajout d'une fonction pour les remplacer par une classe sémantique qui reflète leur niveau : <div class='hn'>. Le niveau tient compte de la profondeur du chapitre et du niveau de titre choisi pour les chapitres à la racine. Quelques ajustements dans la vue complète.

Location:
_plugins_/chapitres/trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/chapitres/trunk/chapitres_fonctions.php

    r109190 r110485  
    110110        return $branche;
    111111}
     112
     113
     114/**
     115 * Remplacer les intertitres dans le texte d'un chapitre par une classe sémantique
     116 *
     117 * Dans les chapitres, la hiérarchie des titres est régie par leur imbrication,
     118 * il ne faut donc pas de vrais intertitres dans le texte.
     119 *
     120 * Par exemple, <h3> devient <div class="hn"> en fonction de la profondeur du chapitre et du niveau de heading des chapitres à la racine.
     121 *
     122 * @example
     123 * [(#TEXTE|chapitres_remplacer_intertitres{#GET{profondeur},2})]
     124 *
     125 * @param string $texte
     126 *    Texte sans traitement typo
     127 * @param int|string $profondeur
     128 *    Profondeur du chapitre
     129 *    0 = racine
     130 * @param int|string $niveau_racine
     131 *    Numéro du heading le plus haut (ceux des chapitres à la racine)
     132 *    Ex. : <h1> = 1, <h2> = 2, etc.
     133 *    Par défaut 2
     134 */
     135function chapitres_remplacer_intertitres($texte, $profondeur, $niveau_racine = 2) {
     136
     137        // DOMDocument plutôt qu'une regex car plus fiable (ignorer commentaires, styles inline etc.).
     138        libxml_use_internal_errors(true);
     139        $dom = new DOMDocument;
     140        $dom->loadHTML(
     141                mb_convert_encoding($texte, 'HTML-ENTITIES', 'UTF-8'),
     142                LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD
     143        );
     144
     145        // On repère les intertitres et on note les niveaux présents.
     146        $niveaux_intertitres = array();
     147        for ($i = 1; $i <= 6; $i++) {
     148                if ($dom->getElementsByTagName("h$i")->item(0)) {
     149                        $niveaux_intertitres[] = $i;
     150                }
     151        }
     152
     153        if (count($niveaux_intertitres)) {
     154
     155                // Niveau du chapitre actuel, à partir duquel on descend
     156                $niveau_chapitre = $niveau_racine + $profondeur;
     157
     158                foreach ($niveaux_intertitres as $n) {
     159                        // Définir le nouveau niveau
     160                        $delta = $n - min($niveaux_intertitres);
     161                        $niveau = $niveau_chapitre + 1 + $delta;
     162                        $niveau = min($niveau, 6); // Limiter à .h6
     163                        // Remplacer les intertitres
     164                        // Boucle en arrière, cf.
     165                        $intertitres = $dom->getElementsByTagName("h$n");
     166                        for ($i = $intertitres->length - 1; $i >= 0; $i--) {
     167                                $avant = $intertitres->item($i);
     168                                $apres = $dom->createElement('div', $avant->nodeValue);
     169                                $apres->setAttribute('class', "spip h$niveau");
     170                                $avant->parentNode->replaceChild($apres, $avant);
     171                        }
     172                }
     173
     174                $texte = $dom->saveHTML();
     175
     176        }
     177
     178        return $texte;
     179}
  • _plugins_/chapitres/trunk/paquet.xml

    r110468 r110485  
    22        prefix="chapitres"
    33        categorie="edition"
    4         version="1.0.13"
     4        version="1.0.14"
    55        etat="dev"
    66        compatibilite="[3.2.0;3.2.*]"
  • _plugins_/chapitres/trunk/prive/squelettes/inclure/chapitre_editable.html

    r110477 r110485  
    1717#SET{edit,#ENV{edit}|=={#ID_CHAPITRE}|?{#ID_CHAPITRE,#ENV{edit}|et{#ENV{id_parent}|=={#ID_CHAPITRE}}|?{new}}}
    1818#SET{self,#SELF|parametre_url{edit|id_parent,''}}
    19 #SET{heading,#VAL{h}|concat{#ENV{profondeur}|plus{3}}}
     19#SET{heading,#VAL{h}|concat{#ENV{profondeur}|plus{2}}}
    2020
    2121<div class="clearfix">
     
    3737                [</(#GET{heading})>]
    3838
    39                 <INCLURE{fond=prive/objets/contenu/chapitre, id_chapitre} />
     39                [(#INCLURE{fond=prive/objets/contenu/chapitre, id_chapitre}|chapitres_remplacer_intertitres{#ENV{profondeur},2})]
    4040
    4141                [(#REM) Icône ajouter sous-chapitre ]
  • _plugins_/chapitres/trunk/prive/squelettes/inclure/chapitres_complets.html

    r110477 r110485  
    77        titre,1,
    88        num titre,1,
     9        rang,1,
    910        date,-1,
    1011        id_chapitre,1,
     
    1213}}
    1314<div class="chapitres_complets">
    14 
    15         <B_liste_chapitres>
    16         <h2>
    17                 <BOUCLE_total(CHAPITRES){objet}{id_objet}{statut?} />
    18                 [(#TOTAL_BOUCLE|singulier_ou_pluriel{chapitre:info_1_chapitre,chapitre:info_nb_chapitres})]
    19                 <//B_total>
    20         </h2>
    21 
    22         <p class="tri">
    23                 <span class="statut">[(#TRI{statut,<span title="<:lien_trier_statut|attribut_html:>">#</span>,ajax})]</span>
    24                 <span class="sep">|</span>
    25                 <span class="titre">[(#TRI{num titre,<:chapitre:champ_titre_label:>,ajax})]</span>
    26                 <span class="sep">|</span>
    27                 <span class="date">[(#TRI{date,<:date:>,ajax})]</span>
    28                 <span class="sep">|</span>
    29                 <span class="id">[(#TRI{id_chapitre,<:info_numero_abbreviation:>,ajax})]</span>
    30         </p>
    3115
    3216        <BOUCLE_liste_chapitres (CHAPITRES)
     
    5741                        profondeur=0,
    5842                        numero=#GET{numero},
     43                        cacher_titre=oui,
     44                        cacher_statut=oui,
     45                        cacher_meta=oui,
    5946                        ajax}
    6047                />
  • _plugins_/chapitres/trunk/prive/style_prive_plugin_chapitres.html

    r110477 r110485  
    7676  margin-#ENV{right}: 0.5em;
    7777}
    78 .chapitres_complets .chapitre__sep {
    79   /* margin: 3em 0; */
    80 }
    8178.chapitres_complets .chapitre .chapitre {
    8279  /* padding-left: 2em; */
    8380}
     81.chapitres_complets .bd {
     82  padding-top: 2em;
     83}
     84/* icones */
     85.chapitres_complets .icone.#ENV{right} {
     86  margin-#ENV{left}: 0.5em;
     87}
     88.chapitres_complets .icone a {
     89  width: auto;
     90}
     91.chapitres_complets .icone a b {
     92  display: none;
     93}
Note: See TracChangeset for help on using the changeset viewer.