Changeset 66220 in spip-zone


Ignore:
Timestamp:
Sep 25, 2012, 1:32:10 PM (7 years ago)
Author:
marcimat@…
Message:
  • Séparer le calcul les liens des définitions du pipeline post_propre, en créant un filtre «definitions»
  • Permettre de dire, via une constante define('DICTIONNAIRES_DETECTION_MANUELLE', true); que le squelette se charge d'appliquer le filtre |definition sur ce qui lui plait, et pas sur tout ce qui passe par propre.
Location:
_plugins_/dictionnaires/trunk
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/dictionnaires/trunk/dictionnaires_pipelines.php

    r65485 r66220  
    6363 * termes à définir.
    6464 *
    65  * N'ajoute pas de définition si les termes à définir sont déjà
    66  * dans des balises de définition ou de code, genre <abbr> ou <code>
     65 * Les définitions sont calculées ici uniquement si le dictionnaire
     66 * n'est pas en mode manuel. Ce mode est activable par la constante
     67 * DICTIONNAIRES_DETECTION_MANUELLE mise à TRUE.
    6768 *
    6869 * @pipeline post_edition
     
    7172 * @return string        Texte
    7273**/
    73 function dictionnaires_post_propre($texte){
    74         $GLOBALS['dictionnaires_id_texte'] = uniqid();
    75         include_spip('inc/dictionnaires');
    76         $definitions = dictionnaires_lister_definitions();
    77         $masques = array();
    78         foreach ($definitions as $definition){
    79                 $masques[] = $definition['masque'];
     74function dictionnaires_post_propre($texte) {
     75        static $filtre_definitions = false;
     76
     77        // lorsqu'il n'est pas demandé explicitement un usage
     78        // manuel, appliquer automatiquement la recherche de terme
     79        if (!defined('DICTIONNAIRES_DETECTION_MANUELLE')
     80                OR !DICTIONNAIRES_DETECTION_MANUELLE)
     81        {
     82                if (!$filtre_definitions) {
     83                        $filtre_definitions = charger_filtre('definitions');
     84                }
     85                $texte = $filtre_definitions($texte);
    8086        }
    81        
    82         // Quelque soit le type de définition
    83         // on ne fait rien à l'intérieur de certaines balises
    84         $masque_echap = '{<(acronym|abbr|a|code|cadre|textarea)[^>]*>.*</\1>}Uis';
    85         preg_match_all($masque_echap, $texte, $balises_echap, PREG_SET_ORDER);
    86         $morceaux_a_traiter = preg_split($masque_echap, $texte);
    87        
    88         // On parcours uniquement les textes hors balises <abbr>
    89         foreach ($morceaux_a_traiter as $cle => $morceau_a_traiter){
    90                 // On ne traite que ce qui est hors balises
    91                 $masque_balises = '{<([a-z]+[^<>]*)>}i';
    92                 preg_match_all($masque_balises, $morceau_a_traiter, $balises, PREG_SET_ORDER);
    93                 $textes_a_traiter = preg_split($masque_balises, $morceau_a_traiter);
    94                 $textes_a_traiter = preg_replace_callback($masques, 'dictionnaires_replace_callback', $textes_a_traiter);
    95                
    96                 foreach ($textes_a_traiter as $cle2 => $texte_a_traiter){
    97                         $textes_a_traiter[$cle2] = $texte_a_traiter ;
    98                         if (isset($balises[$cle2][0]))
    99                                 $textes_a_traiter[$cle2] .= $balises[$cle2][0];
    100                 }
    101                
    102                 $morceaux_a_traiter[$cle] = join('', $textes_a_traiter);
    103                 if (isset($balises_echap[$cle][0]))
    104                         $morceaux_a_traiter[$cle] .= $balises_echap[$cle][0];
    105         }
    106         $texte = join('', $morceaux_a_traiter);
    107        
    108         $texte = echappe_retour($texte, 'dictionnaires');
     87
    10988        return $texte;
    11089}
    11190
    11291
    113 /**
    114  * Callback réceptionnant les captures de termes à définir
    115  *
    116  * Remplace la trouvaille par une description avec sa définition.
    117  * Et on ne le fait qu'au moment de la première occurence, lorsque
    118  * c'est configuré comme tel.
    119  *
    120  * @pipeline post_edition
    121  *
    122  * @param string $captures Terme trouvé
    123  * @return string          HTML du terme et de sa définition
    124 **/
    125 function dictionnaires_replace_callback($captures){
    126         include_spip('inc/config');
    127         static $deja_remplaces = array();
    128         static $id_texte = '';
    129         $definitions = dictionnaires_lister_definitions_par_terme();
    130         $remplacer_celui_la = true;
    131        
    132         // Si c'est un nouveau texte, on vide la liste des déjà remplacés
    133         $nouveau_texte = ((!$id_texte) or ($id_texte != $GLOBALS['dictionnaires_id_texte']));
    134         if ($nouveau_texte){
    135                 $id_texte = $GLOBALS['dictionnaires_id_texte'];
    136                 $deja_remplaces = array();
    137         }
    138        
    139         // Par défaut rien
    140         $retour = $captures[0];
    141        
    142         // On cherche la définition du terme trouvé
    143         if ($definition = $definitions[$captures[2]] or $definition = $definitions[strtolower($captures[2])]){
    144                 $type = $definition['type'];
    145                
    146                 // Si on a demandé à remplacer uniquement le premier mot trouvé
    147                 if (
    148                         ($type and lire_config('dictionnaires/remplacer_premier_'.$type))
    149                         or (!$type and lire_config('dictionnaires/remplacer_premier_defaut'))
    150                 ){
    151                         foreach ($definition['termes'] as $terme){
    152                                 if (in_array($terme, $deja_remplaces)){
    153                                         $remplacer_celui_la = false;
    154                                 }
    155                         }
    156                 }
    157                
    158                 // On ne travaille pas pour rien !
    159                 if ($remplacer_celui_la){
    160                         if (function_exists("dictionnaires_remplacer_$type")) { $remplacer = "dictionnaires_remplacer_$type"; }
    161                         elseif (function_exists("dictionnaires_remplacer_${type}_dist")) { $remplacer = "dictionnaires_remplacer_${type}_dist"; }
    162                         elseif (function_exists("dictionnaires_remplacer_defaut")) { $remplacer = "dictionnaires_remplacer_defaut"; }
    163                         else { $remplacer = "dictionnaires_remplacer_defaut_dist"; }
    164                
    165                         $retour = $captures[1].code_echappement($remplacer($captures[2], $definition), 'dictionnaires');
    166                         $deja_remplaces = array_merge($deja_remplaces, $definition['termes']);
    167                 }
    168         }
    169        
    170         return $retour;
    171 }
    172 
    17392?>
  • _plugins_/dictionnaires/trunk/paquet.xml

    r66219 r66220  
    22        prefix="dictionnaires"
    33        categorie="divers"
    4         version="0.4.5"
     4        version="0.5.0"
    55        etat="test"
    66        compatibilite="[3.0.0;3.0.*]"
Note: See TracChangeset for help on using the changeset viewer.