source: spip-zone/_plugins_/dictionnaires/trunk/dictionnaires_pipelines.php @ 58145

Last change on this file since 58145 was 58145, checked in by rastapopoulos@…, 8 years ago

Ajout d'une option "sensible à la casse" pour les définitions qui obligera alors le détecteur à prendre uniquement ce qu'on a mis comme terme : "ce" ne sera plus reconnu pour "CE".

+ correction de bug qui faisait que les cases à cocher ne pouvaient pas être décochées...

+ chaine d'explication en plus

File size: 4.3 KB
Line 
1<?php
2
3// Sécurité
4if (!defined('_ECRIRE_INC_VERSION')) return;
5
6function dictionnaires_declarer_url_objets($objets){
7        $objets[] = 'dictionnaire';
8        $objets[] = 'definition';
9        return $objets;
10}
11
12function dictionnaires_post_edition($flux){
13        // Seulement si c'est une modif d'objet
14        if ($flux['args']['action'] == 'modifier' and $id_objet = $flux['args']['id_objet']){
15                $trouver_table = charger_fonction('trouver_table', 'base/');
16                $desc = $trouver_table($flux['args']['table_objet'], $flux['args']['serveur']);
17                $id_table_objet = id_table_objet($flux['args']['type']);
18               
19                // On cherche les champs textuels
20                $champs_texte = array();
21                foreach ($desc['field'] as $champ=>$sql){
22                        if (preg_match('/(text|blob|varchar)/', $sql)){
23                                $champs_texte[] = $champ;
24                        }
25                }
26               
27                // On récupère ces champs
28                $textes = sql_fetsel($champs_texte, $flux['args']['spip_table_objet'], "$id_table_objet = $id_objet");
29                // On récupère les définitions
30                include_spip('inc/dictionnaires');
31                $definitions = dictionnaires_lister_definitions();
32               
33                // On les scanne
34                foreach ($textes as $texte){
35                       
36                }
37        }
38}
39
40function dictionnaires_post_propre($texte){
41        $GLOBALS['dictionnaires_id_texte'] = uniqid();
42        include_spip('inc/dictionnaires');
43        include_spip('inc/texte');
44        $definitions = dictionnaires_lister_definitions();
45        $masques = array();
46        foreach ($definitions as $definition){
47                $masques[] = $definition['masque'];
48        }
49       
50        // Quelque soit le type de définition
51        // on ne fait rien à l'intérieur de certaines balises
52        $masque_echap = '{<(acronym|abbr|a|code|cadre|textarea)[^>]*>.*</\1>}Uis';
53        preg_match_all($masque_echap, $texte, $balises_echap, PREG_SET_ORDER);
54        $morceaux_a_traiter = preg_split($masque_echap, $texte);
55       
56        // On parcours uniquement les textes hors balises <abbr>
57        foreach ($morceaux_a_traiter as $cle => $morceau_a_traiter){
58                // On ne traite que ce qui est hors balises
59                $masque_balises = '{<([a-z]+[^<>]*)>}i';
60                preg_match_all($masque_balises, $morceau_a_traiter, $balises, PREG_SET_ORDER);
61                $textes_a_traiter = preg_split($masque_balises, $morceau_a_traiter);
62                $textes_a_traiter = preg_replace_callback($masques, 'dictionnaires_replace_callback', $textes_a_traiter);
63               
64                foreach ($textes_a_traiter as $cle2 => $texte_a_traiter){
65                        $textes_a_traiter[$cle2] = $texte_a_traiter ;
66                        if (isset($balises[$cle2][0])) 
67                                $textes_a_traiter[$cle2] .= $balises[$cle2][0];
68                }
69               
70                $morceaux_a_traiter[$cle] = join('', $textes_a_traiter);
71                if (isset($balises_echap[$cle][0])) 
72                        $morceaux_a_traiter[$cle] .= $balises_echap[$cle][0];
73        }
74        $texte = join('', $morceaux_a_traiter);
75       
76        $texte = echappe_retour($texte, 'dictionnaires');
77        return $texte;
78}
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 ($definition = $definitions[$captures[2]] or $definition = $definitions[strtolower($captures[2])]){
99                $type = $definition['type'];
100               
101                // Si on a demandé à remplacer uniquement le premier mot trouvé
102                if (
103                        ($type and lire_config('dictionnaires/remplacer_premier_'.$type))
104                        or (!$type and lire_config('dictionnaires/remplacer_premier_defaut'))
105                ){
106                        foreach ($definition['termes'] as $terme){
107                                if (in_array($terme, $deja_remplaces)){
108                                        $remplacer_celui_la = false;
109                                }
110                        }
111                }
112               
113                // On ne travaille pas pour rien !
114                if ($remplacer_celui_la){
115                        if (function_exists("dictionnaires_remplacer_$type")) { $remplacer = "dictionnaires_remplacer_$type"; }
116                        elseif (function_exists("dictionnaires_remplacer_${type}_dist")) { $remplacer = "dictionnaires_remplacer_${type}_dist"; }
117                        elseif (function_exists("dictionnaires_remplacer_defaut")) { $remplacer = "dictionnaires_remplacer_defaut"; }
118                        else { $remplacer = "dictionnaires_remplacer_defaut_dist"; }
119               
120                        $retour = $captures[1].code_echappement($remplacer($captures[2], $definition), 'dictionnaires');
121                        $deja_remplaces = array_merge($deja_remplaces, $definition['termes']);
122                }
123        }
124       
125        return $retour;
126}
127
128?>
Note: See TracBrowser for help on using the repository browser.