Changeset 117978 in spip-zone


Ignore:
Timestamp:
Sep 28, 2019, 4:06:56 PM (11 months ago)
Author:
Charles Razack
Message:

Correction d'un bug : le sommaire n'était pas inséré au bon endroit si on passait le paramètre |niveau_max (maieul). En effet, la balise n'est pas traitée comme un modèle au même titre que les autres : elle fait juste office de marqueur pour l'emplacement du sommaire, qui est inséré plus tard par ses propres moyens. Sauf que dès qu'on ajoute un paramètre , propre() la traite comme un vrai modèle et le marqueur disparait. Du coup, on lui substitue un simple commentaire HTML. On en profite pour optimiser un peu à certains endroits : substr_replace en priorité par rapport à preg_replace. Et pour finir un peu de phpdoc + une boucle pour simplifier le squelette du formulaire de config.

Location:
_plugins_/sommaire/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/sommaire/trunk

    • Property subgit:lock:9d7eec1f8a20605a143ae6b9c412d43e2e2f1dd6 set to 2019-09-28T18:08:30.806
  • _plugins_/sommaire/trunk/formulaires/configurer_sommaire.html

    r90360 r117978  
    5757                        </li>
    5858
    59                         #SET{name,sommaire_niveau_max}#SET{obli,''}#SET{defaut,'6'}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
     59                        #SET{name,sommaire_niveau_max}
     60                        #SET{obli,''}
     61                        #SET{defaut,6}
     62                        #SET{erreurs,#ENV**{erreurs/#GET{name}}}
    6063                        <li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
    6164                                <label>[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>
     
    6366                                <span class='erreur_message'>(#GET{erreurs})</span>
    6467                                ]
    65                                 #SET{val,1}
     68                                <BOUCLE_niveaux(DATA) {enum 1, 6}>
    6669                                <div class="choix">
    67                                         <input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
    68                                         <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
     70                                        <input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#VALEUR" value="#VALEUR"[ (#ENV{#GET{name},#GET{defaut}}|=={#VALEUR}|oui)checked="checked"] />
     71                                        <label for="#GET{name}_#VALEUR">[(#GET{fl}|concat{':label_',#GET{name},'_',#VALEUR}|_T)]</label>
    6972                                </div>
    70                                 #SET{val,2}
    71                                 <div class="choix">
    72                                         <input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
    73                                         <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
    74                                 </div>
    75                                 #SET{val,3}
    76                                 <div class="choix">
    77                                         <input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
    78                                         <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
    79                                 </div>
    80                                 #SET{val,4}
    81                                 <div class="choix">
    82                                         <input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
    83                                         <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
    84                                 </div>
    85                                 #SET{val,5}
    86                                 <div class="choix">
    87                                         <input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
    88                                         <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
    89                                 </div>
    90                                 #SET{val,6}
    91                                 <div class="choix">
    92                                         <input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
    93                                         <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
    94                                 </div>
     73                                </BOUCLE_niveaux>
    9574                        </li>
    9675
  • _plugins_/sommaire/trunk/paquet.xml

    r106575 r117978  
    22        prefix="sommaire"
    33        categorie="edition"
    4         version="1.2.4"
     4        version="1.2.5"
    55        etat="stable"
    66        compatibilite="[3.0.0;3.2.*]"
  • _plugins_/sommaire/trunk/sommaire_fonctions.php

    r97688 r117978  
    127127}
    128128
     129/**
     130 * Transforme les raccourcis SPIP, liens et modèles d'un texte en code HTML
     131 *
     132 * Extrait le sommaire et ses éventuels paramètres
     133 * avant d'appeler propre() puis sommaire_post_propre().
     134 *
     135 * @uses propre()
     136 * @uses sommaire_post_propre()
     137 *
     138 * @param string $texte
     139 * @param string|null $connect
     140 * @param array $env
     141 * @return string
     142 */
    129143function sommaire_propre($texte, $connect, $env) {
    130         // on cherche les balises <sommaire>, mais aussi <sommaireN|arg=x|arg=y> et [sommaire]
    131         $has_sommaire = preg_match('/[<\[]sommaire(\d+)?(?:\|.*)*[>\]]/', $texte);
    132         // le niveau maximal peut être passé en paramètre de la balise <sommaire|niveau_max=N>
    133         $niveau_max = (preg_match('/[<\[]sommaire.*niveau_max=(\d).*[>\]]/', $texte, $m)) ? $m[1] : '';
     144
     145        // Repérer et analyser la balise <sommaire> en amont de propre().
     146        // Ce modèle n'est pas traité comme les autres : on extrait les éventuels paramètres
     147        // puis on remplace la balise par un simple marqueur <!--inserer_sommaire-->.
     148        // Perf : d'abord sans regex pour les formes simples, puis en regex si paramètres.
     149        $has_sommaire = false;
     150        $niveau_max = '';
     151        $marqueur = '<!--inserer_sommaire-->';
     152        if (
     153                $p = strpos($texte, '<sommaire>')
     154                or $p = strpos($texte, '[sommaire]')
     155        ) {
     156                $has_sommaire = true;
     157                $texte = substr_replace($texte, $marqueur, $p, strlen('<sommaire>'));
     158        } elseif (
     159                $pattern = '/<sommaire(?P<id>\d+)?(?P<parametres>(?:\|[^>]+)*)>/i'
     160                and preg_match($pattern, $texte, $matches)
     161        ) {
     162                $has_sommaire = true;
     163                $texte = preg_replace($pattern, $marqueur, $texte);
     164                // On récupère le niveau maximal éventuel passé en paramètre
     165                $niveau_max = (preg_match('/niveau_max=(\d+)/i', $matches['parametres'], $m)) ? $m[1] : '';
     166        }
    134167
    135168        $texte = propre($texte, $connect, $env);
    136169
    137         if (!isset($GLOBALS['meta']['sommaire_automatique'])
     170        if (
     171                !isset($GLOBALS['meta']['sommaire_automatique'])
    138172                or $GLOBALS['meta']['sommaire_automatique'] == 'on'
    139                 or ($GLOBALS['meta']['sommaire_automatique'] == 'ondemand' and
    140                 $has_sommaire)
     173                or (
     174                        $GLOBALS['meta']['sommaire_automatique'] == 'ondemand'
     175                        and $has_sommaire
     176                )
    141177        ) {
    142178                $texte = sommaire_post_propre($texte, true, false, $niveau_max);
     
    204240}
    205241
     242/**
     243 * Insère le sommaire dans un texte
     244 *
     245 * @uses sommaire_recenser()
     246 * @uses sommaire_filtrer_niveaux()
     247 *
     248 * @param string $texte
     249 * @param boolean $ajoute
     250 * @param boolean $sommaire_seul
     251 * @param int|string $niveau_max
     252 * @return string
     253 */
    206254function sommaire_filtre($texte, $ajoute = true, $sommaire_seul = false, $niveau_max = '') {
    207255        $sommaire = sommaire_recenser($texte);
     
    215263
    216264        if ($ajoute or $sommaire_seul) {
    217                 // on cherche les balises <sommaire>, mais aussi <sommaireN|arg=x|arg=y> et [sommaire]
    218                 $pattern = '/[<\[]sommaire(\d+)?(?:\|.*)*[>\]]/';
    219265                $sommaire = recuperer_fond('modeles/sommaire', array('sommaire' => $sommaire, 'niveau_max' => $niveau_max));
    220266                $sommaire = "<!--sommaire-->$sommaire<!--/sommaire-->";
     
    222268                        return $sommaire;
    223269                }
    224                 if (preg_match($pattern, $texte)) {
    225                         $texte = preg_replace($pattern, $sommaire, $texte);
     270                // On insère le sommaire au niveau du marqueur <!--inserer_sommaire-->
     271                // Sinon on le place au début du texte
     272                if ($p = strpos($texte, '<p><!--inserer_sommaire--></p>')) {
     273                        $texte = substr_replace($texte, $sommaire, $p, strlen('<p><!--inserer_sommaire--></p>'));
     274                } elseif ($p = strpos($texte, '<!--inserer_sommaire-->')) {
     275                        $texte = substr_replace($texte, $sommaire, $p, strlen('<!--inserer_sommaire-->'));
    226276                } else {
    227277                        $texte = $sommaire . $texte;
    228278                }
    229                 /*if ($p = strpos($texte,"<sommaire>") OR $p = strpos($texte,"[sommaire]")){
    230                         $texte = substr_replace($texte,$sommaire,$p,strlen("<sommaire>"));
    231                 }*/
    232279        }
    233280
     
    235282}
    236283
     284/**
     285 * Undocumented function
     286 *
     287 * @uses sommaire_filtre_texte_echappe
     288 * @uses sommaire_filtre
     289 *
     290 * @param string $texte
     291 * @param boolean $ajoute
     292 * @param boolean $sommaire_seul
     293 * @param int|string $niveau_max
     294 * @return string
     295 */
    237296function sommaire_post_propre($texte, $ajoute = true, $sommaire_seul = false, $niveau_max = '') {
    238297
    239298        if (strpos($texte, '<h') !== false) {
    240                 $texte = sommaire_filtre_texte_echappe($texte, 'sommaire_filtre', 'html|code|cadre|frame|script|acronym|cite', array($ajoute,$sommaire_seul,$niveau_max));
     299                $texte = sommaire_filtre_texte_echappe(
     300                        $texte,
     301                        'sommaire_filtre',
     302                        'html|code|cadre|frame|script|acronym|cite',
     303                        array($ajoute, $sommaire_seul, $niveau_max)
     304                );
    241305        } elseif ($sommaire_seul) {
    242306                return '';
     
    245309}
    246310
    247 // renvoie le sommaire d'une page d'article
    248 // $page=false reinitialise le compteur interne des ancres
     311/**
     312 * Renvoie le sommaire d'une page d'article
     313 * $page=false reinitialise le compteur interne des ancres
     314 *
     315 * @param string $texte
     316 * @return string
     317 */
    249318function sommaire_recenser(&$texte) {
    250319        $sommaire = array();
Note: See TracChangeset for help on using the changeset viewer.