source: spip-zone/_plugins_/rainette/trunk/inc/rainette_normaliser.php @ 113722

Last change on this file since 113722 was 113722, checked in by eric@…, 20 months ago

Ajout d'un formulaire de vidage des cache d'un service.

  • Property svn:eol-style set to native
File size: 41.9 KB
Line 
1<?php
2/**
3 * Ce fichier contient les fonctions internes destinées à standardiser les données météorologiques.
4 *
5 * @package SPIP\RAINETTE\MASHUP
6 */
7
8if (!defined('_ECRIRE_INC_VERSION')) {
9        return;
10}
11
12if (!defined('_RAINETTE_REGEXP_LIEU_IP')) {
13        /**
14         * Regexp permettant de reconnaître un lieu au format adresse IP
15         */
16        define('_RAINETTE_REGEXP_LIEU_IP', '#(?:\d{1,3}\.){3}\d{1,3}#');
17}
18if (!defined('_RAINETTE_REGEXP_LIEU_COORDONNEES')) {
19        /**
20         * Regexp permettant de reconnaître un lieu au format coordonnées géographiques latitude,longitude
21         */
22        define('_RAINETTE_REGEXP_LIEU_COORDONNEES', '#([\-\+]?\d+(?:\.\d+)?)\s*,\s*([\-\+]?\d+(?:\.\d+)?)#');
23}
24if (!defined('_RAINETTE_REGEXP_LIEU_WEATHER_ID')) {
25        /**
26         * Regexp permettant de reconnaître un lieu au format Weather ID
27         */
28        define('_RAINETTE_REGEXP_LIEU_WEATHER_ID', '#[a-zA-Z]{4}\d{4}#i');
29}
30
31$GLOBALS['rainette_config']['erreurs'] = array(
32        'code'    => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_erreur'),
33        'message' => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_erreur'),
34);
35
36$GLOBALS['rainette_config']['infos'] = array(
37        // Lieu
38        'ville'     => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_lieu'),
39        'pays'      => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_lieu'),
40        'pays_iso2' => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_lieu'),
41        'region'    => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_lieu'),
42        // Coordonnées géographiques
43        'longitude' => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'angle', 'groupe' => 'donnees_coordonnees'),
44        'latitude'  => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'angle', 'groupe' => 'donnees_coordonnees'),
45);
46
47$GLOBALS['rainette_config']['conditions'] = array(
48        // Données d'observation
49        'derniere_maj'          => array('origine' => 'service', 'type_php' => 'date', 'type_unite' => '', 'groupe' => 'donnees_observation'),
50        'station'               => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_observation'),
51        // Températures
52        'temperature_reelle'    => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'temperature', 'groupe' => 'donnees_temperatures'),
53        'temperature_ressentie' => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'temperature', 'groupe' => 'donnees_temperatures'),
54        // Données anémométriques
55        'vitesse_vent'          => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'vitesse', 'groupe' => 'donnees_anemometriques'),
56        'angle_vent'            => array('origine' => 'service', 'type_php' => 'int', 'type_unite' => 'angle', 'groupe' => 'donnees_anemometriques'),
57        'direction_vent'        => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_anemometriques'),
58        // Données atmosphériques
59        'precipitation'         => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'precipitation', 'groupe' => 'donnees_atmospheriques'),
60        'humidite'              => array('origine' => 'service', 'type_php' => 'int', 'type_unite' => 'pourcentage', 'groupe' => 'donnees_atmospheriques'),
61        'point_rosee'           => array('origine' => 'service', 'type_php' => 'int', 'type_unite' => 'temperature', 'groupe' => 'donnees_atmospheriques'),
62        'pression'              => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'pression', 'groupe' => 'donnees_atmospheriques'),
63        'tendance_pression'     => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_atmospheriques'),
64        'visibilite'            => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'distance', 'groupe' => 'donnees_atmospheriques'),
65        'indice_uv'             => array('origine' => 'service', 'type_php' => 'int', 'type_unite' => 'indice', 'groupe' => 'donnees_atmospheriques'),
66        'risque_uv'             => array('origine' => 'calcul', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_atmospheriques'),
67        // Etats météorologiques natifs
68        'code_meteo'            => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_etats_natifs'),
69        'icon_meteo'            => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_etats_natifs'),
70        'desc_meteo'            => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_etats_natifs'),
71        'trad_meteo'            => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_etats_natifs'),
72        // Etats météorologiques calculés
73        'icone'                 => array('origine' => 'calcul', 'type_php' => 'mixed', 'type_unite' => '', 'groupe' => 'donnees_etats_calcules'),
74        'resume'                => array('origine' => 'calcul', 'type_php' => 'mixed', 'type_unite' => '', 'groupe' => 'donnees_etats_calcules'),
75        'periode'               => array('origine' => 'calcul', 'type_php' => 'int', 'type_unite' => '', 'groupe' => 'donnees_etats_calcules'),
76);
77
78$GLOBALS['rainette_config']['previsions'] = array(
79        // Données d'observation
80        'date'                 => array('origine' => 'service', 'type_php' => 'date', 'type_unite' => '', 'rangement' => 'jour', 'groupe' => 'donnees_observation'),
81        'heure'                => array('origine' => 'service', 'type_php' => 'heure', 'type_unite' => '', 'rangement' => 'heure', 'groupe' => 'donnees_observation'),
82        // Données astronomiques
83        'lever_soleil'         => array('origine' => 'service', 'type_php' => 'date', 'type_unite' => '', 'rangement' => 'jour', 'groupe' => 'donnees_astronomiques'),
84        'coucher_soleil'       => array('origine' => 'service', 'type_php' => 'date', 'type_unite' => '', 'rangement' => 'jour', 'groupe' => 'donnees_astronomiques'),
85        // Températures
86        'temperature'          => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'temperature', 'rangement' => 'heure', 'groupe' => 'donnees_temperatures'),
87        'temperature_max'      => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'temperature', 'rangement' => 'jour', 'groupe' => 'donnees_temperatures'),
88        'temperature_min'      => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'temperature', 'rangement' => 'jour', 'groupe' => 'donnees_temperatures'),
89        // Données anémométriques
90        'vitesse_vent'         => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'vitesse', 'rangement' => 'heure', 'groupe' => 'donnees_anemometriques'),
91        'angle_vent'           => array('origine' => 'service', 'type_php' => 'int', 'type_unite' => 'angle', 'rangement' => 'heure', 'groupe' => 'donnees_anemometriques'),
92        'direction_vent'       => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'rangement' => 'heure', 'groupe' => 'donnees_anemometriques'),
93        // Données atmosphériques
94        'risque_precipitation' => array('origine' => 'service', 'type_php' => 'int', 'type_unite' => 'pourcentage', 'rangement' => 'heure', 'groupe' => 'donnees_atmospheriques'),
95        'precipitation'        => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'precipitation', 'rangement' => 'heure', 'groupe' => 'donnees_atmospheriques'),
96        'humidite'             => array('origine' => 'service', 'type_php' => 'int', 'type_unite' => 'pourcentage', 'rangement' => 'heure', 'groupe' => 'donnees_atmospheriques'),
97        'point_rosee'          => array('origine' => 'service', 'type_php' => 'int', 'type_unite' => 'temperature', 'rangement' => 'heure', 'groupe' => 'donnees_atmospheriques'),
98        'pression'             => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'pression', 'rangement' => 'heure', 'groupe' => 'donnees_atmospheriques'),
99        'visibilite'           => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'distance', 'rangement' => 'heure', 'groupe' => 'donnees_atmospheriques'),
100        'indice_uv'            => array('origine' => 'service', 'type_php' => 'int', 'type_unite' => 'indice', 'rangement' => 'heure', 'groupe' => 'donnees_atmospheriques'),
101        'risque_uv'            => array('origine' => 'calcul', 'type_php' => 'string', 'type_unite' => '', 'rangement' => 'heure', 'groupe' => 'donnees_atmospheriques'),
102        // Etats météorologiques natifs
103        'code_meteo'           => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'rangement' => 'heure', 'groupe' => 'donnees_etats_natifs'),
104        'icon_meteo'           => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'rangement' => 'heure', 'groupe' => 'donnees_etats_natifs'),
105        'desc_meteo'           => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'rangement' => 'heure', 'groupe' => 'donnees_etats_natifs'),
106        'trad_meteo'           => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'rangement' => 'heure', 'groupe' => 'donnees_etats_natifs'),
107        // Etats météorologiques calculés
108        'icone'                => array('origine' => 'calcul', 'type_php' => 'mixed', 'type_unite' => '', 'rangement' => 'heure', 'groupe' => 'donnees_etats_calcules'),
109        'resume'               => array('origine' => 'calcul', 'type_php' => 'mixed', 'type_unite' => '', 'rangement' => 'heure', 'groupe' => 'donnees_etats_calcules'),
110        'periode'              => array('origine' => 'calcul', 'type_php' => 'int', 'type_unite' => '', 'rangement' => 'heure', 'groupe' => 'donnees_etats_calcules'),
111);
112
113$GLOBALS['rainette_config']['periodicite'] = array(
114        24 => array(24, 12),
115        12 => array(12),
116        1  => array(1, 3, 6)
117);
118
119$GLOBALS['rainette_config']['langues_alternatives'] = array(
120        'aa'           => array(),           // afar
121        'ab'           => array(),           // abkhaze
122        'af'           => array('en'),       // afrikaans
123        'am'           => array(),           // amharique
124        'an'           => array('es'),       // aragonais
125        'ar'           => array(),           // arabe
126        'as'           => array(),           // assamais
127        'ast'          => array('es'),       // asturien - iso 639-2
128        'ay'           => array(),           // aymara
129        'az'           => array('ru'),       // azeri
130        'ba'           => array(),           // bashkir
131        'be'           => array('ru'),       // bielorusse
132        'ber_tam'      => array('ar'),       // berbère
133        'ber_tam_tfng' => array('ar'),       // berbère tifinagh
134        'bg'           => array(),           // bulgare
135        'bh'           => array(),           // langues biharis
136        'bi'           => array(),           // bichlamar
137        'bm'           => array(),           // bambara
138        'bn'           => array(),           // bengali
139        'bo'           => array(),           // tibétain
140        'br'           => array('fr'),       // breton
141        'bs'           => array(),           // bosniaque
142        'ca'           => array('es'),       // catalan
143        'co'           => array('fr'),       // corse
144        'cpf'          => array('fr'),       // créole réunionais
145        'cpf_dom'      => array('es'),       // créole ???
146        'cpf_hat'      => array('fr'),       // créole haïtien
147        'cs'           => array(),           // tchèque
148        'cy'           => array('en'),       // gallois
149        'da'           => array(),           // danois
150        'de'           => array(),           // allemand
151        'dz'           => array(),           // dzongkha
152        'el'           => array(),           // grec moderne
153        'en'           => array(),           // anglais
154        'en_hx'        => array('en'),       // anglais hacker
155        'en_sm'        => array('en'),       // anglais smurf
156        'eo'           => array(),           // esperanto
157        'es'           => array(),           // espagnol
158        'es_co'        => array('es'),       // espagnol colombien
159        'es_mx_pop'    => array('es'),       // espagnol mexicain
160        'et'           => array(),           // estonien
161        'eu'           => array('fr'),       // basque
162        'fa'           => array(),           // persan (farsi)
163        'ff'           => array(),           // peul
164        'fi'           => array('sv'),       // finnois
165        'fj'           => array('en'),       // fidjien
166        'fo'           => array('da'),       // féroïen
167        'fon'          => array(),           // fon
168        'fr'           => array(),           // français
169        'fr_fem'       => array('fr'),       // français féminin
170        'fr_sc'        => array('fr'),       // français schtroumpf
171        'fr_lpc'       => array('fr'),       // français langue parlée
172        'fr_lsf'       => array('fr'),       // français langue des signes
173        'fr_spl'       => array('fr'),       // français simplifié
174        'fr_tu'        => array('fr'),       // français copain
175        'fy'           => array('de'),       // frison occidental
176        'ga'           => array('en'),       // irlandais
177        'gd'           => array('en'),       // gaélique écossais
178        'gl'           => array('es'),       // galicien
179        'gn'           => array(),           // guarani
180        'grc'          => array('el'),       // grec ancien
181        'gu'           => array(),           // goudjrati
182        'ha'           => array(),           // haoussa
183        'hac'          => array('ku'),       // Kurdish-Horami
184        'hbo'          => array('il'),       // hebreu classique ou biblique
185        'he'           => array(),           // hébreu
186        'hi'           => array(),           // hindi
187        'hr'           => array(),           // croate
188        'hu'           => array(),           // hongrois
189        'hy'           => array(),           // armenien
190        'ia'           => array(),           // interlingua (langue auxiliaire internationale)
191        'id'           => array(),           // indonésien
192        'ie'           => array(),           // interlingue
193        'ik'           => array(),           // inupiaq
194        'is'           => array(),           // islandais
195        'it'           => array(),           // italien
196        'it_fem'       => array('it'),       // italien féminin
197        'iu'           => array(),           // inuktitut
198        'ja'           => array(),           // japonais
199        'jv'           => array(),           // javanais
200        'ka'           => array(),           // géorgien
201        'kk'           => array(),           // kazakh
202        'kl'           => array('da'),       // groenlandais
203        'km'           => array(),           // khmer central
204        'kn'           => array(),           // Kannada
205        'ko'           => array(),           // coréen
206        'kok'          => array(),           // konkani (macrolangage)
207        'ks'           => array(),           // kashmiri
208        'ku'           => array(),           // kurde
209        'ky'           => array(),           // kirghiz
210        'la'           => array('fr'),       // latin
211        'lb'           => array('fr'),       // luxembourgeois
212        'ln'           => array(),           // lingala
213        'lo'           => array(),           // lao
214        'lt'           => array(),           // lituanien
215        'lu'           => array(),           // luba-katanga
216        'lv'           => array(),           // letton
217        'man'          => array(),           // mandingue
218        'mfv'          => array(),           // manjaque - iso-639-3
219        'mg'           => array('fr'),       // malgache
220        'mi'           => array(),           // maori
221        'mk'           => array(),           // macédonien
222        'ml'           => array(),           // malayalam
223        'mn'           => array('zh'),       // mongol
224        'mo'           => array('ro'),       // moldave ??? normalement c'est ro comme le roumain
225        'mos'          => array(),           // moré - iso 639-2
226        'mr'           => array(),           // marathe
227        'ms'           => array(),           // malais
228        'mt'           => array('en'),       // maltais
229        'my'           => array(),           // birman
230        'na'           => array(),           // nauruan
231        'nap'          => array('it'),       // napolitain - iso 639-2
232        'ne'           => array(),           // népalais
233        'nqo'          => array(),           // n’ko - iso 639-3
234        'nl'           => array(),           // néerlandais
235        'no'           => array(),           // norvégien
236        'nb'           => array('no'),       // norvégien bokmål
237        'nn'           => array('no'),       // norvégien nynorsk
238        'oc'           => array('fr'),       // occitan
239        'oc_lnc'       => array('oc', 'fr'), // occitan languedocien
240        'oc_ni'        => array('oc', 'fr'), // occitan niçard
241        'oc_ni_la'     => array('oc', 'fr'), // occitan niçard larg
242        'oc_ni_mis'    => array('oc', 'fr'), // occitan niçard mistralenc
243        'oc_prv'       => array('oc', 'fr'), // occitan provençal
244        'oc_gsc'       => array('oc', 'fr'), // occitan gascon
245        'oc_lms'       => array('oc', 'fr'), // occitan limousin
246        'oc_auv'       => array('oc', 'fr'), // occitan auvergnat
247        'oc_va'        => array('oc', 'fr'), // occitan vivaro-alpin
248        'om'           => array(),           // galla
249        'or'           => array(),           // oriya
250        'pa'           => array(),           // pendjabi
251        'pbb'          => array(),           // Nasa Yuwe (páez) - iso 639-3
252        'pl'           => array(),           // polonais
253        'prs'          => array(),           // Dari (Afghanistan) - iso 639-3
254        'ps'           => array(),           // pachto
255        'pt'           => array(),           // portugais
256        'pt_br'        => array('pt'),       // portugais brésilien
257        'qu'           => array('es'),       // quechua
258        'rm'           => array('fr'),       // romanche
259        'rn'           => array(),           // rundi
260        'ro'           => array(),           // roumain
261        'roa'          => array('fr'),       // langues romanes (ch'ti) - iso 639-2
262        'ru'           => array(),           // russe
263        'rw'           => array(),           // rwanda
264        'sa'           => array(),           // sanskrit
265        'sc'           => array('it'),       // sarde
266        'scn'          => array('it'),       // sicilien - iso 639-2
267        'sd'           => array(),           // sindhi
268        'sg'           => array(),           // sango
269        'sh'           => array('sh'),       // serbo-croate
270        'sh_latn'      => array('sh'),       // serbo-croate latin
271        'sh_cyrl'      => array('sh'),       // serbo-croate cyrillique
272        'si'           => array(),           // singhalais
273        'sk'           => array(),           // slovaque
274        'sl'           => array(),           // slovène
275        'sm'           => array('en'),       // samoan
276        'sn'           => array(),           // shona
277        'so'           => array(),           // somali
278        'sq'           => array(),           // albanais
279        'sr'           => array(),           // serbe
280        'src'          => array('it'),       // sarde logoudorien - iso 639-3
281        'sro'          => array('it'),       // sarde campidanien - iso 639-3
282        'ss'           => array(),           // swati
283        'st'           => array(),           // sotho du Sud
284        'su'           => array(),           // soundanais
285        'sv'           => array(),           // suédois
286        'sw'           => array(),           // swahili
287        'ta'           => array(),           // tamoul
288        'te'           => array(),           // télougou
289        'tg'           => array(),           // tadjik
290        'th'           => array(),           // thaï
291        'ti'           => array(),           // tigrigna
292        'tk'           => array(),           // turkmène
293        'tl'           => array(),           // tagalog
294        'tn'           => array(),           // tswana
295        'to'           => array('en'),       // tongan (Îles Tonga)
296        'tr'           => array(),           // turc
297        'ts'           => array(),           // tsonga
298        'tt'           => array(),           // tatar
299        'tw'           => array(),           // twi
300        'ty'           => array('fr'),       // tahitien
301        'ug'           => array(),           // ouïgour
302        'uk'           => array('ru'),       // ukrainien
303        'ur'           => array(),           // ourdou
304        'uz'           => array(),           // ouszbek
305        'vi'           => array(),           // vietnamien
306        'vo'           => array(),           // volapük
307        'wa'           => array('fr'),       // wallon
308        'wo'           => array(),           // wolof
309        'xh'           => array(),           // xhosa
310        'yi'           => array('he'),       // yiddish
311        'yo'           => array(),           // yoruba
312        'za'           => array('zh'),       // zhuang
313        'zh'           => array(),           // chinois (ecriture simplifiee)
314        'zh_tw'        => array('zh'),       // chinois taiwan (ecriture traditionnelle)
315        'zu'           => array()            // zoulou
316);
317
318if (!defined('_RAINETTE_CACHE_NOMDIR')) {
319        /**
320         * Nom du dossier contenant les fichiers caches
321         */
322        define('_RAINETTE_CACHE_NOMDIR', 'cache-rainette/');
323}
324if (!defined('_RAINETTE_CACHE_DIR')) {
325        /**
326         * Chemin du dossier contenant les fichiers caches
327         */
328        define('_RAINETTE_CACHE_DIR', _DIR_VAR . _RAINETTE_CACHE_NOMDIR);
329}
330
331
332/**
333 * Normalise les données issues du service dans un tableau standard aux index prédéfinis pour chaque mode.
334 *
335 * @param array  $configuration_service
336 *        Configuration statique et utilisateur du service ayant retourné le flux de données.
337 * @param string $mode
338 *        Le type de données météorologiques demandé :
339 *        - `conditions`, la valeur par défaut
340 *        - `previsions`
341 *        - `infos`
342 * @param array  $flux
343 *        Le tableau brut des données météorologiques issu de l'appel au service.
344 * @param int    $periode
345 *        Valeur de 0 à n pour indiquer qu'on traite les données de prévisions d'une période horaire donnée
346 *        ou -1 pour indiquer que l'on traite les données jour. La valeur maximale n dépend de la périodicité
347 *        des prévisions, par exemple, elle vaut 0 pour une périodicité de 24h, 1 pour 12h...
348 *
349 * @return array
350 *        Le tableau standardisé des données météorologiques du service pour la période spécifiée.
351 */
352function meteo_normaliser($configuration_service, $mode, $flux, $periode) {
353        $tableau = array();
354
355        include_spip('inc/filtres');
356        if ($flux !== null) {
357                // Le service a renvoyé des données, on boucle sur les clés du tableau normalisé
358                // Néanmoins, en fonction de la période fournie en argument on filtre les données uniquement
359                // utiles à cette période:
360                // - si période = -1 on traite les données jour
361                // - si période > -1 on traite les données heure
362                foreach (array_keys($GLOBALS['rainette_config'][$mode]) as $_donnee) {
363                        if ((($periode == -1)
364                                 and (empty($GLOBALS['rainette_config'][$mode][$_donnee]['rangement'])
365                                          or ($GLOBALS['rainette_config'][$mode][$_donnee]['rangement'] == 'jour')))
366                                or (($periode > -1) and ($GLOBALS['rainette_config'][$mode][$_donnee]['rangement'] == 'heure'))
367                        ) {
368                                if ($GLOBALS['rainette_config'][$mode][$_donnee]['origine'] == 'service') {
369                                        // La donnée est fournie par le service. Elle n'est jamais calculée par le plugin
370                                        // Néanmoins, elle peut-être indisponible temporairement
371                                        if ($cle_service = $configuration_service['donnees'][$_donnee]['cle']) {
372                                                // La donnée est normalement fournie par le service car elle possède une configuration de clé
373                                                // On traite le cas où le nom de la clé varie suivant le système d'unité choisi ou la langue.
374                                                // La clé de base peut être vide, le suffixe contenant dès lors toute la clé.
375                                                if (!empty($configuration_service['donnees'][$_donnee]['suffixe_unite'])) {
376                                                        $systeme_unite = $configuration_service['unite'];
377                                                        $id_suffixee = $configuration_service['donnees'][$_donnee]['suffixe_unite']['id_cle'];
378                                                        $cle_service[$id_suffixee] .= $configuration_service['donnees'][$_donnee]['suffixe_unite'][$systeme_unite];
379                                                } elseif (!empty($configuration_service['donnees'][$_donnee]['suffixe_langue'])) {
380                                                        $langue = langue_determiner($configuration_service);
381                                                        $id_suffixee = $configuration_service['donnees'][$_donnee]['suffixe_langue']['id_cle'];
382                                                        $cle_service[$id_suffixee] .= $langue;
383                                                }
384
385                                                // On utilise donc la clé pour calculer la valeur du service.
386                                                // Si la valeur est disponible on la stocke sinon on met la donnée à chaine vide pour
387                                                // montrer l'indisponibilité temporaire.
388                                                $donnee = '';
389                                                $valeur_service = empty($cle_service)
390                                                        ? $flux
391                                                        : table_valeur($flux, implode('/', $cle_service), '');
392                                                if ($valeur_service !== '') {
393                                                        $typer = donnee_typer($mode, $_donnee);
394                                                        $valeur_typee = $typer($valeur_service);
395
396                                                        // Vérification de la donnée en cours de traitement si une fonction idoine existe
397                                                        $verifier = "donnee_verifier_${_donnee}";
398                                                        if (!function_exists($verifier) or (function_exists($verifier) and $verifier($valeur_typee))) {
399                                                                $donnee = $valeur_typee;
400                                                        }
401                                                }
402                                        } else {
403                                                // La donnée météo n'est jamais fournie par le service. On la positionne à null pour
404                                                // la distinguer avec une donnée vide qui indique une indisponibilité temporaire.
405                                                $donnee = null;
406                                        }
407                                } else {
408                                        // La données météo est toujours calculée à posteriori par le plugin indépendamment
409                                        // du service. On l'initialise temporairement à la chaine vide.
410                                        $donnee = '';
411                                }
412
413                                $tableau[$_donnee] = $donnee;
414                        }
415                }
416        }
417
418        return $tableau;
419}
420
421
422/**
423 * Détermine, en fonction du type PHP configuré, la fonction à appliquer à la valeur d'une donnée.
424 *
425 * @param string $mode
426 *        Le type de données météorologiques demandé :
427 *        - `conditions`, la valeur par défaut
428 *        - `previsions`
429 *        - `infos`
430 * @param string $donnee
431 *        Correspond à l'index du tableau associatif standardisé comme `temperature`, `humidite`, `precipitation`...
432 *
433 * @return string
434 *        La fonction PHP (floatval, intval...) ou spécifique à appliquer à la valeur de la donnée.
435 */
436function donnee_typer($mode, $donnee) {
437        $fonction = '';
438
439        $type_php = isset($GLOBALS['rainette_config'][$mode][$donnee]['type_php'])
440                ? $GLOBALS['rainette_config'][$mode][$donnee]['type_php']
441                : '';
442        if ($type_php) {
443                switch ($type_php) {
444                        case 'float':
445                                $fonction = 'floatval';
446                                break;
447                        case 'int':
448                                $fonction = 'intval';
449                                break;
450                        case 'string':
451                                $fonction = 'strval';
452                                break;
453                        case 'date':
454                                $fonction = 'donnee_formater_date';
455                                break;
456                        case 'heure':
457                                $fonction = 'donnee_formater_heure';
458                                break;
459                        default:
460                                $fonction = '';
461                }
462        }
463
464        return $fonction;
465}
466
467
468/**
469 * Formate une date numérique ou sous une autre forme en une date au format `Y-m-d H:i:s`.
470 *
471 * @param string $donnee
472 *        Correspond à un index du tableau associatif standardisé à formater en date standard.
473 *
474 * @return string
475 *        Date au format `Y-m-d H:i:s`.
476 */
477function donnee_formater_date($donnee) {
478        if (is_numeric($donnee)) {
479                $date = date('Y-m-d H:i:s', $donnee);
480        } else {
481                $date = date_create($donnee);
482                if (!$date) {
483                        $elements_date = explode(' ', $donnee);
484                        array_pop($elements_date);
485                        $donnee = implode(' ', $elements_date);
486                        $date = date_create($donnee);
487                }
488                $date = date_format($date, 'Y-m-d H:i:s');
489        }
490
491        return $date;
492}
493
494/**
495 * Formate une heure numérique ou sous une autre forme en une heure au format `H:i`.
496 *
497 * @param string $donnee
498 *        Correspond à un index du tableau associatif standardisé à formater en heure standard.
499 *
500 * @return string
501 *        Heure au format `H:i`.
502 */
503function donnee_formater_heure($donnee) {
504        if (is_numeric($donnee)) {
505                $taille = strlen($donnee);
506                if ($taille < 3) {
507                        $m = '00';
508                        $h = $donnee;
509                } else {
510                        $m = substr($donnee, -2);
511                        $h = strlen($donnee) == 3
512                                ? substr($donnee, 0, 1)
513                                : substr($donnee, 0, 2);
514                }
515                $heure = "${h}:${m}";
516        } else {
517                $heure = $donnee;
518        }
519
520        return $heure;
521}
522
523/**
524 * Vérifie que la valeur de l'indice UV est acceptable.
525 *
526 * @param int $valeur
527 *        Valeur de l'indice UV à vérifier. Un indice UV est toujours compris entre 0 et 16, bornes comprises.
528 *
529 * @return bool
530 *        `true` si la valeur est acceptable, `false` sinon.
531 */
532function donnee_verifier_indice_uv($valeur) {
533
534        $est_valide = true;
535        if (($valeur < 0) or ($valeur > 16)) {
536                $est_valide = false;
537        }
538
539        return $est_valide;
540}
541
542/**
543 * @param $erreur
544 * @param $lieu
545 * @param $mode
546 * @param $modele
547 * @param $service
548 *
549 * @return array
550 */
551function erreur_formater_texte($erreur, $lieu, $mode, $modele, $service, $nom_service) {
552
553        $texte = array('principal' => '', 'conseil' => '', 'service' => '');
554
555        $type_erreur = $erreur['type'];
556        switch ($type_erreur) {
557                // Cas d'erreur lors du traitement de la requête par le plugin
558                case 'url_indisponible':
559                case 'analyse_xml':
560                case 'analyse_json':
561                        // Cas d'erreur où le service renvoie aucune donnée sans pour autant monter une erreur.
562                case 'aucune_donnee':
563                        // Cas d'erreur où le nombre de requêtes maximal a été atteint.
564                        $texte['principal'] .= _T("rainette:erreur_${type_erreur}", array('service' => $nom_service));
565                        $texte['conseil'] .= _T('rainette:erreur_conseil_equipe');
566                        break;
567                // Cas d'erreur renvoyé par le service lui-même
568                case 'reponse_service':
569                        if (!empty($erreur['service']['code'])) {
570                                $texte['service'] .= $erreur['service']['code'];
571                        }
572                        if (!empty($erreur['service']['message'])) {
573                                $texte['service'] .= ($texte['service'] ? ' - ' : '') . $erreur['service']['message'];
574                        }
575                        $texte['principal'] .= _T("rainette:erreur_${type_erreur}_${mode}", array('service' => $nom_service, 'lieu' => $lieu));
576                        $texte['conseil'] .= _T('rainette:erreur_conseil_service');
577                        break;
578                // Cas d'erreur où le nombre de requêtes maximal a été atteint.
579                case 'limite_service':
580                        $texte['principal'] .= _T("rainette:erreur_${type_erreur}", array('service' => $nom_service));
581                        $texte['conseil'] .= _T('rainette:erreur_conseil_limite');
582                        break;
583                // Cas d'erreur du à une mauvaise utilisation des modèles
584                case 'modele_periodicite':
585                        $texte['principal'] .= _T("rainette:erreur_${type_erreur}", array('modele' => $modele));
586                        $texte['conseil'] .= _T('rainette:erreur_conseil_periodicite');
587                        break;
588                case 'modele_service':
589                        $texte['principal'] .= _T("rainette:erreur_${type_erreur}", array('modele' => $modele, 'service' => $nom_service));
590                        $texte['conseil'] .= _T('rainette:erreur_conseil_modele_changer');
591                        break;
592                case 'modele_inutilisable':
593                        $texte['principal'] .= _T("rainette:erreur_${type_erreur}", array('modele' => $modele));
594                        $texte['conseil'] .= _T('rainette:erreur_conseil_modele_expliciter');
595                        break;
596        }
597
598
599        return $texte;
600}
601
602/**
603 * @param $type_modele
604 * @param $service
605 *
606 * @return int
607 */
608function periodicite_determiner($type_modele, $service) {
609
610        // Périodicité initialisée à "non trouvée"
611        $periodicite = 0;
612
613        if (isset($GLOBALS['rainette_config']['periodicite'][$type_modele])) {
614                // Acquérir la configuration statique du service pour connaître les périodicités horaires supportées
615                // pour le mode prévisions.
616                include_spip("services/${service}");
617                $configurer = "${service}_service2configuration";
618                $configuration = $configurer('previsions');
619                $periodicites_service = array_keys($configuration['periodicites']);
620
621                $periodicites_modele = $GLOBALS['rainette_config']['periodicite'][$type_modele];
622                foreach ($periodicites_modele as $_periodicite_modele) {
623                        if (in_array($_periodicite_modele, $periodicites_service)) {
624                                $periodicite = $_periodicite_modele;
625                                break;
626                        }
627                }
628        }
629
630        return $periodicite;
631}
632
633
634/**
635 * @param $type_modele
636 * @param $periodicite
637 *
638 * @return bool
639 */
640function periodicite_est_compatible($type_modele, $periodicite) {
641
642        // Initialisation de la compatibilité à "non compatible".
643        $compatible = false;
644
645        if (isset($GLOBALS['rainette_config']['periodicite'][$type_modele])
646                and in_array($periodicite, $GLOBALS['rainette_config']['periodicite'][$type_modele])
647        ) {
648                $compatible = true;
649        }
650
651        return $compatible;
652}
653
654
655/**
656 * Construit le nom du cache en fonction du servide, du lieu, du type de données et de la langue utilisée par le site.
657 *
658 * @param string $lieu
659 *        Lieu pour lequel on requiert le nom du cache.
660 * @param string $mode
661 *        Type de données météorologiques. Les valeurs possibles sont `infos`, `conditions` ou `previsions`.
662 * @param int    $periodicite
663 *        La périodicité horaire des prévisions :
664 *        - `24`, `12`, `6`, `3` ou `1`, pour le mode `previsions`
665 *        - `0`, pour les modes `conditions` et `infos`
666 * @param array  $configuration_service
667 *        Configuration complète du service, statique et utilisateur.
668 *
669 * @return string
670 *        Chemin complet du fichier cache.
671 */
672function cache_nommer($lieu, $mode, $periodicite, $configuration_service) {
673
674        // Identification de la langue du resume.
675        $code_langue = langue_determiner($configuration_service);
676
677        // Construction du chemin du fichier cache
678        // Création et/ou détermination du dossier de destination du cache en fonction du service
679        $dossier_cache = sous_repertoire(_DIR_VAR, trim(_RAINETTE_CACHE_NOMDIR, '/'));
680        $dossier_cache = sous_repertoire($dossier_cache, $configuration_service['alias']);
681
682        // Le nom du fichier cache est composé comme suit, chaque élément étant séparé par un underscore :
683        // -- le nom du lieu normalisé (sans espace et dont tous les caractères non alphanumériques sont remplacés par un tiret
684        // -- le nom du mode (infos, conditions ou previsions) accolé à la périodicité du cache pour les prévisions uniquement
685        // -- la langue du résumé si il existe ou rien si aucune traduction n'est fournie par le service
686        $lieu_normalise = lieu_normaliser($lieu);
687        $fichier_cache = $dossier_cache
688                                         . str_replace(array(' ', ',', '+', '.', '/'), '-', $lieu_normalise)
689                                         . '_' . $mode
690                                         . ($periodicite ? strval($periodicite) : '')
691                                         . ($code_langue ? '_' . strtolower($code_langue) : '')
692                                         . '.txt';
693
694        return $fichier_cache;
695}
696
697
698/**
699 * Construit le nom du cache en fonction du servide, du lieu, du type de données et de la langue utilisée par le site.
700 *
701 * @param string       $service
702 *        Alias du service météorologique.
703 * @param array|string $caches
704 *        Liste des fichiers à supprimer ou vide si tous les fichiers cache doivent être supprimés.
705 *        Il est possible de passer un seul fichier comme une chaine.
706 *
707 * @return boolean
708 *        Toujours à `true`.
709 */
710function cache_supprimer($service, $caches = array()) {
711
712        include_spip('inc/flock');
713
714        if ($caches) {
715                $fichiers_cache = is_string($caches) ? array($caches) : $caches;
716        } else {
717                $fichiers_cache = glob(_RAINETTE_CACHE_DIR . $service . '/*.txt');
718        }
719
720        if ($fichiers_cache) {
721                foreach ($fichiers_cache as $_fichier) {
722                        supprimer_fichier($_fichier);
723                }
724        }
725
726        return true;
727}
728
729
730/**
731 * Répertorie les fichiers caches issu de l'utilisation de l'API d'un service donné.
732 * La fonction renvoie une description de chaque fichier cache, à savoir, à minima, l'action lancée, le TSN
733 * du taxon concerné et le nom du fichier cache.
734 *
735 * @package SPIP\TAXONOMIE\CACHE
736 *
737 * @param string $service
738 *        Alias en minuscules du service pour lequel on veut lister les caches créés ou chaine vide si on souhaite
739 *        tous les caches sans distinction de service.
740 *
741 * @return array
742 *        Tableau des descriptions des fichiers cache créés par le ou les services.
743 */
744function cache_repertorier($service = '') {
745
746        // Initialisation de la liste des descriptions des caches du service
747        $descriptions_cache = array();
748
749        // On constitue la liste des services requis par l'appel
750        include_spip('rainette_fonctions');
751        $services = rainette_lister_services();
752        if ($service) {
753                if (array_key_exists($service, $services)) {
754                        $services = array($service => $services[$service]);
755                } else {
756                        $services = array();
757                }
758        }
759
760        if ($services) {
761                foreach ($services as $_service => $_titre) {
762                        // Récupération des fichiers cache du service.
763                        $fichiers_cache = glob(_RAINETTE_CACHE_DIR . $_service . '/*.txt');
764
765                        if ($fichiers_cache) {
766                                foreach ($fichiers_cache as $_fichier_cache) {
767                                        // On raz la description pour éviter de garder des éléments du cache précédent et on initialise avec
768                                        // le nom du fichier qui peut servir d'id, le chemin complet et le service.
769                                        $description = array();
770                                        $description['nom_cache'] = basename($_fichier_cache, '.txt');
771                                        $description['fichier_cache'] = $_fichier_cache;
772
773                                        // On extrait le service qui sert toujours d'index principal du tableau
774                                        $description['service'] = $_service;
775                                        $description['titre_service'] = $_titre;
776
777                                        // On décompose le nom pour récupérer l'action et le TSN correspondant ainsi que la langue.
778                                        // Le nom du fichier est composé d'éléments séparés par un underscore. La structure est toujours
779                                        // composée dans l'ordre du service, de l'action et du TSN et peut être complétée par la langue.
780                                        $elements = explode('_', $description['nom_cache']);
781                                        $description['lieu'] = $elements[0];
782                                        $description['modele'] = $elements[1];
783                                        $description['langue'] = $elements[2];
784
785                                        // On structure le tableau suivant que l'on demande un service ou tous.
786                                        if ($service) {
787                                                $descriptions_cache['ervice'] = $_service;
788                                                $descriptions_cache['titre_service'] = $_titre;
789                                                $descriptions_cache['caches'][] = $description;
790                                        } else {
791                                                $descriptions_cache[$_service]['titre_service'] = $_titre;
792                                                $descriptions_cache[$_service]['caches'][] = $description;
793                                        }
794                                }
795                        }
796                }
797        }
798
799        return $descriptions_cache;
800}
801
802
803/**
804 * @param string $lieu
805 * @param string $format_lieu
806 *
807 * @return string
808 */
809function lieu_normaliser($lieu, &$format_lieu = '') {
810
811        $lieu_normalise = trim($lieu);
812
813        if (preg_match(_RAINETTE_REGEXP_LIEU_WEATHER_ID, $lieu_normalise, $match)) {
814                $format_lieu = 'weather_id';
815                $lieu_normalise = $match[0];
816        } elseif (preg_match(_RAINETTE_REGEXP_LIEU_COORDONNEES, $lieu_normalise, $match)) {
817                $format_lieu = 'latitude_longitude';
818                $lieu_normalise = "{$match[1]},{$match[2]}";
819        } elseif (preg_match(_RAINETTE_REGEXP_LIEU_IP, $lieu_normalise, $match)) {
820                $format_lieu = 'adresse_ip';
821                $lieu_normalise = $match[0];
822        } else {
823                $format_lieu = 'ville_pays';
824                // On détermine la ville et éventuellement le pays (ville[,pays])
825                // et on élimine les espaces par un seul "+".
826                $elements = explode(',', $lieu_normalise);
827                $lieu_normalise = trim($elements[0]) . (!empty($elements[1]) ? ',' . trim($elements[1]) : '');
828                $lieu_normalise = preg_replace('#\s{1,}#', '+', $lieu_normalise);
829        }
830
831        return $lieu_normalise;
832}
833
834
835/**
836 * @param $configuration_service
837 *
838 * @return mixed
839 */
840function langue_determiner($configuration_service) {
841
842        // Les services de Rainette sauf weather.com peuvent renvoyer la traduction du résumé dans plusieurs langues.
843        // il est donc nécessaire de demander ce résumé dans la bonne langue si elle existe.
844
845        // On détermine la "bonne langue" : on choisit soit celle de la page en cours
846        // soit celle en cours pour l'affichage.
847        $langue_spip = !empty($GLOBALS['lang']) ? $GLOBALS['lang'] : $GLOBALS['spip_lang'];
848
849        // On cherche d'abord si le service fournit la langue utilisée par le site.
850        // -- Pour cela on utilise la configuration du service qui fournit un tableau des langues disponibles
851        //    sous le format [code de langue du service] = code de langue spip.
852        $langue_service = array_search($langue_spip, $configuration_service['langues']['disponibles']);
853
854        if ($langue_service === false) {
855                // La langue utilisée par SPIP n'est pas supportée par le service.
856                // -- On cherche si il existe une langue SPIP utilisable meilleure que la langue par défaut du service.
857                // -- Pour ce faire on a défini pour chaque code de langue spip, un ou deux codes de langue SPIP à utiliser
858                //    en cas d'absence de la langue concernée dans un ordre de priorité (index 0, puis index 1).
859                $langue_service = $configuration_service['langues']['defaut'];
860                if ($GLOBALS['rainette_config']['langues_alternatives'][$langue_spip]) {
861                        foreach ($GLOBALS['rainette_config']['langues_alternatives'][$langue_spip] as $_langue_alternative) {
862                                $langue_service = array_search($_langue_alternative, $configuration_service['langues']['disponibles']);
863                                if ($langue_service !== false) {
864                                        break;
865                                }
866                        }
867                }
868        }
869
870        // Aucune langue ne correspond véritablement, on choisit donc la langue configurée par défaut.
871        if ($langue_service === false) {
872                $langue_service = $configuration_service['langues']['defaut'];
873        }
874
875        return $langue_service;
876}
877
878/**
879 * @param $mode
880 * @param $configuration
881 *
882 * @return array
883 */
884function configuration_donnees_normaliser($mode, $configuration) {
885
886        $configuration_normalisee = array();
887
888        foreach ($GLOBALS['rainette_config'][$mode] as $_donnee => $_configuration) {
889                if ($_configuration['origine'] == 'service') {
890                        $configuration_normalisee[$_donnee] = !empty($configuration[$_donnee]['cle']) ? true : false;
891                }
892        }
893
894        return $configuration_normalisee;
895}
896
897/**
898 * @param $service
899 * @param $configuration_defaut
900 *
901 * @return mixed
902 */
903function parametrage_normaliser($service, $configuration_defaut) {
904
905        // On récupère la configuration utilisateur
906        include_spip('inc/config');
907        $configuration_utilisateur = lire_config("rainette/${service}", array());
908
909        // On complète la configuration avec des valeurs par défaut si nécessaire.
910        foreach ($configuration_defaut as $_cle => $_valeur) {
911                if (!isset($configuration_utilisateur[$_cle])) {
912                        $configuration_utilisateur[$_cle] = $_valeur;
913                }
914        }
915
916        return $configuration_utilisateur;
917}
918
919/**
920 * @param int|string $code_meteo
921 * @param string     $theme
922 * @param array      $transcodage
923 * @param int        $periode
924 *
925 * @return string
926 */
927function icone_weather_normaliser($code_meteo, $theme, $transcodage = array(), $periode = 0) {
928
929        // Si le transcodage échoue ou que le code weather est erroné on renvoie toujours N/A.
930        $icone = 'na';
931
932        // Transcodage en code weather.com.
933        $code = is_string($code_meteo) ? strtolower($code_meteo) : intval($code_meteo);
934        if ($transcodage) {
935                // Service différent de weather.com
936                if (array_key_exists($code, $transcodage) and isset($transcodage[$code][$periode])) {
937                        $icone = strval($transcodage[$code][$periode]);
938                }
939        } else {
940                // Service weather.com
941                if (($code >= 0) and ($code < 48)) {
942                        $icone = strval($code);
943                }
944        }
945
946        // Construction du chemin complet de l'icone.
947        $chemin = icone_local_normaliser("${icone}.png",'weather', $theme);
948
949        return $chemin;
950}
951
952/**
953 * @param string $icone
954 * @param string $service
955 * @param string $theme
956 * @param string $periode
957 *
958 * @return string
959 */
960function icone_local_normaliser($icone, $service, $theme = '', $periode = '') {
961
962        // On initialise le dossier de l'icone pour le service demandé.
963        $chemin = "themes/${service}";
964        // Si on demande un thème il faut créer le sous-dossier.
965        if ($theme) {
966                $chemin .= "/${theme}";
967        }
968        // Si le service gère des icones suivant le jour ou la nuit il faut ajouter le sous-dossier concerné.
969        if ($periode) {
970                $chemin .= "/${periode}";
971        }
972        // On finalise le chemin complet avec le nom de l'icone sauf si on ne veut que le dossier.
973        if ($icone) {
974                $chemin .= "/${icone}";
975        }
976
977        return $chemin;
978}
Note: See TracBrowser for help on using the repository browser.