source: spip-zone/_plugins_/taxonomie/trunk/inc/taxonomer.php @ 92840

Last change on this file since 92840 was 92840, checked in by eric@…, 4 years ago

Intégration des fonctions de gestion du cache dans inc/taxonomer.
Utilisation de importer_charset sur le nom de l'auteur.

  • Property svn:eol-style set to native
File size: 8.8 KB
Line 
1<?php
2
3if (!defined("_ECRIRE_INC_VERSION")) return;
4
5if (!defined('_TAXONOMIE_REGNE_ANIMAL'))
6        define('_TAXONOMIE_REGNE_ANIMAL', 'animalia');
7if (!defined('_TAXONOMIE_REGNE_VEGETAL'))
8        define('_TAXONOMIE_REGNE_VEGETAL', 'plantae');
9if (!defined('_TAXONOMIE_REGNE_FONGIQUE'))
10        define('_TAXONOMIE_REGNE_FONGIQUE', 'fungi');
11
12if (!defined('_TAXONOMIE_LISTE_REGNES'))
13        define('_TAXONOMIE_LISTE_REGNES',
14                implode(':', array(
15                        _TAXONOMIE_REGNE_ANIMAL,
16                        _TAXONOMIE_REGNE_VEGETAL,
17                        _TAXONOMIE_REGNE_FONGIQUE
18                )));
19
20if (!defined('_TAXONOMIE_RANG_REGNE'))
21        define('_TAXONOMIE_RANG_REGNE', 'kingdom');
22// Suivant le règne l'embranchement se nomme phylum (animalia) ou division (fungi, plantae).
23// Néanmoins, le terme phylum est souvent accepté pour l'ensemble des règnes
24if (!defined('_TAXONOMIE_RANG_PHYLUM'))
25        define('_TAXONOMIE_RANG_PHYLUM', 'phylum');
26if (!defined('_TAXONOMIE_RANG_DIVISION'))
27        define('_TAXONOMIE_RANG_DIVISION', 'division');
28if (!defined('_TAXONOMIE_RANG_CLASSE'))
29        define('_TAXONOMIE_RANG_CLASSE', 'class');
30if (!defined('_TAXONOMIE_RANG_ORDRE'))
31        define('_TAXONOMIE_RANG_ORDRE', 'order');
32if (!defined('_TAXONOMIE_RANG_FAMILLE'))
33        define('_TAXONOMIE_RANG_FAMILLE', 'family');
34if (!defined('_TAXONOMIE_RANG_GENRE'))
35        define('_TAXONOMIE_RANG_GENRE', 'genus');
36if (!defined('_TAXONOMIE_RANG_ESPECE'))
37        define('_TAXONOMIE_RANG_ESPECE', 'species');
38if (!defined('_TAXONOMIE_RANG_SOUS_ESPECE'))
39        define('_TAXONOMIE_RANG_SOUS_ESPECE', 'subspecies');
40if (!defined('_TAXONOMIE_RANG_VARIETE'))
41        define('_TAXONOMIE_RANG_VARIETE', 'variety');
42if (!defined('_TAXONOMIE_RANG_SOUS_VARIETE'))
43        define('_TAXONOMIE_RANG_SOUS_VARIETE', 'subvariety');
44if (!defined('_TAXONOMIE_RANG_RACE'))
45        define('_TAXONOMIE_RANG_RACE', 'race');
46if (!defined('_TAXONOMIE_RANG_FORME'))
47        define('_TAXONOMIE_RANG_FORME', 'forma');
48if (!defined('_TAXONOMIE_RANG_SOUS_FORME'))
49        define('_TAXONOMIE_RANG_SOUS_FORME', 'subforma');
50
51// Liste des rangs utilisés du règne au genre compris.
52// On utilise par défaut au niveau 2 le terme phylum du règne animal
53// (division pour les autres règnes)
54if (!defined('_TAXONOMIE_RANGS_PARENTS_ESPECE'))
55        define('_TAXONOMIE_RANGS_PARENTS_ESPECE',
56                implode(':', array(
57                        _TAXONOMIE_RANG_REGNE,
58                        _TAXONOMIE_RANG_PHYLUM,
59                        _TAXONOMIE_RANG_CLASSE,
60                        _TAXONOMIE_RANG_ORDRE,
61                        _TAXONOMIE_RANG_FAMILLE,
62                        _TAXONOMIE_RANG_GENRE
63                )));
64// Liste des rangs utilisés de l'espèce à la sous-forme
65if (!defined('_TAXONOMIE_RANGS_ESPECE_ET_FILS'))
66        define('_TAXONOMIE_RANGS_ESPECE_ET_FILS',
67                implode(':', array(
68                        _TAXONOMIE_RANG_ESPECE,
69                        _TAXONOMIE_RANG_SOUS_ESPECE,
70                        _TAXONOMIE_RANG_VARIETE,
71                        _TAXONOMIE_RANG_SOUS_VARIETE,
72                        _TAXONOMIE_RANG_RACE,
73                        _TAXONOMIE_RANG_FORME,
74                        _TAXONOMIE_RANG_SOUS_FORME
75                )));
76// Liste complète des rangs utilisés par le plugin
77if (!defined('_TAXONOMIE_RANGS'))
78        define('_TAXONOMIE_RANGS',
79                _TAXONOMIE_RANGS_PARENTS_ESPECE . ':' . _TAXONOMIE_RANGS_ESPECE_ET_FILS);
80
81if (!defined('_TAXONOMIE_CACHE_NOMDIR'))
82        /**
83         * Nom du dossier contenant les fichiers caches des éléments de taxonomie */
84        define('_TAXONOMIE_CACHE_NOMDIR', 'cache-taxonomie/');
85if (!defined('_TAXONOMIE_CACHE_DIR'))
86        /**
87         * Chemin du dossier contenant les fichiers caches des boussoles */
88        define('_TAXONOMIE_CACHE_DIR', _DIR_VAR . _TAXONOMIE_CACHE_NOMDIR);
89
90
91/**
92 * Renvoie, à partir de l'url du service, le tableau des données demandées.
93 * Le service utilise dans ce cas une chaine JSON qui est décodée pour fournir
94 * le tableau de sortie. Le flux retourné par le service est systématiquement
95 * transcodé dans le chrset du site avant d'être décodé.
96 *
97 *@param string $url
98 *              URL complète du service web.
99 *
100*@return array
101 */
102function url2json_data($url) {
103        // Acquisition des données spécifiées par l'url
104        include_spip('inc/distant');
105        $flux = recuperer_page($url, true);
106
107        // Tranformation de la chaine json reçue en tableau associatif
108        $data = json_decode($flux, true);
109
110        return $data;
111}
112
113
114/**
115 * Liste dans un tableau les règnes supportés par le plugin, à savoir: animalia,
116 * plantae et fungi.
117 * Les règnes sont exprimés avec leur nom scientifique en lettres minuscules.
118 *
119 * @return array
120 */
121function lister_regnes() {
122        return explode(':', _TAXONOMIE_LISTE_REGNES);
123}
124
125
126function preserver_taxons_edites($regne) {
127        $select = array('tsn', 'nom_commun', 'descriptif');
128        $where = array('regne=' . sql_quote($regne), 'edite=' . sql_quote('oui'));
129        $taxons = sql_allfetsel($select, 'spip_taxons', $where);
130
131        return $taxons;
132}
133
134
135function merger_multi($nom_charge, $nom_edite, $priorite_edition=true) {
136        $source = array();
137        $destination = array();
138        $nom_merge = '';
139
140        // Suivant la priorite entre édition et chargement automatique on positionne la source
141        // (priorite plus faible) et la destination (priorité plus haute)
142        $nom_source = $nom_charge;
143        $nom_destination = $nom_edite;
144        if (!$priorite_edition) {
145                $nom_source = $nom_edite;
146                $nom_destination = $nom_charge;
147        }
148
149        // On extrait les noms par langue
150        if (preg_match(_EXTRAIRE_MULTI, $nom_source, $match))
151                $source = extraire_trads($match[1]);
152        if (preg_match(_EXTRAIRE_MULTI, $nom_destination, $match))
153                $destination = extraire_trads($match[1]);
154
155        // On complète la destination avec les noms de la source dont la langue n'est pas
156        // présente dans la destination
157        foreach ($source as $_lang => $_nom) {
158                if (!array_key_exists($_lang, $destination)) {
159                        $destination[$_lang] = $_nom;
160                }
161        }
162
163        // On construit le nom mergé à partir de la destination
164        foreach ($destination as $_lang => $_nom) {
165                $nom_merge .= '[' . $_lang . ']' . $_nom;
166        }
167        $nom_merge = '<multi>' . $nom_merge . '</multi>';
168
169        return $nom_merge;
170}
171
172/**
173 * Ecriture d'un contenu issu d'un service web taxonomique dans un fichier texte afin d'optimiser le nombre
174 * de requête adressée au service.
175 *
176 * @param string        $cache
177 *              Contenu du fichier cache. Si le service appelant manipule un tableau il doit le sériliser avant
178 *      d'appeler cette fonction.
179 * @param string    $service
180 * @param int       $tsn
181 * @param string    $code_langue
182 * @param string    $action
183 *
184 * @return boolean
185 *              Toujours à vrai.
186 */
187function ecrire_cache_taxonomie($cache, $service, $tsn, $code_langue='', $action='') {
188        // Création du dossier cache si besoin
189        sous_repertoire(_DIR_VAR, trim(_TAXONOMIE_CACHE_DIR, '/'));
190
191        // Ecriture du fichier cache
192        $fichier_cache = nommer_cache_taxonomie($service, $tsn, $code_langue, $action);
193        ecrire_fichier($fichier_cache, $cache);
194
195        return true;
196}
197
198
199/**
200 * @param $service
201 * @param $tsn
202 * @param string $code_langue
203 * @param string $action
204 * @return string
205 */
206function nommer_cache_taxonomie($service, $tsn, $code_langue='', $action='') {
207        // Construction du chemin complet d'un fichier cache
208        $fichier_cache = _TAXONOMIE_CACHE_DIR
209                . $service
210                . ($action ? '_' . $action : '')
211                . '_' . $tsn
212                . ($code_langue ? '_' . $code_langue : '');
213
214        return $fichier_cache;
215}
216
217/**
218 * Vérifie l'existence du fichier cache pour un taxon et un service donnés. Si le fichier existe
219 * la fonction retourne son chemin complet.
220 *
221 * @param string    $service
222 * @param int       $tsn
223 * @param string    $code_langue
224 * @param string    $action
225 *
226 * @return string
227 *              Chemin du fichier cache si il existe ou chaine vide sinon.
228 */
229function cache_taxonomie_existe($service, $tsn, $code_langue='', $action='') {
230        // Contruire le nom du fichier cache
231        $fichier_cache = nommer_cache_taxonomie($service, $tsn, $code_langue, $action);
232
233        // Vérification de l'existence du fichier:
234        // - chaine vide si le fichier n'existe pas
235        // - chemin complet du fichier si il existe
236        if (!file_exists($fichier_cache))
237                $fichier_cache = '';
238
239        return $fichier_cache;
240}
241
242
243/**
244 * Supprime tous les fichiers caches.
245 *
246 * @return boolean
247 *              Toujours à vrai.
248 */
249function supprimer_caches(){
250        include_spip('inc/flock');
251
252        if ($fichiers_cache = glob(_TAXONOMIE_CACHE_DIR . "*.*")) {
253                foreach ($fichiers_cache as $_fichier) {
254                        supprimer_fichier($_fichier);
255                }
256        }
257
258        return true;
259}
260
261
262/**
263 * Etablit la liste de tous les caches y compris celui de la liste des boussoles
264 * et construit un tableau avec la liste des fichiers et l'alias de la boussole
265 * associée.
266 *
267 * @return array
268 *              Tableau des caches recensés :
269 *
270 *              - fichier : chemin complet du fichier cache,
271 *              - alias : alias de la boussole ou vide si on est en présence de la liste des boussoles.
272 */
273function trouver_caches(){
274        $caches = array();
275
276        $fichier_liste = cache_liste_existe();
277        if ($fichier_liste)
278                $caches[] = array('fichier' => $fichier_liste, 'alias' => '');
279
280        $pattern_cache = _BOUSSOLE_DIR_CACHE . str_replace(_BOUSSOLE_PATTERN_ALIAS, '*', _BOUSSOLE_CACHE);
281        $fichiers_cache = glob($pattern_cache);
282        if ($fichiers_cache) {
283                foreach($fichiers_cache as $_fichier) {
284                        $alias_boussole = str_replace(_BOUSSOLE_PREFIXE_CACHE, '', basename($_fichier, '.xml'));
285                        $caches[] = array('fichier' => $_fichier, 'alias' => $alias_boussole);
286                }
287        }
288
289        return $caches;
290}
291
292?>
Note: See TracBrowser for help on using the repository browser.