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

Last change on this file since 65485 was 65485, checked in by marcimat@…, 7 years ago

Poursuite du passage à SPIP 3 du plugin dictionnaire. On utilise l'api d'objets éditoriaux et on ne met que les squelettes nécessaires dans le plugin. Au passage on PHPDoc toutes les fonctions.

File size: 5.6 KB
Line 
1<?php
2
3/**
4 * Usage de pipelines
5 *
6 * @package SPIP\Dictionnaires\Pipelines
7**/
8
9// Sécurité
10if (!defined('_ECRIRE_INC_VERSION')) return;
11
12/**
13 * Crée des liaisons entre les objets et les définitions.
14 *
15 * Pour chaque objet édité, regarde si les contenus possèdent des définitions
16 * que l'on connaît et dans ce cas crée une liaison entre l'objet et la définition.
17 *
18 * Cela permet de connaître, pour une définition donnée, la liste des
19 * objets sur lesquels est rattaché une définition. À l'inverse, cela
20 * permet, pour un objet de connaître les définitions qu'il possède.
21 *
22 * @todo
23 *     Tout cela est à faire !!!
24 *
25 * @pipeline post_edition
26 *
27 * @param array $flux   Données du pipeline
28 * @return array        Données du pipeline
29**/
30function dictionnaires_post_edition($flux){
31        // TOUT CELA EST A FAIRE
32        return $flux;
33
34        // Seulement si c'est une modif d'objet
35        if ($flux['args']['action'] == 'modifier' and $id_objet = $flux['args']['id_objet']){
36                $trouver_table = charger_fonction('trouver_table', 'base/');
37                $desc = $trouver_table($flux['args']['table_objet'], $flux['args']['serveur']);
38                $id_table_objet = id_table_objet($flux['args']['type']);
39               
40                // On cherche les champs textuels
41                $champs_texte = array();
42                foreach ($desc['field'] as $champ=>$sql){
43                        if (preg_match('/(text|blob|varchar)/', $sql)){
44                                $champs_texte[] = $champ;
45                        }
46                }
47               
48                // On récupère ces champs
49                $textes = sql_fetsel($champs_texte, $flux['args']['spip_table_objet'], "$id_table_objet = $id_objet");
50                // On récupère les définitions
51                include_spip('inc/dictionnaires');
52                $definitions = dictionnaires_lister_definitions();
53               
54                // On les scanne
55                foreach ($textes as $texte){
56                       
57                }
58        }
59}
60
61/**
62 * Ajoute pour les textes passés à propre les définitions sur les
63 * termes à définir.
64 *
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>
67 *
68 * @pipeline post_edition
69 *
70 * @param string $texte  Texte
71 * @return string        Texte
72**/
73function 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'];
80        }
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');
109        return $texte;
110}
111
112
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**/
125function 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
173?>
Note: See TracBrowser for help on using the repository browser.