source: spip-zone/_plugins_/dictionnaires/trunk/dictionnaires_fonctions.php @ 110957

Last change on this file since 110957 was 110957, checked in by real3t@…, 2 years ago

La notion d'insensibilité à la casse échouait sur ce dernier test (cf https://contrib.spip.net/Dictionnaires#forum497572)

File size: 4.4 KB
Line 
1<?php
2
3/**
4 * Filtres pour les squelettes
5 *
6 * @package SPIP\Dictionnaires\Fonctions
7**/
8
9// Sécurité
10if (!defined('_ECRIRE_INC_VERSION')) return;
11
12
13
14/**
15 * Ajoute sur le texte les définitions sur les termes à définir.
16 *
17 * N'ajoute pas de définition si les termes à définir sont déjà
18 * dans des balises de définition ou de code, genre <abbr> ou <code>
19 *
20 * @param string $texte  Texte
21 * @return string        Texte
22**/
23function filtre_definitions_dist($texte) {
24        /**
25         * Eviter d'être considéré comme spam lors du post si on met un mot considéré comme définition
26         * par exemple dans le titre d'un commentaire (plugin forum) ou d'un ticket (plugin tickets)
27         */
28        if(_request('formulaire_action') && (substr(_request('formulaire_action'),0,7) == 'editer_'))
29                return $texte;
30        $GLOBALS['dictionnaires_id_texte'] = uniqid();
31        include_spip('inc/dictionnaires');
32        $definitions = dictionnaires_lister_definitions();
33        $masques = array();
34        foreach ($definitions as $definition){
35                $masques[] = $definition['masque'];
36        }
37       
38        // Quelque soit le type de définition
39        // on ne fait rien à l'intérieur de certaines balises
40        $masque_echap = '{<(acronym|abbr|a|code|cadre|textarea)[^>]*>.*</\1>}Uis';
41        preg_match_all($masque_echap, $texte, $balises_echap, PREG_SET_ORDER);
42        $morceaux_a_traiter = preg_split($masque_echap, $texte);
43       
44        // On parcours uniquement les textes hors balises <abbr>
45        foreach ($morceaux_a_traiter as $cle => $morceau_a_traiter){
46                // On ne traite que ce qui est hors balises
47                $masque_balises = '{<([a-z]+[^<>]*)>}i';
48                preg_match_all($masque_balises, $morceau_a_traiter, $balises, PREG_SET_ORDER);
49                $textes_a_traiter = preg_split($masque_balises, $morceau_a_traiter);
50                $textes_a_traiter = preg_replace_callback($masques, 'dictionnaires_replace_callback', $textes_a_traiter);
51               
52                foreach ($textes_a_traiter as $cle2 => $texte_a_traiter){
53                        $textes_a_traiter[$cle2] = $texte_a_traiter ;
54                        if (isset($balises[$cle2][0])) 
55                                $textes_a_traiter[$cle2] .= $balises[$cle2][0];
56                }
57               
58                $morceaux_a_traiter[$cle] = join('', $textes_a_traiter);
59                if (isset($balises_echap[$cle][0])) 
60                        $morceaux_a_traiter[$cle] .= $balises_echap[$cle][0];
61        }
62        $texte = join('', $morceaux_a_traiter);
63       
64        $texte = echappe_retour($texte, 'dictionnaires');
65        return $texte;
66}
67
68
69
70/**
71 * Callback réceptionnant les captures de termes à définir
72 *
73 * Remplace la trouvaille par une description avec sa définition.
74 * Et on ne le fait qu'au moment de la première occurence, lorsque
75 * c'est configuré comme tel.
76 *
77 * @param string $captures Terme trouvé
78 * @return string          HTML du terme et de sa définition
79**/
80function dictionnaires_replace_callback($captures){
81        include_spip('inc/config');
82        static $deja_remplaces = array();
83        static $id_texte = '';
84        $definitions = dictionnaires_lister_definitions_par_terme();
85        $remplacer_celui_la = true;
86       
87        // Si c'est un nouveau texte, on vide la liste des déjà remplacés
88        $nouveau_texte = ((!$id_texte) or ($id_texte != $GLOBALS['dictionnaires_id_texte']));
89        if ($nouveau_texte){
90                $id_texte = $GLOBALS['dictionnaires_id_texte'];
91                $deja_remplaces = array();
92        }
93       
94        // Par défaut rien
95        $retour = $captures[0];
96       
97        // On cherche la définition du terme trouvé
98        if ((isset($definitions[$captures[2]]) AND $definition = $definitions[$captures[2]]) 
99                or (isset($definitions[strtolower($captures[2])]) AND ($definition = $definitions[strtolower($captures[2])]))){
100                $type = $definition['type'];
101               
102                // Si on a demandé à remplacer uniquement le premier mot trouvé
103                if (
104                        ($type and lire_config('dictionnaires/remplacer_premier_'.$type))
105                        or (!$type and lire_config('dictionnaires/remplacer_premier_defaut'))
106                ){
107                        foreach ($definition['termes'] as $terme){
108                                if (in_array($terme, $deja_remplaces)){
109                                        $remplacer_celui_la = false;
110                                }
111                        }
112                }
113               
114                // On ne travaille pas pour rien !
115                if ($remplacer_celui_la){
116                        if (function_exists("dictionnaires_remplacer_$type")) { $remplacer = "dictionnaires_remplacer_$type"; }
117                        elseif (function_exists("dictionnaires_remplacer_${type}_dist")) { $remplacer = "dictionnaires_remplacer_${type}_dist"; }
118                        elseif (function_exists("dictionnaires_remplacer_defaut")) { $remplacer = "dictionnaires_remplacer_defaut"; }
119                        else { $remplacer = "dictionnaires_remplacer_defaut_dist"; }
120               
121                        $retour = $captures[1].code_echappement($remplacer($captures[2], $definition), 'dictionnaires');
122                        $deja_remplaces = array_merge($deja_remplaces, $definition['termes']);
123                }
124        }
125       
126        return $retour;
127}
Note: See TracBrowser for help on using the repository browser.