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

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

Evolution majeure : ajout d'une gestion de thèmes pour chaque service.
Il est désormais possible d'afficher soit l'icone distant fourni dans l'API, soit un icone local d'un thème compatible avec le service, soit l'icone d'un service de weather.com.
Ceci est particulièrement intéressant car il existe moulte thèmes d'icones pour weather.com.
Pour l'instant, un seul thème est proposé par service à l'exception de owm.
Suivra bientôt un nouveau plugin associé à Rainette qui proposera nombre de thèmes et permettra de les visualiser afin de choisir celui à utiliser.
Refactoring et factorisation des fonctions associées.

  • Property svn:eol-style set to native
File size: 38.0 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        // Les services de Rainette sauf weather.com peuvent renvoyer la traduction du résumé dans plusieurs langues.
725        // il est donc nécessaire de demander ce résumé dans la bonne langue si elle existe.
726
727        // On détermine la "bonne langue" : on choisit soit celle de la page en cours
728        // soit celle en cours pour l'affichage.
729        $langue_spip = $GLOBALS['lang'] ? $GLOBALS['lang'] : $GLOBALS['spip_lang'];
730
731        // On cherche d'abord si le service fournit la langue utilisée par le site.
732        // -- Pour cela on utilise la configuration du service qui fournit un tableau des langues disponibles
733        //    sous le format [code de langue du service] = code de langue spip.
734        $langue_service = array_search($langue_spip, $configuration_service['langues']['disponibles']);
735
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
752        // Aucune langue ne correspond véritablement, on choisit donc la langue configurée par défaut.
753        if ($langue_service === false) {
754                $langue_service = $configuration_service['langues']['defaut'];
755        }
756
757        return $langue_service;
758}
759
760/**
761 * @param $mode
762 * @param $configuration
763 *
764 * @return array
765 */
766function configuration_donnees_normaliser($mode, $configuration) {
767
768        $configuration_normalisee = array();
769
770        foreach ($GLOBALS['rainette_config'][$mode] as $_donnee => $_configuration) {
771                if ($_configuration['origine'] == 'service') {
772                        $configuration_normalisee[$_donnee] = !empty($configuration[$_donnee]['cle']) ? true : false;
773                }
774        }
775
776        return $configuration_normalisee;
777}
778
779/**
780 * @param $service
781 * @param $configuration_defaut
782 *
783 * @return mixed
784 */
785function parametrage_normaliser($service, $configuration_defaut) {
786
787        // On récupère la configuration utilisateur
788        include_spip('inc/config');
789        $configuration_utilisateur = lire_config("rainette/${service}", array());
790
791        // On complète la configuration avec des valeurs par défaut si nécessaire.
792        foreach ($configuration_defaut as $_cle => $_valeur) {
793                if (!isset($configuration_utilisateur[$_cle])) {
794                        $configuration_utilisateur[$_cle] = $_valeur;
795                }
796        }
797
798        return $configuration_utilisateur;
799}
800
801/**
802 * @param int|string $code_meteo
803 * @param string     $theme
804 * @param array      $transcodage
805 * @param int        $periode
806 *
807 * @return string
808 */
809function icone_weather_normaliser($code_meteo, $theme, $transcodage = array(), $periode = 0) {
810
811        // Si le transcodage échoue ou que le code weather est erroné on renvoie toujours N/A.
812        $icone = 'na';
813
814        // Transcodage en code weather.com.
815        $code = is_string($code_meteo) ? strtolower($code_meteo) : intval($code_meteo);
816        if ($transcodage) {
817                // Service différent de weather.com
818                if (array_key_exists($code, $transcodage) and isset($transcodage[$code][$periode])) {
819                        $icone = strval($transcodage[$code][$periode]);
820                }
821        } else {
822                // Service weather.com
823                if (($code >= 0) and ($code < 48)) {
824                        $icone = strval($code);
825                }
826        }
827
828        // Construction du chemin complet de l'icone.
829        $chemin = icone_local_normaliser("${icone}.png",'weather', $theme);
830
831        return $chemin;
832}
833
834/**
835 * @param string $icone
836 * @param string $service
837 * @param string $theme
838 * @param string $periode
839 *
840 * @return string
841 */
842function icone_local_normaliser($icone, $service, $theme = '', $periode = '') {
843
844        // On initialise le dossier de l'icone pour le service demandé.
845        $chemin = "themes/${service}";
846        // Si on demande un thème il faut créer le sous-dossier.
847        if ($theme) {
848                $chemin .= "/${theme}";
849        }
850        // Si le service gère des icones suivant le jour ou la nuit il faut ajouter le sous-dossier concerné.
851        if ($periode) {
852                $chemin .= "/${periode}";
853        }
854        // On finalise le chemin complet avec le nom de l'icone sauf si on ne veut que le dossier.
855        if ($icone) {
856                $chemin .= "/${icone}";
857        }
858
859        return $chemin;
860}
Note: See TracBrowser for help on using the repository browser.