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

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

Début d'amélioration de la gestion des caches afin de sécuriser l'accès aux services qui durcissent de plus en plus leur conditions d'utilisations sur le nombre de requêtes par unité de temps. On déplace dans un premier temps les caches de tmp/cache vers local/

  • Property svn:eol-style set to native
File size: 30.8 KB
Line 
1<?php
2
3if (!defined('_ECRIRE_INC_VERSION')) {
4        return;
5}
6
7if (!defined('_RAINETTE_REGEXP_LIEU_IP')) {
8        /**
9         * Regexp permettant de reconnaitre un lieu au format adresse IP
10         */
11        define('_RAINETTE_REGEXP_LIEU_IP', '#(?:\d{1,3}\.){3}\d{1,3}#');
12}
13if (!defined('_RAINETTE_REGEXP_LIEU_COORDONNEES')) {
14        /**
15         * Regexp permettant de reconnaitre un lieu au format coordonnées géographiques latitude,longitude
16         */
17        define('_RAINETTE_REGEXP_LIEU_COORDONNEES', '#([\-\+]?\d+(?:\.\d+)?)\s*,\s*([\-\+]?\d+(?:\.\d+)?)#');
18}
19if (!defined('_RAINETTE_REGEXP_LIEU_WEATHER_ID')) {
20        /**
21         * Regexp permettant de reconnaitre un lieu au format Weather ID
22         */
23        define('_RAINETTE_REGEXP_LIEU_WEATHER_ID', '#[a-zA-Z]{4}\d{4}#i');
24}
25
26$GLOBALS['rainette_config']['infos'] = array(
27        // Lieu
28        'ville'     => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_lieu'),
29        'pays'      => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_lieu'),
30        'pays_iso2' => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_lieu'),
31        'region'    => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_lieu'),
32        // Coordonnées géographiques
33        'longitude' => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'angle', 'groupe' => 'donnees_coordonnees'),
34        'latitude'  => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'angle', 'groupe' => 'donnees_coordonnees'),
35);
36
37$GLOBALS['rainette_config']['conditions'] = array(
38        // Données d'observation
39        'derniere_maj'          => array('origine' => 'service', 'type_php' => 'date', 'type_unite' => '', 'groupe' => 'donnees_observation'),
40        'station'               => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_observation'),
41        // Températures
42        'temperature_reelle'    => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'temperature', 'groupe' => 'donnees_temperatures'),
43        'temperature_ressentie' => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'temperature', 'groupe' => 'donnees_temperatures'),
44        // Données anémométriques
45        'vitesse_vent'          => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'vitesse', 'groupe' => 'donnees_anemometriques'),
46        'angle_vent'            => array('origine' => 'service', 'type_php' => 'int', 'type_unite' => 'angle', 'groupe' => 'donnees_anemometriques'),
47        'direction_vent'        => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_anemometriques'),
48        // Données atmosphériques
49        'precipitation'         => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'precipitation', 'groupe' => 'donnees_atmospheriques'),
50        'humidite'              => array('origine' => 'service', 'type_php' => 'int', 'type_unite' => 'pourcentage', 'groupe' => 'donnees_atmospheriques'),
51        'point_rosee'           => array('origine' => 'service', 'type_php' => 'int', 'type_unite' => 'temperature', 'groupe' => 'donnees_atmospheriques'),
52        'pression'              => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'pression', 'groupe' => 'donnees_atmospheriques'),
53        'tendance_pression'     => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_atmospheriques'),
54        'visibilite'            => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'distance', 'groupe' => 'donnees_atmospheriques'),
55        'indice_uv'             => array('origine' => 'service', 'type_php' => 'int', 'type_unite' => 'indice', 'groupe' => 'donnees_atmospheriques'),
56        'risque_uv'             => array('origine' => 'calcul', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_atmospheriques'),
57        // Etats météorologiques natifs
58        'code_meteo'            => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_etats_natifs'),
59        'icon_meteo'            => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_etats_natifs'),
60        'desc_meteo'            => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_etats_natifs'),
61        'trad_meteo'            => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'groupe' => 'donnees_etats_natifs'),
62        // Etats météorologiques calculés
63        'icone'                 => array('origine' => 'calcul', 'type_php' => 'mixed', 'type_unite' => '', 'groupe' => 'donnees_etats_calcules'),
64        'resume'                => array('origine' => 'calcul', 'type_php' => 'mixed', 'type_unite' => '', 'groupe' => 'donnees_etats_calcules'),
65        'periode'               => array('origine' => 'calcul', 'type_php' => 'int', 'type_unite' => '', 'groupe' => 'donnees_etats_calcules'),
66);
67
68$GLOBALS['rainette_config']['previsions'] = array(
69        // Données d'observation
70        'date'                 => array('origine' => 'service', 'type_php' => 'date', 'type_unite' => '', 'rangement' => 'jour', 'groupe' => 'donnees_observation'),
71        'heure'                => array('origine' => 'service', 'type_php' => 'heure', 'type_unite' => '', 'rangement' => 'heure', 'groupe' => 'donnees_observation'),
72        // Données astronomiques
73        'lever_soleil'         => array('origine' => 'service', 'type_php' => 'date', 'type_unite' => '', 'rangement' => 'jour', 'groupe' => 'donnees_astronomiques'),
74        'coucher_soleil'       => array('origine' => 'service', 'type_php' => 'date', 'type_unite' => '', 'rangement' => 'jour', 'groupe' => 'donnees_astronomiques'),
75        // Températures
76        'temperature'          => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'temperature', 'rangement' => 'heure', 'groupe' => 'donnees_temperatures'),
77        'temperature_max'      => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'temperature', 'rangement' => 'jour', 'groupe' => 'donnees_temperatures'),
78        'temperature_min'      => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'temperature', 'rangement' => 'jour', 'groupe' => 'donnees_temperatures'),
79        // Données anémométriques
80        'vitesse_vent'         => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'vitesse', 'rangement' => 'heure', 'groupe' => 'donnees_anemometriques'),
81        'angle_vent'           => array('origine' => 'service', 'type_php' => 'int', 'type_unite' => 'angle', 'rangement' => 'heure', 'groupe' => 'donnees_anemometriques'),
82        'direction_vent'       => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'rangement' => 'heure', 'groupe' => 'donnees_anemometriques'),
83        // Données atmosphériques
84        'risque_precipitation' => array('origine' => 'service', 'type_php' => 'int', 'type_unite' => 'pourcentage', 'rangement' => 'heure', 'groupe' => 'donnees_atmospheriques'),
85        'precipitation'        => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'precipitation', 'rangement' => 'heure', 'groupe' => 'donnees_atmospheriques'),
86        'humidite'             => array('origine' => 'service', 'type_php' => 'int', 'type_unite' => 'pourcentage', 'rangement' => 'heure', 'groupe' => 'donnees_atmospheriques'),
87        'point_rosee'          => array('origine' => 'service', 'type_php' => 'int', 'type_unite' => 'temperature', 'rangement' => 'heure', 'groupe' => 'donnees_atmospheriques'),
88        'pression'             => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'pression', 'rangement' => 'heure', 'groupe' => 'donnees_atmospheriques'),
89        'visibilite'           => array('origine' => 'service', 'type_php' => 'float', 'type_unite' => 'distance', 'rangement' => 'heure', 'groupe' => 'donnees_atmospheriques'),
90        'indice_uv'            => array('origine' => 'service', 'type_php' => 'int', 'type_unite' => 'indice', 'rangement' => 'heure', 'groupe' => 'donnees_atmospheriques'),
91        'risque_uv'            => array('origine' => 'calcul', 'type_php' => 'string', 'type_unite' => '', 'rangement' => 'heure', 'groupe' => 'donnees_atmospheriques'),
92        // Etats météorologiques natifs
93        'code_meteo'           => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'rangement' => 'heure', 'groupe' => 'donnees_etats_natifs'),
94        'icon_meteo'           => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'rangement' => 'heure', 'groupe' => 'donnees_etats_natifs'),
95        'desc_meteo'           => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'rangement' => 'heure', 'groupe' => 'donnees_etats_natifs'),
96        'trad_meteo'           => array('origine' => 'service', 'type_php' => 'string', 'type_unite' => '', 'rangement' => 'heure', 'groupe' => 'donnees_etats_natifs'),
97        // Etats météorologiques calculés
98        'icone'                => array('origine' => 'calcul', 'type_php' => 'mixed', 'type_unite' => '', 'rangement' => 'heure', 'groupe' => 'donnees_etats_calcules'),
99        'resume'               => array('origine' => 'calcul', 'type_php' => 'mixed', 'type_unite' => '', 'rangement' => 'heure', 'groupe' => 'donnees_etats_calcules'),
100        'periode'              => array('origine' => 'calcul', 'type_php' => 'int', 'type_unite' => '', 'rangement' => 'heure', 'groupe' => 'donnees_etats_calcules'),
101);
102
103$GLOBALS['rainette_config']['periodicite'] = array(
104        24 => array(24, 12),
105        12 => array(12),
106        1  => array(1, 3, 6)
107);
108
109$GLOBALS['rainette_config']['langues_alternatives'] = array(
110        'aa'           => array(),           // afar
111        'ab'           => array(),           // abkhaze
112        'af'           => array('en'),       // afrikaans
113        'am'           => array(),           // amharique
114        'an'           => array('es'),       // aragonais
115        'ar'           => array(),           // arabe
116        'as'           => array(),           // assamais
117        'ast'          => array('es'),       // asturien - iso 639-2
118        'ay'           => array(),           // aymara
119        'az'           => array('ru'),       // azeri
120        'ba'           => array(),           // bashkir
121        'be'           => array('ru'),       // bielorusse
122        'ber_tam'      => array('ar'),       // berbère
123        'ber_tam_tfng' => array('ar'),       // berbère tifinagh
124        'bg'           => array(),           // bulgare
125        'bh'           => array(),           // langues biharis
126        'bi'           => array(),           // bichlamar
127        'bm'           => array(),           // bambara
128        'bn'           => array(),           // bengali
129        'bo'           => array(),           // tibétain
130        'br'           => array('fr'),       // breton
131        'bs'           => array(),           // bosniaque
132        'ca'           => array('es'),       // catalan
133        'co'           => array('fr'),       // corse
134        'cpf'          => array('fr'),       // créole réunionais
135        'cpf_dom'      => array('es'),       // créole ???
136        'cpf_hat'      => array('fr'),       // créole haïtien
137        'cs'           => array(),           // tchèque
138        'cy'           => array('en'),       // gallois
139        'da'           => array(),           // danois
140        'de'           => array(),           // allemand
141        'dz'           => array(),           // dzongkha
142        'el'           => array(),           // grec moderne
143        'en'           => array(),           // anglais
144        'en_hx'        => array('en'),       // anglais hacker
145        'en_sm'        => array('en'),       // anglais smurf
146        'eo'           => array(),           // esperanto
147        'es'           => array(),           // espagnol
148        'es_co'        => array('es'),       // espagnol colombien
149        'es_mx_pop'    => array('es'),       // espagnol mexicain
150        'et'           => array(),           // estonien
151        'eu'           => array('fr'),       // basque
152        'fa'           => array(),           // persan (farsi)
153        'ff'           => array(),           // peul
154        'fi'           => array('sv'),       // finnois
155        'fj'           => array('en'),       // fidjien
156        'fo'           => array('da'),       // féroïen
157        'fon'          => array(),           // fon
158        'fr'           => array(),           // français
159        'fr_fem'       => array('fr'),       // français féminin
160        'fr_sc'        => array('fr'),       // français schtroumpf
161        'fr_lpc'       => array('fr'),       // français langue parlée
162        'fr_lsf'       => array('fr'),       // français langue des signes
163        'fr_spl'       => array('fr'),       // français simplifié
164        'fr_tu'        => array('fr'),       // français copain
165        'fy'           => array('de'),       // frison occidental
166        'ga'           => array('en'),       // irlandais
167        'gd'           => array('en'),       // gaélique écossais
168        'gl'           => array('es'),       // galicien
169        'gn'           => array(),           // guarani
170        'grc'          => array('el'),       // grec ancien
171        'gu'           => array(),           // goudjrati
172        'ha'           => array(),           // haoussa
173        'hac'          => array('ku'),       // Kurdish-Horami
174        'hbo'          => array('il'),       // hebreu classique ou biblique
175        'he'           => array(),           // hébreu
176        'hi'           => array(),           // hindi
177        'hr'           => array(),           // croate
178        'hu'           => array(),           // hongrois
179        'hy'           => array(),           // armenien
180        'ia'           => array(),           // interlingua (langue auxiliaire internationale)
181        'id'           => array(),           // indonésien
182        'ie'           => array(),           // interlingue
183        'ik'           => array(),           // inupiaq
184        'is'           => array(),           // islandais
185        'it'           => array(),           // italien
186        'it_fem'       => array('it'),       // italien féminin
187        'iu'           => array(),           // inuktitut
188        'ja'           => array(),           // japonais
189        'jv'           => array(),           // javanais
190        'ka'           => array(),           // géorgien
191        'kk'           => array(),           // kazakh
192        'kl'           => array('da'),       // groenlandais
193        'km'           => array(),           // khmer central
194        'kn'           => array(),           // Kannada
195        'ko'           => array(),           // coréen
196        'kok'          => array(),           // konkani (macrolangage)
197        'ks'           => array(),           // kashmiri
198        'ku'           => array(),           // kurde
199        'ky'           => array(),           // kirghiz
200        'la'           => array('fr'),       // latin
201        'lb'           => array('fr'),       // luxembourgeois
202        'ln'           => array(),           // lingala
203        'lo'           => array(),           // lao
204        'lt'           => array(),           // lituanien
205        'lu'           => array(),           // luba-katanga
206        'lv'           => array(),           // letton
207        'man'          => array(),           // mandingue
208        'mfv'          => array(),           // manjaque - iso-639-3
209        'mg'           => array('fr'),       // malgache
210        'mi'           => array(),           // maori
211        'mk'           => array(),           // macédonien
212        'ml'           => array(),           // malayalam
213        'mn'           => array('zh'),       // mongol
214        'mo'           => array('ro'),       // moldave ??? normalement c'est ro comme le roumain
215        'mos'          => array(),           // moré - iso 639-2
216        'mr'           => array(),           // marathe
217        'ms'           => array(),           // malais
218        'mt'           => array('en'),       // maltais
219        'my'           => array(),           // birman
220        'na'           => array(),           // nauruan
221        'nap'          => array('it'),       // napolitain - iso 639-2
222        'ne'           => array(),           // népalais
223        'nqo'          => array(),           // n’ko - iso 639-3
224        'nl'           => array(),           // néerlandais
225        'no'           => array(),           // norvégien
226        'nb'           => array('no'),       // norvégien bokmål
227        'nn'           => array('no'),       // norvégien nynorsk
228        'oc'           => array('fr'),       // occitan
229        'oc_lnc'       => array('oc', 'fr'), // occitan languedocien
230        'oc_ni'        => array('oc', 'fr'), // occitan niçard
231        'oc_ni_la'     => array('oc', 'fr'), // occitan niçard larg
232        'oc_ni_mis'    => array('oc', 'fr'), // occitan niçard mistralenc
233        'oc_prv'       => array('oc', 'fr'), // occitan provençal
234        'oc_gsc'       => array('oc', 'fr'), // occitan gascon
235        'oc_lms'       => array('oc', 'fr'), // occitan limousin
236        'oc_auv'       => array('oc', 'fr'), // occitan auvergnat
237        'oc_va'        => array('oc', 'fr'), // occitan vivaro-alpin
238        'om'           => array(),           // galla
239        'or'           => array(),           // oriya
240        'pa'           => array(),           // pendjabi
241        'pbb'          => array(),           // Nasa Yuwe (páez) - iso 639-3
242        'pl'           => array(),           // polonais
243        'prs'          => array(),           // Dari (Afghanistan) - iso 639-3
244        'ps'           => array(),           // pachto
245        'pt'           => array(),           // portugais
246        'pt_br'        => array('pt'),       // portugais brésilien
247        'qu'           => array('es'),       // quechua
248        'rm'           => array('fr'),       // romanche
249        'rn'           => array(),           // rundi
250        'ro'           => array(),           // roumain
251        'roa'          => array('fr'),       // langues romanes (ch'ti) - iso 639-2
252        'ru'           => array(),           // russe
253        'rw'           => array(),           // rwanda
254        'sa'           => array(),           // sanskrit
255        'sc'           => array('it'),       // sarde
256        'scn'          => array('it'),       // sicilien - iso 639-2
257        'sd'           => array(),           // sindhi
258        'sg'           => array(),           // sango
259        'sh'           => array('sh'),       // serbo-croate
260        'sh_latn'      => array('sh'),       // serbo-croate latin
261        'sh_cyrl'      => array('sh'),       // serbo-croate cyrillique
262        'si'           => array(),           // singhalais
263        'sk'           => array(),           // slovaque
264        'sl'           => array(),           // slovène
265        'sm'           => array('en'),       // samoan
266        'sn'           => array(),           // shona
267        'so'           => array(),           // somali
268        'sq'           => array(),           // albanais
269        'sr'           => array(),           // serbe
270        'src'          => array('it'),       // sarde logoudorien - iso 639-3
271        'sro'          => array('it'),       // sarde campidanien - iso 639-3
272        'ss'           => array(),           // swati
273        'st'           => array(),           // sotho du Sud
274        'su'           => array(),           // soundanais
275        'sv'           => array(),           // suédois
276        'sw'           => array(),           // swahili
277        'ta'           => array(),           // tamoul
278        'te'           => array(),           // télougou
279        'tg'           => array(),           // tadjik
280        'th'           => array(),           // thaï
281        'ti'           => array(),           // tigrigna
282        'tk'           => array(),           // turkmène
283        'tl'           => array(),           // tagalog
284        'tn'           => array(),           // tswana
285        'to'           => array('en'),       // tongan (Îles Tonga)
286        'tr'           => array(),           // turc
287        'ts'           => array(),           // tsonga
288        'tt'           => array(),           // tatar
289        'tw'           => array(),           // twi
290        'ty'           => array('fr'),       // tahitien
291        'ug'           => array(),           // ouïgour
292        'uk'           => array('ru'),       // ukrainien
293        'ur'           => array(),           // ourdou
294        'uz'           => array(),           // ouszbek
295        'vi'           => array(),           // vietnamien
296        'vo'           => array(),           // volapük
297        'wa'           => array('fr'),       // wallon
298        'wo'           => array(),           // wolof
299        'xh'           => array(),           // xhosa
300        'yi'           => array('he'),       // yiddish
301        'yo'           => array(),           // yoruba
302        'za'           => array('zh'),       // zhuang
303        'zh'           => array(),           // chinois (ecriture simplifiee)
304        'zh_tw'        => array('zh'),       // chinois taiwan (ecriture traditionnelle)
305        'zu'           => array()            // zoulou
306);
307
308
309/**
310 * @param $config_service
311 * @param $mode
312 * @param $flux
313 * @param $periode
314 *
315 * @return array
316 */
317function service2donnees($config_service, $mode, $flux, $periode) {
318        $tableau = array();
319
320        include_spip('inc/filtres');
321        if ($flux !== null) {
322                // Le service a renvoyé des données, on boucle sur les clés du tableau normalisé
323                // Néanmoins, en fonction de la période fournie en argument on filtre les données uniquement
324                // utiles à cette période:
325                // - si période = -1 on traite les données jour
326                // - si période > -1 on traite les données heure
327                foreach (array_keys($GLOBALS['rainette_config'][$mode]) as $_donnee) {
328                        if ((($periode == -1)
329                                 and (empty($GLOBALS['rainette_config'][$mode][$_donnee]['rangement'])
330                                          or ($GLOBALS['rainette_config'][$mode][$_donnee]['rangement'] == 'jour')))
331                                or (($periode > -1) and ($GLOBALS['rainette_config'][$mode][$_donnee]['rangement'] == 'heure'))
332                        ) {
333                                if ($GLOBALS['rainette_config'][$mode][$_donnee]['origine'] == 'service') {
334                                        // La donnée est fournie par le service. Elle n'est jamais calculée par le plugin
335                                        // Néanmoins, elle peut-être indisponible temporairement
336                                        if ($cle_service = $config_service['donnees'][$_donnee]['cle']) {
337                                                // La donnée est normalement fournie par le service car elle possède une configuration de clé
338                                                // On traite le cas où le nom de la clé varie suivant le système d'unité choisi ou la langue.
339                                                // La clé de base peut être vide, le suffixe contenant dès lors toute la clé.
340                                                if (!empty($config_service['donnees'][$_donnee]['suffixe_unite'])) {
341                                                        $systeme_unite = $config_service['unite'];
342                                                        $id_suffixee = $config_service['donnees'][$_donnee]['suffixe_unite']['id_cle'];
343                                                        $cle_service[$id_suffixee] .= $config_service['donnees'][$_donnee]['suffixe_unite'][$systeme_unite];
344                                                } elseif (!empty($config_service['donnees'][$_donnee]['suffixe_langue'])) {
345                                                        $langue = trouver_langue_service($config_service);
346                                                        $id_suffixee = $config_service['donnees'][$_donnee]['suffixe_langue']['id_cle'];
347                                                        $cle_service[$id_suffixee] .= $langue;
348                                                }
349
350                                                // On utilise donc la clé pour calculer la valeur du service.
351                                                // Si la valeur est disponible on la stocke sinon on met la donnée à chaine vide pour
352                                                // montrer l'indisponibilité temporaire.
353                                                $donnee = '';
354                                                $valeur_service = empty($cle_service)
355                                                        ? $flux
356                                                        : table_valeur($flux, implode('/', $cle_service), '');
357                                                if ($valeur_service !== '') {
358                                                        $typer = donnee2typage($mode, $_donnee);
359                                                        $valeur_typee = $typer($valeur_service);
360
361                                                        // Vérification de la donnée en cours de traitement si une fonction idoine existe
362                                                        $verifier = "verifier_${_donnee}";
363                                                        if (!function_exists($verifier) or (function_exists($verifier) and $verifier($valeur_typee))) {
364                                                                $donnee = $valeur_typee;
365                                                        }
366                                                }
367                                        } else {
368                                                // La donnée météo n'est jamais fournie par le service. On la positionne à null pour
369                                                // la distinguer avec une donnée vide car indisponible temporairement.
370                                                $donnee = null;
371                                        }
372                                } else {
373                                        // La données météo est toujours calculée à posteriori par le plugin indépendamment
374                                        // du service. On l'initialise temporairement à la chaine vide.
375                                        $donnee = '';
376                                }
377
378                                $tableau[$_donnee] = $donnee;
379                        }
380                }
381        }
382
383        return $tableau;
384}
385
386
387/**
388 * @param $mode
389 * @param $donnee
390 *
391 * @return string
392 */
393function donnee2typage($mode, $donnee) {
394        $fonction = '';
395
396        $type_php = isset($GLOBALS['rainette_config'][$mode][$donnee]['type_php'])
397                ? $GLOBALS['rainette_config'][$mode][$donnee]['type_php']
398                : '';
399        if ($type_php) {
400                switch ($type_php) {
401                        case 'float':
402                                $fonction = 'floatval';
403                                break;
404                        case 'int':
405                                $fonction = 'intval';
406                                break;
407                        case 'string':
408                                $fonction = 'strval';
409                                break;
410                        case 'date':
411                                $fonction = 'donnee2date';
412                                break;
413                        case 'heure':
414                                $fonction = 'donnee2heure';
415                                break;
416                        default:
417                                $fonction = '';
418                }
419        }
420
421        return $fonction;
422}
423
424
425/**
426 * @param $donnee
427 *
428 * @return string
429 */
430function donnee2date($donnee) {
431        if (is_numeric($donnee)) {
432                $date = date('Y-m-d H:i:s', $donnee);
433        } else {
434                $date = date_create($donnee);
435                if (!$date) {
436                        $elements_date = explode(' ', $donnee);
437                        array_pop($elements_date);
438                        $donnee = implode(' ', $elements_date);
439                        $date = date_create($donnee);
440                }
441                $date = date_format($date, 'Y-m-d H:i:s');
442        }
443
444        return $date;
445}
446
447/**
448 * @param $donnee
449 *
450 * @return string
451 */
452function donnee2heure($donnee) {
453        if (is_numeric($donnee)) {
454                $taille = strlen($donnee);
455                if ($taille < 3) {
456                        $m = '00';
457                        $h = $donnee;
458                } else {
459                        $m = substr($donnee, -2);
460                        $h = strlen($donnee) == 3
461                                ? substr($donnee, 0, 1)
462                                : substr($donnee, 0, 2);
463                }
464                $heure = "${h}:${m}";
465        } else {
466                $heure = $donnee;
467        }
468
469        return $heure;
470}
471
472function verifier_indice_uv($valeur) {
473
474        $est_valide = true;
475        if (($valeur < 0) or ($valeur > 16)) {
476                $est_valide = false;
477        }
478
479        return $est_valide;
480}
481
482/**
483 * @param $type_modele
484 * @param $service
485 *
486 * @return int
487 */
488function trouver_periodicite($type_modele, $service) {
489
490        // Périodicité initialisée à "non trouvée"
491        $periodicite = 0;
492
493        if (isset($GLOBALS['rainette_config']['periodicite'][$type_modele])) {
494                // Acquérir la configuration statique du service pour connaitre les périodicités horaires supportées
495                // pour le mode prévisions
496                include_spip("services/${service}");
497                $configurer = "${service}_service2configuration";
498                $configuration = $configurer('previsions');
499                $periodicites_service = array_keys($configuration['periodicites']);
500
501                $periodicites_modele = $GLOBALS['rainette_config']['periodicite'][$type_modele];
502                foreach ($periodicites_modele as $_periodicite_modele) {
503                        if (in_array($_periodicite_modele, $periodicites_service)) {
504                                $periodicite = $_periodicite_modele;
505                                break;
506                        }
507                }
508        }
509
510        return $periodicite;
511}
512
513
514/**
515 * @param $type_modele
516 * @param $periodicite
517 *
518 * @return bool
519 */
520function periodicite_compatible($type_modele, $periodicite) {
521
522        // Périodicité initialisée à "non trouvée"
523        $compatible = false;
524
525        if (isset($GLOBALS['rainette_config']['periodicite'][$type_modele])
526                and in_array($periodicite, $GLOBALS['rainette_config']['periodicite'][$type_modele])
527        ) {
528                $compatible = true;
529        }
530
531        return $compatible;
532}
533
534
535/**
536 * 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.
537 *
538 * @param string $lieu
539 *        Lieu pour lequel on requiert le nom du cache.
540 * @param string $mode
541 *        Type de données météorologiques. Les valeurs possibles sont `infos`, `conditions` ou `previsions`.
542 * @param int    $periodicite
543 *        La périodicité horaire des prévisions :
544 *        - `24`, `12`, `6`, `3` ou `1`, pour le mode `previsions`
545 *        - `0`, pour les modes `conditions` et `infos`
546 * @param array  $config_service
547 *        Configuration complète du service, statique et utilisateur.
548 *
549 * @return string
550 *        Chemin complet du fichier cache.
551 */
552function service2cache($lieu, $mode, $periodicite, $config_service) {
553
554        // Identification de la langue du resume.
555        $code_langue = trouver_langue_service($config_service);
556
557        // Construction du chemin du fichier cache
558        $fichier_cache = normaliser_cache($config_service['alias'], $lieu, $mode, $periodicite, $code_langue);
559
560        return $fichier_cache;
561}
562
563
564/**
565 * @param $config_service
566 *
567 * @return mixed
568 */
569function trouver_langue_service($config_service) {
570
571        if ($config_service['condition'] == $config_service['alias']) {
572                // Langue SPIP : soit celle de la page soit celle en cours pour l'affichage
573                // TODO : cela a-t-il du sens ?
574                $langue_spip = $GLOBALS['lang'] ? $GLOBALS['lang'] : $GLOBALS['spip_lang'];
575
576                // On cherche si le service fournit la langue utilisée par le site.
577                // -- Pour cela on utilise la configuration du service qui fournit un tableau des langues disponibles
578                //    sous le format [code de langue du service] = code de langue spip.
579                $langue_service = array_search($langue_spip, $config_service['langues']['disponibles']);
580                if ($langue_service === false) {
581                        // La langue utilisée par SPIP n'est pas supportée par le service.
582                        // -- On cherche si il existe une langue SPIP utilisable meilleure que la langue par défaut du service.
583                        // -- Pour ce faire on a défini pour chaque code de langue spip, un ou deux codes de langue SPIP à utiliser
584                        //    en cas d'absence de la langue concernée dans un ordre de priorité (index 0, puis index 1).
585                        $langue_service = $config_service['langues']['defaut'];
586                        if ($GLOBALS['rainette_config']['langues_alternatives'][$langue_spip]) {
587                                foreach ($GLOBALS['rainette_config']['langues_alternatives'][$langue_spip] as $_langue_alternative) {
588                                        $langue_service = array_search($_langue_alternative, $config_service['langues']['disponibles']);
589                                        if ($langue_service !== false) {
590                                                break;
591                                        }
592                                }
593                        }
594                }
595        } else {
596                $langue_service = $config_service['langues']['defaut'];
597        }
598
599        return $langue_service;
600}
601
602
603/**
604 * @param $service
605 * @param $lieu
606 * @param $mode
607 * @param $periodicite
608 * @param $code_langue
609 *
610 * @return string
611 */
612function normaliser_cache($service, $lieu, $mode, $periodicite, $code_langue) {
613
614        // Création et/ou détermination du dossier de destination du cache en fonction du service
615        $dossier_cache = sous_repertoire(_DIR_VAR, 'cache-rainette');
616        $dossier_cache = sous_repertoire($dossier_cache, $service);
617
618        // Le nom du fichier cache est composé comme suit, chaque élement étant séparé par un underscore :
619        // -- le nom du lieu normalisé (sans espace et dont tous les caractères non alphanumériques sont remplacés par un tiret
620        // -- le nom du mode (infos, conditions ou previsions) accolé à la périodicité du cache pour les prévisions uniquement
621        // -- la langue du résumé si il existe ou rien si aucune traduction n'est fournie par le service
622        list($lieu_normalise,) = normaliser_lieu($lieu);
623        $fichier_cache = $dossier_cache
624                                         . str_replace(array(' ', ',', '+', '.', '/'), '-', $lieu_normalise)
625                                         . '_' . $mode
626                                         . ($periodicite ? strval($periodicite) : '')
627                                         . ($code_langue ? '_' . strtolower($code_langue) : '')
628                                         . '.txt';
629
630        return $fichier_cache;
631}
632
633
634/**
635 * @param $lieu
636 *
637 * @return array
638 */
639function normaliser_lieu($lieu) {
640
641        $lieu_normalise = trim($lieu);
642
643        if (preg_match(_RAINETTE_REGEXP_LIEU_WEATHER_ID, $lieu_normalise, $match)) {
644                $format_lieu = 'weather_id';
645                $lieu_normalise = $match[0];
646        } elseif (preg_match(_RAINETTE_REGEXP_LIEU_COORDONNEES, $lieu_normalise, $match)) {
647                $format_lieu = 'latitude_longitude';
648                $lieu_normalise = "{$match[1]},{$match[2]}";
649        } elseif (preg_match(_RAINETTE_REGEXP_LIEU_IP, $lieu_normalise, $match)) {
650                $format_lieu = 'adresse_ip';
651                $lieu_normalise = $match[0];
652        } else {
653                $format_lieu = 'ville_pays';
654                // On détermine la ville et éventuellement le pays (ville[,pays])
655                // et on élimine les espaces par un seul +
656                $elements = explode(',', $lieu_normalise);
657                $lieu_normalise = trim($elements[0]) . (!empty($elements[1]) ? ',' . trim($elements[1]) : '');
658                $lieu_normalise = preg_replace('#\s{1,}#', '+', $lieu_normalise);
659        }
660
661        return array($lieu_normalise, $format_lieu);
662}
663
664
665function normaliser_config_donnees($mode, $config_service) {
666
667        $config_donnees = array();
668
669        foreach ($GLOBALS['rainette_config'][$mode] as $_donnee => $_config) {
670                if ($_config['origine'] == 'service') {
671                        $config_donnees[$_donnee] = !empty($config_service['donnees'][$_donnee]['cle']) ? true : false;
672                }
673        }
674
675        return $config_donnees;
676}
Note: See TracBrowser for help on using the repository browser.