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

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

Ajout du service APIXU.
Ajout d'une possibilité de créer une fonction de vérification associée à un type de donnée.
Changement du logo wunderground.
Correction de certains liens obsolètes vers les sites des services.

  • 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_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.