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

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

Il restait encore quelques appels aux items de langue nom des services.

  • Property svn:eol-style set to native
File size: 36.6 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
318
319/**
320 * Normalise les données issues du service dans un tableau standard aux index prédéfinis pour chaque mode.
321 *
322 * @param array  $configuration_service
323 *        Configuration statique et utilisateur du service ayant retourné le flux de données.
324 * @param string $mode
325 *        Le type de données météorologiques demandé :
326 *        - `conditions`, la valeur par défaut
327 *        - `previsions`
328 *        - `infos`
329 * @param array  $flux
330 *        Le tableau brut des données météorologiques issu de l'appel au service.
331 * @param int    $periode
332 *        Valeur de 0 à n pour indiquer qu'on traite les données de prévisions d'une période horaire donnée
333 *        ou -1 pour indiquer que l'on traite les données jour. La valeur maximale n dépend de la périodicité
334 *        des prévisions, par exemple, elle vaut 0 pour une périodicité de 24h, 1 pour 12h...
335 *
336 * @return array
337 *        Le tableau standardisé des données météorologiques du service pour la période spécifiée.
338 */
339function meteo_normaliser($configuration_service, $mode, $flux, $periode) {
340        $tableau = array();
341
342        include_spip('inc/filtres');
343        if ($flux !== null) {
344                // Le service a renvoyé des données, on boucle sur les clés du tableau normalisé
345                // Néanmoins, en fonction de la période fournie en argument on filtre les données uniquement
346                // utiles à cette période:
347                // - si période = -1 on traite les données jour
348                // - si période > -1 on traite les données heure
349                foreach (array_keys($GLOBALS['rainette_config'][$mode]) as $_donnee) {
350                        if ((($periode == -1)
351                                 and (empty($GLOBALS['rainette_config'][$mode][$_donnee]['rangement'])
352                                          or ($GLOBALS['rainette_config'][$mode][$_donnee]['rangement'] == 'jour')))
353                                or (($periode > -1) and ($GLOBALS['rainette_config'][$mode][$_donnee]['rangement'] == 'heure'))
354                        ) {
355                                if ($GLOBALS['rainette_config'][$mode][$_donnee]['origine'] == 'service') {
356                                        // La donnée est fournie par le service. Elle n'est jamais calculée par le plugin
357                                        // Néanmoins, elle peut-être indisponible temporairement
358                                        if ($cle_service = $configuration_service['donnees'][$_donnee]['cle']) {
359                                                // La donnée est normalement fournie par le service car elle possède une configuration de clé
360                                                // On traite le cas où le nom de la clé varie suivant le système d'unité choisi ou la langue.
361                                                // La clé de base peut être vide, le suffixe contenant dès lors toute la clé.
362                                                if (!empty($configuration_service['donnees'][$_donnee]['suffixe_unite'])) {
363                                                        $systeme_unite = $configuration_service['unite'];
364                                                        $id_suffixee = $configuration_service['donnees'][$_donnee]['suffixe_unite']['id_cle'];
365                                                        $cle_service[$id_suffixee] .= $configuration_service['donnees'][$_donnee]['suffixe_unite'][$systeme_unite];
366                                                } elseif (!empty($configuration_service['donnees'][$_donnee]['suffixe_langue'])) {
367                                                        $langue = langue_determiner($configuration_service);
368                                                        $id_suffixee = $configuration_service['donnees'][$_donnee]['suffixe_langue']['id_cle'];
369                                                        $cle_service[$id_suffixee] .= $langue;
370                                                }
371
372                                                // On utilise donc la clé pour calculer la valeur du service.
373                                                // Si la valeur est disponible on la stocke sinon on met la donnée à chaine vide pour
374                                                // montrer l'indisponibilité temporaire.
375                                                $donnee = '';
376                                                $valeur_service = empty($cle_service)
377                                                        ? $flux
378                                                        : table_valeur($flux, implode('/', $cle_service), '');
379                                                if ($valeur_service !== '') {
380                                                        $typer = donnee_typer($mode, $_donnee);
381                                                        $valeur_typee = $typer($valeur_service);
382
383                                                        // Vérification de la donnée en cours de traitement si une fonction idoine existe
384                                                        $verifier = "donnee_verifier_${_donnee}";
385                                                        if (!function_exists($verifier) or (function_exists($verifier) and $verifier($valeur_typee))) {
386                                                                $donnee = $valeur_typee;
387                                                        }
388                                                }
389                                        } else {
390                                                // La donnée météo n'est jamais fournie par le service. On la positionne à null pour
391                                                // la distinguer avec une donnée vide qui indique une indisponibilité temporaire.
392                                                $donnee = null;
393                                        }
394                                } else {
395                                        // La données météo est toujours calculée à posteriori par le plugin indépendamment
396                                        // du service. On l'initialise temporairement à la chaine vide.
397                                        $donnee = '';
398                                }
399
400                                $tableau[$_donnee] = $donnee;
401                        }
402                }
403        }
404
405        return $tableau;
406}
407
408
409/**
410 * Détermine, en fonction du type PHP configuré, la fonction à appliquer à la valeur d'une donnée.
411 *
412 * @param string $mode
413 *        Le type de données météorologiques demandé :
414 *        - `conditions`, la valeur par défaut
415 *        - `previsions`
416 *        - `infos`
417 * @param string $donnee
418 *        Correspond à l'index du tableau associatif standardisé comme `temperature`, `humidite`, `precipitation`...
419 *
420 * @return string
421 *        La fonction PHP (floatval, intval...) ou spécifique à appliquer à la valeur de la donnée.
422 */
423function donnee_typer($mode, $donnee) {
424        $fonction = '';
425
426        $type_php = isset($GLOBALS['rainette_config'][$mode][$donnee]['type_php'])
427                ? $GLOBALS['rainette_config'][$mode][$donnee]['type_php']
428                : '';
429        if ($type_php) {
430                switch ($type_php) {
431                        case 'float':
432                                $fonction = 'floatval';
433                                break;
434                        case 'int':
435                                $fonction = 'intval';
436                                break;
437                        case 'string':
438                                $fonction = 'strval';
439                                break;
440                        case 'date':
441                                $fonction = 'donnee_formater_date';
442                                break;
443                        case 'heure':
444                                $fonction = 'donnee_formater_heure';
445                                break;
446                        default:
447                                $fonction = '';
448                }
449        }
450
451        return $fonction;
452}
453
454
455/**
456 * Formate une date numérique ou sous une autre forme en une date au format `Y-m-d H:i:s`.
457 *
458 * @param string $donnee
459 *        Correspond à un index du tableau associatif standardisé à formater en date standard.
460 *
461 * @return string
462 *        Date au format `Y-m-d H:i:s`.
463 */
464function donnee_formater_date($donnee) {
465        if (is_numeric($donnee)) {
466                $date = date('Y-m-d H:i:s', $donnee);
467        } else {
468                $date = date_create($donnee);
469                if (!$date) {
470                        $elements_date = explode(' ', $donnee);
471                        array_pop($elements_date);
472                        $donnee = implode(' ', $elements_date);
473                        $date = date_create($donnee);
474                }
475                $date = date_format($date, 'Y-m-d H:i:s');
476        }
477
478        return $date;
479}
480
481/**
482 * Formate une heure numérique ou sous une autre forme en une heure au format `H:i`.
483 *
484 * @param string $donnee
485 *        Correspond à un index du tableau associatif standardisé à formater en heure standard.
486 *
487 * @return string
488 *        Heure au format `H:i`.
489 */
490function donnee_formater_heure($donnee) {
491        if (is_numeric($donnee)) {
492                $taille = strlen($donnee);
493                if ($taille < 3) {
494                        $m = '00';
495                        $h = $donnee;
496                } else {
497                        $m = substr($donnee, -2);
498                        $h = strlen($donnee) == 3
499                                ? substr($donnee, 0, 1)
500                                : substr($donnee, 0, 2);
501                }
502                $heure = "${h}:${m}";
503        } else {
504                $heure = $donnee;
505        }
506
507        return $heure;
508}
509
510/**
511 * Vérifie que la valeur de l'indice UV est acceptable.
512 *
513 * @param int $valeur
514 *        Valeur de l'indice UV à vérifier. Un indice UV est toujours compris entre 0 et 16, bornes comprises.
515 *
516 * @return bool
517 *        `true` si la valeur est acceptable, `false` sinon.
518 */
519function donnee_verifier_indice_uv($valeur) {
520
521        $est_valide = true;
522        if (($valeur < 0) or ($valeur > 16)) {
523                $est_valide = false;
524        }
525
526        return $est_valide;
527}
528
529/**
530 * @param $erreur
531 * @param $lieu
532 * @param $mode
533 * @param $modele
534 * @param $service
535 *
536 * @return array
537 */
538function erreur_formater_texte($erreur, $lieu, $mode, $modele, $service, $nom_service) {
539
540        $texte = array('principal' => '', 'conseil' => '', 'service' => '');
541
542        $type_erreur = $erreur['type'];
543        switch ($type_erreur) {
544                // Cas d'erreur lors du traitement de la requête par le plugin
545                case 'url_indisponible':
546                case 'analyse_xml':
547                case 'analyse_json':
548                        // Cas d'erreur où le service renvoie aucune donnée sans pour autant monter une erreur.
549                case 'aucune_donnee':
550                        // Cas d'erreur où le nombre de requêtes maximal a été atteint.
551                        $texte['principal'] .= _T("rainette:erreur_${type_erreur}", array('service' => $nom_service));
552                        $texte['conseil'] .= _T('rainette:erreur_conseil_equipe');
553                        break;
554                // Cas d'erreur renvoyé par le service lui-même
555                case 'reponse_service':
556                        if (!empty($erreur['service']['code'])) {
557                                $texte['service'] .= $erreur['service']['code'];
558                        }
559                        if (!empty($erreur['service']['message'])) {
560                                $texte['service'] .= ($texte['service'] ? ' - ' : '') . $erreur['service']['message'];
561                        }
562                        $texte['principal'] .= _T("rainette:erreur_${type_erreur}_${mode}", array('service' => $nom_service, 'lieu' => $lieu));
563                        $texte['conseil'] .= _T('rainette:erreur_conseil_service');
564                        break;
565                // Cas d'erreur où le nombre de requêtes maximal a été atteint.
566                case 'limite_service':
567                        $texte['principal'] .= _T("rainette:erreur_${type_erreur}", array('service' => $nom_service));
568                        $texte['conseil'] .= _T('rainette:erreur_conseil_limite');
569                        break;
570                // Cas d'erreur du à une mauvaise utilisation des modèles
571                case 'modele_periodicite':
572                        $texte['principal'] .= _T("rainette:erreur_${type_erreur}", array('modele' => $modele));
573                        $texte['conseil'] .= _T('rainette:erreur_conseil_periodicite');
574                        break;
575                case 'modele_service':
576                        $texte['principal'] .= _T("rainette:erreur_${type_erreur}", array('modele' => $modele, 'service' => $nom_service));
577                        $texte['conseil'] .= _T('rainette:erreur_conseil_modele_changer');
578                        break;
579                case 'modele_inutilisable':
580                        $texte['principal'] .= _T("rainette:erreur_${type_erreur}", array('modele' => $modele));
581                        $texte['conseil'] .= _T('rainette:erreur_conseil_modele_expliciter');
582                        break;
583        }
584
585
586        return $texte;
587}
588
589/**
590 * @param $type_modele
591 * @param $service
592 *
593 * @return int
594 */
595function periodicite_determiner($type_modele, $service) {
596
597        // Périodicité initialisée à "non trouvée"
598        $periodicite = 0;
599
600        if (isset($GLOBALS['rainette_config']['periodicite'][$type_modele])) {
601                // Acquérir la configuration statique du service pour connaître les périodicités horaires supportées
602                // pour le mode prévisions.
603                include_spip("services/${service}");
604                $configurer = "${service}_service2configuration";
605                $configuration = $configurer('previsions');
606                $periodicites_service = array_keys($configuration['periodicites']);
607
608                $periodicites_modele = $GLOBALS['rainette_config']['periodicite'][$type_modele];
609                foreach ($periodicites_modele as $_periodicite_modele) {
610                        if (in_array($_periodicite_modele, $periodicites_service)) {
611                                $periodicite = $_periodicite_modele;
612                                break;
613                        }
614                }
615        }
616
617        return $periodicite;
618}
619
620
621/**
622 * @param $type_modele
623 * @param $periodicite
624 *
625 * @return bool
626 */
627function periodicite_est_compatible($type_modele, $periodicite) {
628
629        // Initialisation de la compatibilité à "non compatible".
630        $compatible = false;
631
632        if (isset($GLOBALS['rainette_config']['periodicite'][$type_modele])
633                and in_array($periodicite, $GLOBALS['rainette_config']['periodicite'][$type_modele])
634        ) {
635                $compatible = true;
636        }
637
638        return $compatible;
639}
640
641
642/**
643 * 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.
644 *
645 * @param string $lieu
646 *        Lieu pour lequel on requiert le nom du cache.
647 * @param string $mode
648 *        Type de données météorologiques. Les valeurs possibles sont `infos`, `conditions` ou `previsions`.
649 * @param int    $periodicite
650 *        La périodicité horaire des prévisions :
651 *        - `24`, `12`, `6`, `3` ou `1`, pour le mode `previsions`
652 *        - `0`, pour les modes `conditions` et `infos`
653 * @param array  $configuration_service
654 *        Configuration complète du service, statique et utilisateur.
655 *
656 * @return string
657 *        Chemin complet du fichier cache.
658 */
659function cache_nommer($lieu, $mode, $periodicite, $configuration_service) {
660
661        // Identification de la langue du resume.
662        $code_langue = langue_determiner($configuration_service);
663
664        // Construction du chemin du fichier cache
665        // Création et/ou détermination du dossier de destination du cache en fonction du service
666        $dossier_cache = sous_repertoire(_DIR_VAR, 'cache-rainette');
667        $dossier_cache = sous_repertoire($dossier_cache, $configuration_service['alias']);
668
669        // Le nom du fichier cache est composé comme suit, chaque élément étant séparé par un underscore :
670        // -- le nom du lieu normalisé (sans espace et dont tous les caractères non alphanumériques sont remplacés par un tiret
671        // -- le nom du mode (infos, conditions ou previsions) accolé à la périodicité du cache pour les prévisions uniquement
672        // -- la langue du résumé si il existe ou rien si aucune traduction n'est fournie par le service
673        $lieu_normalise = lieu_normaliser($lieu);
674        $fichier_cache = $dossier_cache
675                                         . str_replace(array(' ', ',', '+', '.', '/'), '-', $lieu_normalise)
676                                         . '_' . $mode
677                                         . ($periodicite ? strval($periodicite) : '')
678                                         . ($code_langue ? '_' . strtolower($code_langue) : '')
679                                         . '.txt';
680
681        return $fichier_cache;
682}
683
684
685/**
686 * @param string $lieu
687 * @param string $format_lieu
688 *
689 * @return string
690 */
691function lieu_normaliser($lieu, &$format_lieu = '') {
692
693        $lieu_normalise = trim($lieu);
694
695        if (preg_match(_RAINETTE_REGEXP_LIEU_WEATHER_ID, $lieu_normalise, $match)) {
696                $format_lieu = 'weather_id';
697                $lieu_normalise = $match[0];
698        } elseif (preg_match(_RAINETTE_REGEXP_LIEU_COORDONNEES, $lieu_normalise, $match)) {
699                $format_lieu = 'latitude_longitude';
700                $lieu_normalise = "{$match[1]},{$match[2]}";
701        } elseif (preg_match(_RAINETTE_REGEXP_LIEU_IP, $lieu_normalise, $match)) {
702                $format_lieu = 'adresse_ip';
703                $lieu_normalise = $match[0];
704        } else {
705                $format_lieu = 'ville_pays';
706                // On détermine la ville et éventuellement le pays (ville[,pays])
707                // et on élimine les espaces par un seul "+".
708                $elements = explode(',', $lieu_normalise);
709                $lieu_normalise = trim($elements[0]) . (!empty($elements[1]) ? ',' . trim($elements[1]) : '');
710                $lieu_normalise = preg_replace('#\s{1,}#', '+', $lieu_normalise);
711        }
712
713        return $lieu_normalise;
714}
715
716
717/**
718 * @param $configuration_service
719 *
720 * @return mixed
721 */
722function langue_determiner($configuration_service) {
723
724        if ($configuration_service['condition'] == $configuration_service['alias']) {
725                // Rainette est configurée pour utiliser le résumé renvoyé par le service pour l'affichage :
726                // il est donc nécessaire de demander ce résumé dans la bonne langue si elle existe.
727
728                // On détermine la "bonne langue" : on choisit soit celle de la page en cours
729                // soit celle en cours pour l'affichage.
730                $langue_spip = $GLOBALS['lang'] ? $GLOBALS['lang'] : $GLOBALS['spip_lang'];
731
732                // On cherche si le service fournit la langue utilisée par le site.
733                // -- Pour cela on utilise la configuration du service qui fournit un tableau des langues disponibles
734                //    sous le format [code de langue du service] = code de langue spip.
735                $langue_service = array_search($langue_spip, $configuration_service['langues']['disponibles']);
736                if ($langue_service === false) {
737                        // La langue utilisée par SPIP n'est pas supportée par le service.
738                        // -- On cherche si il existe une langue SPIP utilisable meilleure que la langue par défaut du service.
739                        // -- Pour ce faire on a défini pour chaque code de langue spip, un ou deux codes de langue SPIP à utiliser
740                        //    en cas d'absence de la langue concernée dans un ordre de priorité (index 0, puis index 1).
741                        $langue_service = $configuration_service['langues']['defaut'];
742                        if ($GLOBALS['rainette_config']['langues_alternatives'][$langue_spip]) {
743                                foreach ($GLOBALS['rainette_config']['langues_alternatives'][$langue_spip] as $_langue_alternative) {
744                                        $langue_service = array_search($_langue_alternative, $configuration_service['langues']['disponibles']);
745                                        if ($langue_service !== false) {
746                                                break;
747                                        }
748                                }
749                        }
750                }
751        } else {
752                // Rainette est configurée pour afficher le résumé Weather.com après transcodage. La langue de la requête
753                // importe peu, on choisit donc la langue configurée par défaut.
754                $langue_service = $configuration_service['langues']['defaut'];
755        }
756
757        return $langue_service;
758}
759
760
761/**
762 * @param $service
763 * @param $configuration_defaut
764 *
765 * @return mixed
766 */
767function parametrage_normaliser($service, $configuration_defaut) {
768
769        // On récupère la configuration utilisateur
770        include_spip('inc/config');
771        $configuration_utilisateur = lire_config("rainette/${service}", array());
772
773        // On complète la configuration avec des valeurs par défaut si nécessaire.
774        foreach ($configuration_defaut as $_cle => $_valeur) {
775                if (!isset($configuration_utilisateur[$_cle])) {
776                        $configuration_utilisateur[$_cle] = $_valeur;
777                }
778        }
779
780        return $configuration_utilisateur;
781}
782
783
784/**
785 * @param $mode
786 * @param $configuration
787 *
788 * @return array
789 */
790function normaliser_configuration_donnees($mode, $configuration) {
791
792        $configuration_normalisee = array();
793
794        foreach ($GLOBALS['rainette_config'][$mode] as $_donnee => $_configuration) {
795                if ($_configuration['origine'] == 'service') {
796                        $configuration_normalisee[$_donnee] = !empty($configuration[$_donnee]['cle']) ? true : false;
797                }
798        }
799
800        return $configuration_normalisee;
801}
Note: See TracBrowser for help on using the repository browser.