Compare commits

..

34 Commits

Author SHA1 Message Date
Eric Lupinacci 9a0b74b143 Utilisation de comparaison stricte 5 hours ago
Eric Lupinacci 592a165f66 Corriger les conversions du système métrique en système impérial que cela est nécessaire. 5 hours ago
Eric Lupinacci dbb6b96335 Ajouter la conversion en impérial des données du service Météo Concept 4 days ago
Eric Lupinacci 07c4745edb Corriger une erreur de config du service weatherbit 4 days ago
Eric Lupinacci 1549072c01 Passage de ucfirst à spip_ucfirst. 4 days ago
Eric Lupinacci f48eb0a322 Ajouter des attributs rel pour éviter l'échappement des liens par safehtml. 6 days ago
Eric Lupinacci ca05fd25e9 Un icone vide pour les conditions de Meteo Concept. 6 days ago
Eric Lupinacci 1567b6c3c0 Renommer l'id du service Meteo Concept : maintenant c'est meteoconcept 6 days ago
Eric Lupinacci 258ae03aed Un lot de corrections et d'améliorations nécessaires pour gérer le typage strict 6 days ago
Eric Lupinacci b5f92d25f6 Corriger et améliorer certaines fonctions suite au typage des arguments : c'est vraiment utile ! 1 week ago
Eric Lupinacci 556978d0d1 Revue du code, PHPDoc et typage des arguments. 1 week ago
Eric Lupinacci 90fbb69d4d Eviter une notice dans le trim() avec une valeur null (déprécié en 8.1). 5 months ago
Eric Lupinacci dc378746fc Up de z pour fournir un zip en 4.1 10 months ago
Eric Lupinacci 617fff7bcb Fonctionnement spip 4.1 vérifié et mise à jour des necessite. 10 months ago
Eric Lupinacci 489579ce3f Rangement des paramètres de la noisette prévisions 10 months ago
Eric Lupinacci 20db27a25e Mise en place des conditions temps réel pour Meteo Concept. 1 year ago
Eric Lupinacci 8f10a91122 Mise au point de la fonction d'upgrade de façon plus logique et traçable 1 year ago
Eric Lupinacci 6d4667b15a Modifier le schéma de façon à recharger la configuration des services voire la configuration de Rainette. 1 year ago
Eric Lupinacci fca7a98742 Amélioration du transcodage 1 year ago
Eric Lupinacci 2d7fabf9d4 Mise au point du transcodage weather 1 year ago
Eric Lupinacci 85a1bd1252 On remet les codes de weather pour l'instant 1 year ago
Eric Lupinacci 0e2ab33e0d Simplification de l'affichage du résumé et suppression de tous les anciens items de langue liés à Weather. 1 year ago
Eric Lupinacci d5b403a8c9 Correction d'items de langue. 1 year ago
Eric Lupinacci 6f41af79d5 Premier jet de l'ajout du service français Meteo-Concept (meteoc) qui est limité à la France, Belgique, Luxembourg et Andorre. 1 year ago
Eric Lupinacci abff3a9b51 Evitons les chaine immédiate quand on a une autre solution 1 year ago
Eric Lupinacci 579b1dc7c9 Pétouilles de PSR et de la démo 1 year ago
Eric Lupinacci 9a39a30ca3 Effacer la meta Rainette lors de la désinstallation. 1 year ago
Eric Lupinacci 3b30bb0de7 Les nouveaux icones pour les noisettes météo 2 years ago
Eric Lupinacci 478f7e6e94 Plus besoin d'une limite basse pour PHP, en spip 4 on est toujours bon 2 years ago
Eric Lupinacci 1a4842751a Une branche v4 (master) pour une Rainette spip 4 avec une super logo (merci erational) 2 years ago
erational 9db47acf43 [ui] icone SVG, oups il manquait le width/height 2 years ago
erational 6c52b09fde [ui] icone SVG 2 years ago
RealET cd044c790b La config de rainette est gérable elle aussi par ieconfig (https://contrib.spip.net/Importeur-Exporteur-de-configurations) 2 years ago
Maïeul e4be7ec2fd Saisies : datas->data 2 years ago
  1. 5
      action/recharger_configuration.php
  2. 2
      demo/demo.css
  3. 4
      demo/rainette.html
  4. 22
      ezcache/rainette.php
  5. 45
      formulaires/configurer_rainette_service.html
  6. 35
      formulaires/configurer_rainette_service.php
  7. 120
      inc/meteo_charger.php
  8. 108
      inc/rainette_convertir.php
  9. 125
      inc/rainette_debusquer.php
  10. 318
      inc/rainette_normaliser.php
  11. 46
      inc/rainette_requeter.php
  12. 97
      lang/meteoconcept_fr.php
  13. 459
      lang/rainette_fr.php
  14. 16
      modeles/conditions_tempsreel.html
  15. 6
      modeles/infos_ville.html
  16. 14
      modeles/previsions_12h.html
  17. 16
      modeles/previsions_24h.html
  18. 4
      modeles/previsions_24h_table.html
  19. 2
      noisettes/meteo_conditions.html
  20. 4
      noisettes/meteo_conditions.yaml
  21. 2
      noisettes/meteo_previsions.html
  22. 88
      noisettes/meteo_previsions.yaml
  23. 18
      paquet.xml
  24. 8
      prive/squelettes/inclure/inc-rainette_raccourcis_admin.html
  25. BIN
      prive/themes/spip/images/rainette-16.png
  26. BIN
      prive/themes/spip/images/rainette-24.png
  27. 8
      prive/themes/spip/images/rainette-xx.svg
  28. 9
      rainette.svg
  29. 101
      rainette_administrations.php
  30. 387
      rainette_fonctions.php
  31. 28
      rainette_ieconfig_metas.php
  32. BIN
      rainette_logo-64.png
  33. 24
      rainette_pipelines.php
  34. 142
      services/accuweather.php
  35. 4
      services/accuweather.yaml
  36. 260
      services/meteoconcept.php
  37. 312
      services/meteoconcept.yaml
  38. 180
      services/owm.php
  39. 282
      services/templates/service.php.template
  40. 0
      services/templates/service.yaml.template
  41. 139
      services/weatherapi.php
  42. 180
      services/weatherbit.php
  43. 2
      services/weatherbit.yaml
  44. 138
      services/wwo.php
  45. 5
      themes/icone-vide.svg

5
action/recharger_configuration.php

@ -15,8 +15,7 @@ if (!defined('_ECRIRE_INC_VERSION')) {
*
* @return void
*/
function action_recharger_configuration_dist() {
function action_recharger_configuration_dist() : void {
// Sécurisation.
// -- Aucun argument attendu.
@ -28,7 +27,7 @@ function action_recharger_configuration_dist() {
exit();
}
// Rechargement des dashboards.
// Rechargement de touttes les configurations statiques de Rainette et des services.
include_spip('rainette_administrations');
rainette_configurer();
}

2
demo/demo.css

@ -19,6 +19,7 @@ div#footer{clear:both;width:100%}
/* Personnalisation pour la demo */
a.spip-admin-boutons {display: inline;}
div#header h1{color:#798f74}
div#header h1 img{vertical-align: middle;}
div#content{padding-left:2em;padding-bottom:4em;}
div#extra{background:#fff;}
div#footer{padding:2em;}
@ -48,4 +49,3 @@ div.notice{padding:1em;color: #514721;border:2px solid #ffd324;background-color:
.menu-items .item a {text-decoration:none;padding:0 0 0 1em;}
.menu-items .item a:hover {text-decoration:underline;}
.menu-items .item .on {padding:0 0 0 1em;}

4
demo/rainette.html

@ -17,7 +17,7 @@
<div id="container">
<div id="header">
<h1>
<img height="48" width="48" title="Plugin Rainette" alt="Plugin Rainette" src="#CHEMIN{rainette_logo-64.png}"/>
<img height="48" width="48" title="Plugin Rainette" alt="Plugin Rainette" src="#CHEMIN_IMAGE{rainette-64.png}"/>
PLUGIN RAINETTE[&nbsp;((#PLUGIN{RAINETTE, version}))]
</h1>
</div>
@ -153,7 +153,7 @@
[<li class="item">
(#SELF|parametre_url{mode, #VALEUR}
|lien_ou_expose{
[(#VALEUR|ucfirst)],
[(#VALEUR|spip_ucfirst)],
[(#GET{mode}|=={#VALEUR})]})
</li>]
</BOUCLE_modes>

22
ezcache/rainette.php vendored

@ -14,22 +14,21 @@ if (!defined('_ECRIRE_INC_VERSION')) {
*
* @return array Tableau de la configuration des types de cache du plugin.
*/
function rainette_cache_configurer($plugin) {
function rainette_cache_configurer(string $plugin) : array {
// Initialisation du tableau de configuration avec les valeurs par défaut du plugin Cache.
$configuration = array(
'meteo' => array(
$configuration = [
'meteo' => [
'racine' => '_DIR_VAR',
'sous_dossier' => true,
'nom_obligatoire' => array('lieu', 'donnees', 'langage'),
'nom_facultatif' => array('unite'),
'nom_obligatoire' => ['lieu', 'donnees', 'langage'],
'nom_facultatif' => ['unite'],
'extension' => '.txt',
'securisation' => false,
'serialisation' => true,
'separateur' => '_',
'conservation' => 3600 * 24
),
);
],
];
return $configuration;
}
@ -51,8 +50,7 @@ function rainette_cache_configurer($plugin) {
*
* @return array Tableau des caches de type meteo.
*/
function rainette_meteo_cache_formulaire_charger($plugin, $valeurs, $options, $configuration) {
function rainette_meteo_cache_formulaire_charger(string $plugin, array $valeurs, array $options, array $configuration) : array {
// On constitue la liste des services requis par l'appel
include_spip('rainette_fonctions');
$services = rainette_lister_services('tableau', false);
@ -61,7 +59,7 @@ function rainette_meteo_cache_formulaire_charger($plugin, $valeurs, $options, $c
include_spip('inc/ezcache_cache');
foreach ($services as $_service => $_infos) {
// On récupère les caches du service
$filtres = array('sous_dossier' => $_service);
$filtres = ['sous_dossier' => $_service];
$caches = cache_repertorier('rainette', 'meteo', $filtres);
// Si il existe des caches pour le service on stocke les informations recueillies
@ -69,7 +67,7 @@ function rainette_meteo_cache_formulaire_charger($plugin, $valeurs, $options, $c
$complement_titre = $_infos['actif']
? _T('rainette:service_actif')
: _T('rainette:service_inactif');
$valeurs['_caches']['meteo'][$_service]['titre'] = "{$_infos['nom']} (${complement_titre})";
$valeurs['_caches']['meteo'][$_service]['titre'] = "{$_infos['nom']} ({$complement_titre})";
$valeurs['_caches']['meteo'][$_service]['liste'] = $caches;
}
}

45
formulaires/configurer_rainette_service.html

@ -9,13 +9,13 @@
<fieldset>
<legend><:rainette:legende_configurer_inscription:></legend>
[(#REM) <!-- Configuration de la clé d'inscription si requise --> ]
[(#ENV{service}|=={weather}|oui)
[(#ENV{service}|=={openmeteo}|oui)
<p><:rainette:explication_configurer_cle_aucune:></p>
]
[(#ENV{service}|=={weather}|non)
[(#ENV{service}|=={openmeteo}|non)
<div class="editer-groupe">
#SET{type_cle, obligatoire}
[(#SET{url, [<a class="spip_out"[ href="(#ENV{_configuration/enregistrement/lien})"] target="_blank">(#ENV{_configuration/enregistrement/titre})</a>]})]
[(#SET{url, [<a class="spip_out" rel="noreferrer noopener"[ href="(#ENV{_configuration/enregistrement/lien})"] target="_blank">(#ENV{_configuration/enregistrement/titre})</a>]})]
[(#SET{explication, #VAL{rainette:explication_configurer_cle_}
|concat{#GET{type_cle}}
|_T{#ARRAY{url,#GET{url}}}})]
@ -34,34 +34,27 @@
<legend><:rainette:legende_configurer_affichage:></legend>
<div class="editer-groupe">
[(#REM) <!-- Configuration du système d'unité à utiliser pour les données météo --> ]
#SET{disable_unite, ''}
[(#ENV{service}|=={meteoconcept}|oui)#SET{disable_unite, s}]
[(#SAISIE{radio, unite,
datas=#ARRAY{m, <:rainette:label_unite_metrique:>, s, <:rainette:label_unite_standard:>},
data=#ARRAY{m, <:rainette:label_unite_metrique:>, s, <:rainette:label_unite_standard:>},
disable_choix=#GET{disable_unite},
explication=<:rainette:explication_configurer_unite:>,
label=<:rainette:label_unite:>,
})]
[(#ENV{service}|=={weather}|non)
[(#REM) <!-- Configuration du système d'icônes à utiliser (sauf pour weather) --> ]
[(#SET{data,
[(#ARRAY{#ENV{service}, <:rainette:label_icone_natif:>,
[(#ENV{service})_local], <:rainette:label_icone_local:>,
weather, <:rainette:label_icone_weather:>})]})]
[(#SET{disable,
[(#ARRAY{#ENV{service}, [(#ENV{_themes/icone_api}|non)],
[(#ENV{service})_local], [(#ENV{_themes/locaux}|non)],
weather, [(#ENV{_themes/weather}|non)]})]})]
[(#SAISIE{radio, condition,
datas=#GET{data},
disable=#GET{disable},
explication=<:rainette:explication_configurer_icone:>,
label=<:rainette:label_icone:>,
})]
]
[(#REM) <!-- Configuration du système d'icônes à utiliser (sauf pour meteoconcept qui est limité à la France) --> ]
[(#SAISIE{radio, condition,
data=#ENV{_themes/types},
disable_choix=#ENV{_themes/disabled},
explication=<:rainette:explication_configurer_icone:>,
label=<:rainette:label_icone:>,
})]
[(#REM) <!-- Configuration du thème d'icônes distant à utiliser pour le service --> ]
[(#ENV{_themes/distants}|oui)
[(#SAISIE{radio, theme,
datas=#ENV{_themes/distants},
data=#ENV{_themes/distants},
explication=<:rainette:explication_configurer_theme:>,
label=<:rainette:label_theme:>,
})]
@ -70,7 +63,7 @@
[(#REM) <!-- Configuration du thème d'icônes local à utiliser pour le service --> ]
[(#ENV{_themes/locaux}|oui)
[(#SAISIE{radio, theme_local,
datas=#ENV{_themes/locaux},
data=#ENV{_themes/locaux},
explication=<:rainette:explication_configurer_theme:>,
label=<:rainette:label_theme:>,
})]
@ -79,7 +72,7 @@
[(#REM) <!-- Configuration du thème d'icônes local du service weather à utiliser pour le service --> ]
[(#ENV{_themes/weather}|oui)
[(#SAISIE{radio, theme_weather,
datas=#ENV{_themes/weather},
data=#ENV{_themes/weather},
explication=<:rainette:explication_configurer_theme:>,
label=<:rainette:label_theme:>,
})]
@ -89,7 +82,7 @@
<fieldset>
<legend><:rainette:legende_configurer_utilisation:></legend>
[(#SET{url, [<a class="spip_out"[ href="(#ENV{_configuration/offres/lien})"] target="_blank">(#ENV{_configuration/offres/titre})</a>]})]
[(#SET{url, [<a class="spip_out" rel="noreferrer noopener"[ href="(#ENV{_configuration/offres/lien})"] target="_blank">(#ENV{_configuration/offres/titre})</a>]})]
[(#SET{gratuite, oui})]
[(#ENV{_configuration/offres/gratuite}|non)#SET{gratuite, non}]
[<p>(#VAL{rainette:explication_utilisation_gratuite_}|concat{#GET{gratuite}}|_T{#ARRAY{url, #GET{url}}})</p>]
@ -112,7 +105,7 @@
<fieldset>
<legend><:rainette:legende_configurer_credit:></legend>
[(#SET{url, [<a class="spip_out"[ href="(#ENV{_configuration/termes/lien})"] target="_blank">(#ENV{_configuration/termes/titre})</a>]})]
[(#SET{url, [<a class="spip_out" rel="noreferrer noopener"[ href="(#ENV{_configuration/termes/lien})"] target="_blank">(#ENV{_configuration/termes/titre})</a>]})]
[<p>
(#VAL{rainette:explication_credit_}|concat{#ENV{service}}|_T)
<br /><:rainette:explication_credit_page{url=#GET{url}}:>

35
formulaires/configurer_rainette_service.php

@ -14,8 +14,7 @@ if (!defined('_ECRIRE_INC_VERSION')) {
*
* @return array Tableau des données à charger par le formulaire.
*/
function formulaires_configurer_rainette_service_charger($service) {
function formulaires_configurer_rainette_service_charger(string $service) : array {
// On récupère le service par défaut si besoin
if (!$service) {
include_spip('rainette_fonctions');
@ -24,7 +23,7 @@ function formulaires_configurer_rainette_service_charger($service) {
// Récupération de la configuration générale du service.
include_spip('inc/config');
$configuration = lire_config("rainette_${service}/service", array());
$configuration = lire_config("rainette_{$service}/service", []);
// Normalisation de la configuration utilisateur du service afin d'éviter de gérer
// au sein du formulaire des valeurs par défaut.
@ -39,31 +38,41 @@ function formulaires_configurer_rainette_service_charger($service) {
$valeurs['_configuration']['offres'] = $configuration['offres'];
// Ajout des informations d'utilisation du service
$execution = lire_config("rainette_execution/${service}", array());
$valeurs['_utilisation']['dernier_appel'] = isset($execution['dernier_appel'])
? $execution['dernier_appel']
: '';
$execution = lire_config("rainette_execution/{$service}", []);
$valeurs['_utilisation']['dernier_appel'] = $execution['dernier_appel'] ?? '';
if (isset($execution['compteurs'])) {
$valeurs['_utilisation']['compteurs'] = $execution['compteurs'];
} else {
// On initialise les limites à zéro
$valeurs['_utilisation']['compteurs'] = array();
$valeurs['_utilisation']['compteurs'] = [];
foreach ($configuration['offres']['limites'] as $_periode => $_limite) {
$valeurs['_utilisation']['compteurs'][$_periode] = 0;
}
}
// Gestion des thèmes locaux et distants.
$valeurs['_themes']['icone_api'] = in_array($service, array('weather', 'darksky')) ? false : true;
// -- liste des types de thèmes
$valeurs['_themes']['types'] = [
$service => _T('rainette:label_icone_natif'),
"{$service}_local" => _T('rainette:label_icone_local'),
'weather' => _T('rainette:label_icone_weather')
];
// -- Présence de chaque type de thème pour le service concerné
$valeurs['_themes']['icone_api'] = !in_array($service, ['accuweather', 'meteoconcept']);
$valeurs['_themes']['distants'] = rainette_lister_themes($service, 'api');
$valeurs['_themes']['locaux'] = rainette_lister_themes($service, 'local');
$valeurs['_themes']['locaux'] = rainette_lister_themes($service);
$valeurs['_themes']['weather'] = $service != 'weather'
? rainette_lister_themes('weather', 'local')
: array();
? rainette_lister_themes('weather')
: [];
// -- Construction du disable pour chaque choix de type de thème
$themes_disabled = $valeurs['_themes']['icone_api'] ? '' : $service;
$themes_disabled .= $valeurs['_themes']['locaux'] ? '' : ($themes_disabled ? ',' : '') . "{$service}_local";
$themes_disabled .= $valeurs['_themes']['weather'] ? '' : ($themes_disabled ? ',' : '') . 'weather';
$valeurs['_themes']['disabled'] = $themes_disabled;
// On positionne le meta casier car la fonction de recensement automatique n'est plus appelée ni ne pourrait
// fonctionner avec un hidden dont la valeur est dynamique (utilisation d'une variable d'environnement #ENV).
$valeurs['_meta_casier'] = "rainette/${service}";
$valeurs['_meta_casier'] = "rainette/{$service}";
return $valeurs;
}

120
inc/meteo_charger.php

@ -17,35 +17,46 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* et stocké les données collectées et transcodées dans un tableau standardisé. L'appelant doit s'assurer que la
* périodicité est compatible avec le service; cette fonction ne retourne donc que des erreurs de chargement.
*
* @uses cache_nommer()
* @uses rainette_service_defaut()
* @uses service_est_indisponible()
* @uses erreur_normaliser_extras()
* @uses configuration_service_lire()
* @uses parametrage_normaliser()
* @uses cache_normaliser()
* @uses cache_est_valide()
* @uses requete_autorisee()
* @uses meteo_normaliser()
* @uses indice2risque_uv()
* @uses cache_ecrire()
* @uses cache_lire()
*
* @param string $lieu Le lieu concerné par la méteo exprimé selon les critères requis par le service.
* @param string $mode Le type de données météorologiques demandé :
* - `conditions`, la valeur par défaut
* - `previsions`
* - `infos`
* @param int $periodicite La périodicité horaire des prévisions :
* - `24`, les prévisions de la journée
* - `12`, les prévisions du jour et de la nuit
* - `6`, les prévisions de la journée par période de 6h
* - `3`, les prévisions de la journée par période de 3h
* - `1`, les prévisions de la journée pour chaque heure
* - `0`, pour les modes `conditions` et `infos`
* @param string $service Le nom abrégé du service :
* - `owm` pour OpenWeather, la valeur par défaut car elle propose un plan gratuit
* - `weatherbit` pour Weatherbit.io
* - `weatheapi` pour WeatherAPI
* - `accuweather` pour AccuWeather
* - `wwo` pour World Weather Online
* @param string $lieu Le lieu concerné par la méteo exprimé selon les critères requis par le service.
* @param null|string $mode Le type de données météorologiques demandé :
* - `conditions`, la valeur par défaut
* - `previsions`
* - `infos`
* @param null|int $periodicite La périodicité horaire des prévisions :
* - `24`, les prévisions de la journée
* - `12`, les prévisions du jour et de la nuit
* - `6`, les prévisions de la journée par période de 6h
* - `3`, les prévisions de la journée par période de 3h
* - `1`, les prévisions de la journée pour chaque heure
* - `0`, pour les modes `conditions` et `infos`
* @param null|string $service Le nom abrégé du service :
* - `owm` pour OpenWeather, la valeur par défaut car elle propose un plan gratuit
* - `weatherbit` pour Weatherbit.io
* - `weatheapi` pour WeatherAPI
* - `accuweather` pour AccuWeather
* - `wwo` pour World Weather Online
* - `meteoconcept` pour Meteo-Concept
*
* @throws Exception
*
* @return array Le contenu du fichier cache contenant les données à jour demandées.
*/
function inc_meteo_charger_dist($lieu, $mode = 'conditions', $periodicite = 0, $service = '') {
function inc_meteo_charger_dist(string $lieu, ?string $mode = 'conditions', ?int $periodicite = 0, ?string $service = '') : array {
// Initialisation du tableau de sortie.
$tableau = array();
$tableau = [];
// Traitement des cas ou les arguments sont vides (ce qui est différent de non passés à l'appel)
// On considère à ce stade que la cohérence entre le mode, la périodicité et le service (qui selon ne supporte
@ -61,29 +72,29 @@ function inc_meteo_charger_dist($lieu, $mode = 'conditions', $periodicite = 0, $
// On vérifie d'abord si le service est connu et actif car sinon il est inutile de continuer.
// -- on initialise le bloc d'erreur
$erreur = array(
$erreur = [
'type' => '',
'service' => array(
'service' => [
'code' => '',
'message' => ''
)
);
]
];
// -- on vérifie le service qui renvoie un type d'erreur ou vide sinon.
include_spip('inc/rainette_normaliser');
if ($erreur['type'] = service_est_indisponible($service)) {
// Service nok :
// -----------
// On construit le tableau directement sans passer par un cache.
$tableau = array(
'donnees' => array(),
$tableau = [
'donnees' => [],
'extras' => erreur_normaliser_extras($erreur, $lieu, $mode, $periodicite, $service)
);
];
} else {
// Service ok :
// ----------
// En fonction du service, on inclut le fichier d'API.
// Le principe est que chaque service propose la même liste de fonctions d'interface dans un fichier unique.
include_spip("services/${service}");
include_spip("services/{$service}");
// Acquérir la configuration statique du service (periode, format, données...)
$configuration = configuration_service_lire($service, $mode);
@ -99,7 +110,10 @@ function inc_meteo_charger_dist($lieu, $mode = 'conditions', $periodicite = 0, $
// Si on a demandé le mode 'previsions' sans préciser la periodicité horaire des données, il faut prendre l'intervalle
// par défaut configuré pour le service.
if (($mode == 'previsions') and !$periodicite) {
if (
($mode === 'previsions')
and !$periodicite
) {
$periodicite = $configuration['previsions']['periodicite_defaut'];
}
@ -112,7 +126,7 @@ function inc_meteo_charger_dist($lieu, $mode = 'conditions', $periodicite = 0, $
include_spip('inc/ezcache_cache');
if (!$fichier_cache = cache_est_valide('rainette', 'meteo', $cache)) {
// Construire l'url de la requête
$urler = "${service}_service2url";
$urler = "{$service}_service2url";
$url = $urler($lieu, $mode, $periodicite, $configuration);
// Acquérir le flux XML ou JSON dans un tableau si les limites du service ne sont pas atteintes
@ -140,7 +154,7 @@ function inc_meteo_charger_dist($lieu, $mode = 'conditions', $periodicite = 0, $
// On normalise le flux en utilisant le mode d'erreur pour vérifier si on obtient bien une erreur.
$erreur_service = meteo_normaliser($configuration_erreur, 'erreurs', $flux_erreur, -1);
$verifier = "${service}_erreur_verifier";
$verifier = "{$service}_erreur_verifier";
if ($verifier($erreur_service)) {
// Une erreur est renvoyée par le service, on formate l'erreur correctement.
$erreur['type'] = 'reponse_service';
@ -161,8 +175,11 @@ function inc_meteo_charger_dist($lieu, $mode = 'conditions', $periodicite = 0, $
// En mode infos ou conditions, on a directement accès aux données météorologiques (jour[]).
// Pour réaliser un traitement standard, on transforme donc le jour[] en un tableau d'un seul élément ([0] => jour[])
// qui pourra être traité comme celui des prévisions.
if (($mode == 'conditions') or ($mode == 'infos')) {
$flux = array($flux);
if (
($mode === 'conditions')
or ($mode === 'infos')
) {
$flux = [$flux];
}
// Convertir le flux en tableau standard pour la mise en cache. Ce traitement se déroule en
@ -175,7 +192,7 @@ function inc_meteo_charger_dist($lieu, $mode = 'conditions', $periodicite = 0, $
// mais en index alpha comme 'day' ou 'night'.
// Pour ces services, il est nécessaire de réorganiser le flux jour pour que les flux heure
// soient adressables et numériques.
$arranger = "${service}_flux2${mode}";
$arranger = "{$service}_flux2{$mode}";
if (function_exists($arranger)) {
$_flux_jour = $arranger($_flux_jour, $periodicite, $configuration);
}
@ -188,7 +205,7 @@ function inc_meteo_charger_dist($lieu, $mode = 'conditions', $periodicite = 0, $
// Pour avoir un traitement identique pour les deux types de données on considère que l'index horaire
// des données jour est égal à -1.
// On crée donc le tableau des index correspondant au mode choisi et on boucle dessus.
$periodes_horaires = array(-1);
$periodes_horaires = [-1];
if ($periodicite) {
for ($i = 0; $i < (24 / $periodicite); $i++) {
$periodes_horaires[] = $i;
@ -198,7 +215,10 @@ function inc_meteo_charger_dist($lieu, $mode = 'conditions', $periodicite = 0, $
// On détermine le flux heure en fonction du service. Ce flux heure coincide avec le flux jour dans
// la majeure partie des cas
$flux_heure = $_flux_jour;
if ((count($periodes_horaires) > 1) and !empty($configuration['cle_heure'])) {
if (
(count($periodes_horaires) > 1)
and !empty($configuration['cle_heure'])
) {
$flux_heure = table_valeur($_flux_jour, implode('/', $configuration['cle_heure']), null);
}
@ -208,7 +228,7 @@ function inc_meteo_charger_dist($lieu, $mode = 'conditions', $periodicite = 0, $
// fournies par le service.
// Suivant la période il faut prendre le flux jour ou le flux heure. On calcule donc le flux heure
// quand c'est nécessaire.
$flux_a_normaliser = ($_periode == -1)
$flux_a_normaliser = ($_periode === -1)
? $_flux_jour
: ($configuration['structure_heure'] ? $flux_heure[$_periode] : $flux_heure);
$donnees = meteo_normaliser($configuration, $mode, $flux_a_normaliser, $_periode);
@ -216,9 +236,9 @@ function inc_meteo_charger_dist($lieu, $mode = 'conditions', $periodicite = 0, $
if ($donnees) {
// 2- Compléments spécifiques au service et au mode.
// Si ces compléments sont inutiles, la fonction n'existe pas
$completer = "${service}_complement2${mode}";
$completer = "{$service}_complement2{$mode}";
if (function_exists($completer)) {
$donnees = $mode == 'previsions'
$donnees = $mode === 'previsions'
? $completer($donnees, $configuration, $_periode)
: $completer($donnees, $configuration);
}
@ -234,7 +254,7 @@ function inc_meteo_charger_dist($lieu, $mode = 'conditions', $periodicite = 0, $
}
// Ajout du bloc à l'index en cours
if ($_periode == -1) {
if ($_periode === -1) {
$tableau[$_index_jour] = $donnees;
} else {
$tableau[$_index_jour]['heure'][$_periode] = $donnees;
@ -256,17 +276,17 @@ function inc_meteo_charger_dist($lieu, $mode = 'conditions', $periodicite = 0, $
// l'index 'donnees'. Il faut donc supprimer l'index 0 provenant du traitement commun avec
// les prévisions.
// Pour les prévisions l'index 0 à n désigne le jour, il faut donc le conserver
$tableau = array(
$tableau = [
'donnees' => ($mode != 'previsions' ? array_shift($tableau) : $tableau),
'extras' => $extras
);
];
} else {
// Traitement des erreurs de flux. On positionne toujours les bloc extra contenant l'erreur,
// le bloc des données qui est mis à tableau vide dans ce cas à l'index 1.
$tableau = array(
'donnees' => array(),
$tableau = [
'donnees' => [],
'extras' => $extras
);
];
}
// Pipeline de fin de chargement des données météo. Peut-être utilisé :
@ -274,10 +294,10 @@ function inc_meteo_charger_dist($lieu, $mode = 'conditions', $periodicite = 0, $
// -- pour ajouter ou modifier des données au tableau (la modification n'est pas conseillée cependant)
$tableau = pipeline(
'post_chargement_meteo',
array(
'args' => array('lieu' => $lieu, 'mode' => $mode, 'service' => $service),
[
'args' => ['lieu' => $lieu, 'mode' => $mode, 'service' => $service],
'data' => $tableau
)
]
);
// Mise à jour du cache

108
inc/rainette_convertir.php

@ -1,16 +1,19 @@
<?php
/**
* Ce fichier contient les fonctions de conversion entre unités, en particulier, les conversions du système métrique
* vers le système impérial US.
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* @param int $angle Angle du vent exprimé en degrés.
* Lister les 16 directions abrégées en anglais ainsi que la direction variable.
*
* @return string Direction du vent en abrégée anglais standard selon 16 directions.
* @return array Liste des directions abrégées.
*/
function angle2direction($angle) {
static $liste_directions = array(
function lister_directions() : array {
static $liste_directions = [
0 => 'N',
1 => 'NNE',
2 => 'NE',
@ -29,25 +32,39 @@ function angle2direction($angle) {
15 => 'NNW',
16 => 'N',
17 => 'V'
);
];
$direction = '';
if (is_numeric($angle)) {
$direction = $liste_directions[round($angle / 22.5) % 16];
} elseif (in_array(strtoupper($angle), $liste_directions)) {
$direction = strtoupper($angle);
return $liste_directions;
}
/**
* Convertit un angle en degré en une direction sur 16 valeurs.
*
* @param int $angle Angle du vent exprimé en degrés.
*
* @return string Direction du vent en abrégée anglais standard selon 16 directions.
*/
function angle2direction(int $angle) : string {
static $liste_directions = [];
if (!$liste_directions) {
$liste_directions = lister_directions();
}
$direction = $liste_directions[round($angle / 22.5) % 16];
return $direction;
}
/**
* Convertit un indice UV normalisé en une chaine correspondant à un niveau de risque.
*
* @param int $indice_uv Entier représentant l'indice UV
*
* @return string Chaine représentant le risque lié à l'indice UV. Cette chaine permet de calculer
* l'item de langue du risque dans la langue requise.
*/
function indice2risque_uv($indice_uv) {
function indice2risque_uv(int $indice_uv) : string {
$risque_uv = '';
if (is_float($indice_uv)) {
if ($indice_uv >= 11) {
@ -67,61 +84,91 @@ function indice2risque_uv($indice_uv) {
}
/**
* Conversion des kilomètres en miles.
* Convertit des kilomètres en miles.
*
* @param float $kilometre La valeur réelle en kilomètres.
*
* @return float La valeur réelle correspondante convertie en miles
*/
function kilometre2mile($kilometre) {
function kilometre2mile(float $kilometre) : float {
return 0.6215 * $kilometre;
}
/**
* Conversion des températures celsius en farenheit.
* Convertit des miles en kilomètres.
*
* @param float $miles La valeur réelle en miles.
*
* @return float La valeur réelle correspondante convertie en kilomètres
*/
function mile2kilometre(float $miles) : float {
return $miles / 0.6215;
}
/**
* Convertit des températures celsius en farenheit.
*
* @param int $celsius La valeur réelle en degrés celsius.
*
* @return float La valeur réelle correspondante convertie en farenheit.
*/
function celsius2farenheit($celsius) {
function celsius2farenheit(int $celsius) : float {
return $celsius * 9 / 5 + 32;
}
/**
* Conversion des millimètres en pouces.
* Convertit des températures celsius en farenheit.
*
* @param int $farenheit La valeur réelle en degrés celsius.
*
* @return float La valeur réelle correspondante convertie en farenheit.
*/
function farenheit2celsius(int $farenheit) : float {
return ($farenheit - 32) * 5 / 9;
}
/**
* Convertit des millimètres en pouces.
*
* @param float $millimetre La valeur réelle en millimètres
*
* @return float La valeur réelle correspondante convertie en pouces.
*/
function millimetre2inch($millimetre) {
function millimetre2inch(float $millimetre) : float {
return $millimetre / 25.4;
}
/**
* Conversion des pressions millibar en pouces.
* Convertit des pressions millibar en pouces.
*
* @param float $millibar La valeur réelle en millibars
*
* @return float La valeur réelle correspondante convertie en pouces.
*/
function millibar2inch($millibar) {
function millibar2inch(float $millibar) : float {
return $millibar / 33.86;
}
/**
* Calcul de la température ressentie (refroidissement éolien) en degrés celsius.
* Calcule la température ressentie (refroidissement éolien) en degrés celsius.
*
* Le calcul n'a de sens que pour des températures réelles supérieures à -50°C et inférieures à 10°C.
* Au-delà de ces valeurs, la fonction renvoie la température réelle fournie en entrée.
*
* @param float $temperature Température réelle mesurée en celsius.
* @param float $vitesse_vent Vitesse du vent en kilomètre par heure.
* @param float $temperature Température réelle mesurée en celsius.
* @param float $vitesse_vent Vitesse du vent en kilomètre par heure.
* @param null|string $unite Système d'unité métrique (`m`, défaut) ou impérial (`s`)
*
* @return float Température ressentie arrondie en entier et exprimée en degrés celsius.
*/
function temperature2ressenti($temperature, $vitesse_vent) {
function temperature2ressenti(float $temperature, float $vitesse_vent, ?string $unite = 'm') : float {
// On convertit en système métrique pour effectuer le calcul
if ($unite !== 'm') {
$temperature = farenheit2celsius($temperature);
$vitesse_vent = mile2kilometre($vitesse_vent);
}
// Calcul du refroidissement éollien en système métrique
if (($temperature >= -50) and ($temperature <= 10)) {
if ($vitesse_vent > 4.8) {
$ressenti = 13.12 + 0.6215 * $temperature + (0.3965 * $temperature - 11.37) * pow($vitesse_vent, 0.16);
@ -133,27 +180,32 @@ function temperature2ressenti($temperature, $vitesse_vent) {
$ressenti = $temperature;
}
// Si le système impérial est demandé, on convertit la température
if ($unite !== 'm') {
$ressenti = celsius2farenheit($ressenti);
}
return $ressenti;
}
/**
* Conversion en kilomètres d'une valeur en mètres.
* Convertit en kilomètres une valeur en mètres.
*
* @param int $metre La valeur entière en mètres
*
* @return float La valeur correspondante convertie en kilomètres.
*/
function metre2kilometre($metre) {
function metre2kilometre(int $metre) : float {
return $metre / 1000;
}
/**
* Conversion en kilomètres par heure d'une valeur en mètres par seconde.
* Convertit en kilomètres par heure une valeur en mètres par seconde.
*
* @param float $vitesse_vent Vitesse du vent en mètres par seconde.
*
* @return float La valeur correspondante convertie en kilomètres par heure.
*/
function metre_seconde2kilometre_heure($vitesse_vent) {
function metre_seconde2kilometre_heure(float $vitesse_vent) : float {
return ($vitesse_vent * 3600) / 1000;
}

125
inc/rainette_debusquer.php

@ -18,26 +18,31 @@ if (!defined('_RAINETTE_DEBUG_CLES_PREVISIONS')) {
}
/**
* @param string $lieu
* @param string $mode
* @param string $service
* Affiche de façon lisible le cache d'une requête d'un service donné en utilisant la fonction `bel_env()`.
*
* @param string $lieu Le lieu concerné par la méteo exprimé selon les critères requis par le service.
* @param null|string $mode Le type de données météorologiques demandé.
* @param null|string $service Le nom abrégé du service.
*
* @return string
*/
function rainette_debug_afficher_cache($lieu, $mode = 'previsions', $service = '') {
function rainette_debug_afficher_cache(string $lieu, ?string $mode = 'previsions', ?string $service = '') : string {
// Initialisations : en particulier on récupère le service par défaut si besoin
static $cles_previsions = array();
static $cles_previsions = [];
$debug = '';
if (!$service) {
$service = rainette_service_defaut();
}
// Recuperation du tableau des conditions courantes
if (!service_est_indisponible($service) and _RAINETTE_DEBUG and function_exists('bel_env')) {
if (
!service_est_indisponible($service)
and _RAINETTE_DEBUG
and function_exists('bel_env')
) {
// Si on est en mode prévisions, on impose la périodicité à la valeur par défaut pour le service
$periodicite = 0;
if ($mode == 'previsions') {
if ($mode === 'previsions') {
include_spip('inc/rainette_normaliser');
$configuration = configuration_service_lire($service, $mode);
$periodicite = $configuration['periodicite_defaut'];
@ -49,7 +54,7 @@ function rainette_debug_afficher_cache($lieu, $mode = 'previsions', $service = '
// Pour le mode prévisions, on supprime tous les jours postérieur au lendemain pour éviter d'avoir un
// affichage trop conséquent.
if ($mode == 'previsions') {
if ($mode === 'previsions') {
// Récupérer les index de prévisions à afficher
if (!$cles_previsions) {
$cles_previsions = explode(',', _RAINETTE_DEBUG_CLES_PREVISIONS);
@ -67,13 +72,16 @@ function rainette_debug_afficher_cache($lieu, $mode = 'previsions', $service = '
}
/**
* @param string $mode
* @param array $jeu
* Construit un tableau comparatif de la météo d'un lieu pour les différents services demandés.
*
* @return array
* @param null|string $mode Le type de données météorologiques demandé.
* @param null|array $jeu Jeu de données sous la forme [service] = lieu. Le lieu doit être le même exprimé sous la forme
* recommandée par le service.
*
* @return array Le tableau de comparaison indexé par chaque service
*/
function rainette_debug_comparer_services($mode = 'conditions', $jeu = array()) {
$debug = array();
function rainette_debug_comparer_services(?string $mode = 'conditions', ?array $jeu = []) : array {
$debug = [];
if (!$mode) {
$mode = 'conditions';
@ -81,7 +89,7 @@ function rainette_debug_comparer_services($mode = 'conditions', $jeu = array())
// On acquiert la structure exact des tableaux de données standard
include_spip('inc/config');
$config_donnees = lire_config("rainette_config/${mode}/donnees", array());
$config_donnees = lire_config("rainette_config/{$mode}/donnees", []);
if ($config_donnees) {
if (!$jeu) {
@ -94,7 +102,7 @@ function rainette_debug_comparer_services($mode = 'conditions', $jeu = array())
$periodicite = 0;
foreach ($jeu as $_service => $_lieu) {
// Si on est en mode prévisions, on impose la périodicité à la valeur par défaut pour le service
if ($mode == 'previsions') {
if ($mode === 'previsions') {
$configuration = configuration_service_lire($_service, $mode);
$periodicite = $configuration['periodicite_defaut'];
}
@ -108,11 +116,14 @@ function rainette_debug_comparer_services($mode = 'conditions', $jeu = array())
// jour suivant le jour courant et pour les données heures l'index 0 qui existe toujours.
// En outre, il faut tenir compte pour les prévisions qu'il existe des données "jour" et
// des données "heure" alors que pour les autres modes ll n'existe que des données "jour".
$tableau_jour = ($mode == 'previsions') ? $tableau['donnees'][1] : $tableau['donnees'];
$tableau_jour = ($mode === 'previsions') ? $tableau['donnees'][1] : $tableau['donnees'];
foreach ($config_donnees as $_donnee => $_config) {
// On détermine la valeur et le type PHP de la données dans le tableau standard et
// on stocke les informations de configuration rangement pour les prévisions
if (isset($_config['rangement']) and ($_config['rangement'] == 'heure')) {
if (
isset($_config['rangement'])
and ($_config['rangement'] === 'heure')
) {
$valeur = $tableau_jour['heure'][0][$_donnee];
$type_php = gettype($tableau_jour['heure'][0][$_donnee]);
$rangement = $_config['rangement'];
@ -124,7 +135,10 @@ function rainette_debug_comparer_services($mode = 'conditions', $jeu = array())
// On construit le tableau de debug
$debug[$_donnee][$_service]['valeur'] = $valeur;
if (($_donnee == 'icon_meteo') and tester_url_absolue($valeur)) {
if (
($_donnee === 'icon_meteo')
and tester_url_absolue($valeur)
) {
$debug[$_donnee][$_service]['valeur'] = dirname($valeur) . '/<br />' . basename($valeur);
}
$debug[$_donnee][$_service]['type_php'] = $type_php;
@ -145,55 +159,63 @@ function rainette_debug_comparer_services($mode = 'conditions', $jeu = array())
}
/**
* @param string $donnee
* @param mixed $valeur
* @param string $type_php
* @param string $type_unite
* @param string $service
* Renvoie la chaine d'une valeur donnée de la façon la plus lisible possible.
*
* @return string
* @param string $donnee Type de la donnée
* @param mixed $valeur Valeur de la donnée
* @param string $type_php Type PHP de la donnée affichée
* @param string $type_unite Unité de la donnée
* @param null|string $service Le nom abrégé du service.
*
* @return string Chaine à afficher pour fournir l'information la plus précise possible sur la donnée.
*/
function rainette_debug_afficher_donnee($donnee, $valeur, $type_php, $type_unite, $service = '') {
function rainette_debug_afficher_donnee(string $donnee, $valeur, string $type_php, string $type_unite, ?string $service = '') : string {
// Initialisations : en particulier on récupère le service par défaut si besoin
$type_php = strtolower($type_php);
$texte = '';
if (!$service) {
$service = rainette_service_defaut();
}
if ($type_php === 'NULL') {
if ($type_php === 'null') {
$texte = '<del>API</del>';
$type_php = 'null';
} elseif ($valeur === '') {
if ($donnee != 'erreur') {
if ($donnee !== 'erreur') {
$texte = 'Indisponible';
} else {
$texte = $valeur ? $valeur : 'Ok';
}
} elseif ($type_php === 'array') {
foreach ($valeur as $_cle => $_valeur) {
$texte .= ($texte ? '<br />' : '') . "<strong>${_cle}</strong> : " . ((gettype($_valeur) === null) ? '<del>API</del>' : $_valeur);
$texte .= ($texte ? '<br />' : '') . "<strong>{$_cle}</strong> : " . ((gettype($_valeur) === null) ? '<del>API</del>' : $_valeur);
}
} else {
$texte = $type_unite ? rainette_afficher_unite($valeur, $type_unite, -1, $service) : $valeur;
}
$texte .= "<br /><em>${type_php}</em>";
$texte .= "<br /><em>{$type_php}</em>";
return $texte;
}
/**
* Fournit le jeu de données par défaut pour l'ensemble des services.
* Paris est utilisé comme le lieu par défaut.
*
* @return array
*/
function rainette_debug_jeu_defaut() {
$jeu = array();
function rainette_debug_jeu_defaut() : array {
$jeu = [];
include_spip('rainette_fonctions');
$services = rainette_lister_services();
if ($services) {
foreach ($services as $_service => $_nom) {
if ($_service == 'accuweather') {
if ($_service === 'accuweather') {
$jeu[$_service] = '623';
} elseif ($_service === 'meteoconcept') {
$jeu[$_service] = '75101';
} elseif ($_service === 'openmeteo') {
$jeu[$_service] = '48.85,2.35';
} else {
$jeu[$_service] = 'Paris,France';
}
@ -204,29 +226,27 @@ function rainette_debug_jeu_defaut() {
}
/**
* Affiche l'état d'exécution de l'ensemble des services.
*
* @return array
*/
function rainette_debug_afficher_execution() {
$debug = array();
function rainette_debug_afficher_execution() : array {
$debug = [];
$services = rainette_lister_services();
if ($services) {
include_spip('inc/config');
$execution = lire_config('rainette_execution', array());
$execution = lire_config('rainette_execution', []);
include_spip('inc/rainette_normaliser');
foreach ($services as $_service => $_nom) {
$configuration = lire_config("rainette_${_service}/service", array());
$configuration = lire_config("rainette_{$_service}/service", []);
$debug[$_service]['dernier_appel'] = isset($execution[$_service]['dernier_appel'])
? $execution[$_service]['dernier_appel']
: '--';
foreach (array('year', 'month', 'day', 'hour', 'minute', 'second') as $_periode) {
$debug[$_service]['dernier_appel'] = $execution[$_service]['dernier_appel'] ?? '--';
foreach (['year', 'month', 'day', 'hour', 'minute', 'second'] as $_periode) {
if (isset($configuration['offres']['limites'][$_periode])) {
$compteur = isset($execution[$_service]['compteurs'][$_periode])
? $execution[$_service]['compteurs'][$_periode]
: '--';
$debug[$_service][$_periode] = "${compteur} / {$configuration['offres']['limites'][$_periode]}";
$compteur = $execution[$_service]['compteurs'][$_periode] ?? '--';
$debug[$_service][$_periode] = "{$compteur} / {$configuration['offres']['limites'][$_periode]}";
} else {
$debug[$_service][$_periode] = '';
}
@ -238,21 +258,22 @@ function rainette_debug_afficher_execution() {
}
/**
* Fonction permettant de vérifier si la liste des langues de SPIP a changé et qu'il faut modifier la config rainette.
* Vérifie si la liste des langues de SPIP a changé et qu'il faut modifier la config rainette.
*
* @return string Texte fournissant la liste des langues manquantes.
*/
function rainette_debug_verifier_langue_manquante() {
function rainette_debug_verifier_langue_manquante() : string {
// Initialisation de l'affichage à aucune erreur.
$texte = 'Aucun code de langue SPIP manquant';
// Lecture de la configuration technique des langues alternatives.
include_spip('inc/config');
$langues_alternatives = lire_config('rainette_config/langues_alternatives', array());
$langues_alternatives = lire_config('rainette_config/langues_alternatives', []);
include_spip('inc/lang_liste');
foreach ($GLOBALS['codes_langues'] as $code => $langue) {
if (!array_key_exists($code, $langues_alternatives)) {
$texte .= "Code manquant ${code}<br />";
$texte .= "Code manquant {$code}<br />";
}
}

318
inc/rainette_normaliser.php

@ -26,31 +26,36 @@ if (!defined('_RAINETTE_REGEXP_LIEU_WEATHER_ID')) {
*/
define('_RAINETTE_REGEXP_LIEU_WEATHER_ID', '#[a-zA-Z]{4}\d{4}#i');
}
if (!defined('_RAINETTE_REGEXP_LIEU_INSEE_ID')) {
/**
* Regexp permettant de reconnaître un lieu au format Weather ID.
*/
define('_RAINETTE_REGEXP_LIEU_INSEE_ID', '#[0-9ABab]{5}#i');
}
/**
* Normalise les données issues du service dans un tableau standard aux index prédéfinis pour chaque mode.
*
* @param array $configuration_service Configuration statique et utilisateur du service ayant retourné le flux de données.
* @param string $mode Le type de données météorologiques demandé :
* - `conditions`, la valeur par défaut
* - `previsions`
* - `infos`
* @param array $flux Le tableau brut des données météorologiques issu de l'appel au service.
* @param int $periode Valeur de 0 à n pour indiquer qu'on traite les données de prévisions d'une période horaire donnée
* ou -1 pour indiquer que l'on traite les données jour. La valeur maximale n dépend de la périodicité
* des prévisions, par exemple, elle vaut 0 pour une périodicité de 24h, 1 pour 12h...
* @param array $configuration_service Configuration statique et utilisateur du service ayant retourné le flux de données.
* @param string $mode Le type de données météorologiques demandé :
* - `conditions`, la valeur par défaut
* - `previsions`
* - `infos`
* @param null|array $flux Le tableau brut des données météorologiques issu de l'appel au service.
* @param null|int $periode Valeur de 0 à n pour indiquer qu'on traite les données de prévisions d'une période horaire donnée
* ou -1 pour indiquer que l'on traite les données jour. La valeur maximale n dépend de la périodicité
* des prévisions, par exemple, elle vaut 0 pour une périodicité de 24h, 1 pour 12h...
*
* @return array Le tableau standardisé des données météorologiques du service pour la période spécifiée.
*/
function meteo_normaliser($configuration_service, $mode, $flux, $periode) {
$tableau = array();
function meteo_normaliser(array $configuration_service, string $mode, ?array $flux = [], ?int $periode = -1) : array {
$tableau = [];
include_spip('inc/filtres');
if ($flux !== null) {
// Lecture de la configuration technique des données pour le mode concerné.
include_spip('inc/config');
$configuration_mode = lire_config("rainette_config/${mode}/donnees", array());
$configuration_mode = lire_config("rainette_config/{$mode}/donnees", []);
// Le service a renvoyé des données, on boucle sur les clés du tableau normalisé
// Néanmoins, en fonction de la période fournie en argument on filtre les données uniquement
@ -58,12 +63,21 @@ function meteo_normaliser($configuration_service, $mode, $flux, $periode) {
// - si période = -1 on traite les données jour
// - si période > -1 on traite les données heure
foreach (array_keys($configuration_mode) as $_donnee) {
if ((($periode == -1)
and (empty($configuration_mode[$_donnee]['rangement'])
or ($configuration_mode[$_donnee]['rangement'] == 'jour')))
or (($periode > -1) and ($configuration_mode[$_donnee]['rangement'] == 'heure'))
if (
(
($periode
=== -1)
and (
empty($configuration_mode[$_donnee]['rangement'])
or ($configuration_mode[$_donnee]['rangement'] === 'jour')
)
)
or (
($periode > -1)
and ($configuration_mode[$_donnee]['rangement'] === 'heure')
)
) {
if ($configuration_mode[$_donnee]['origine'] == 'service') {
if ($configuration_mode[$_donnee]['origine'] === 'service') {
// La donnée est fournie par le service. Elle n'est jamais calculée par le plugin
// Néanmoins, elle peut-être indisponible temporairement
if ($cle_service = $configuration_service['donnees'][$_donnee]['cle']) {
@ -92,7 +106,7 @@ function meteo_normaliser($configuration_service, $mode, $flux, $periode) {
$valeur_typee = $typer ? $typer($valeur_service) : $valeur_service;
// Vérification de la donnée en cours de traitement si une fonction idoine existe
$verifier = "donnee_verifier_${_donnee}";
$verifier = "donnee_verifier_{$_donnee}";
if (!function_exists($verifier) or (function_exists($verifier) and $verifier($valeur_typee))) {
$donnee = $valeur_typee;
}
@ -124,8 +138,7 @@ function meteo_normaliser($configuration_service, $mode, $flux, $periode) {
*
* @return string La fonction PHP (floatval, intval...) ou spécifique à appliquer à la valeur de la donnée.
*/
function donnee_typer($type_php) {
function donnee_typer(string $type_php) : string {
// Si aucun type PHP précisé on renvoie aucune fonction à appliquer.
$fonction = '';
@ -165,7 +178,7 @@ function donnee_typer($type_php) {
*
* @return string Date au format `Y-m-d H:i:s`.
*/
function donnee_formater_date($donnee) {
function donnee_formater_date(string $donnee) : string {
if (is_numeric($donnee)) {
$date = date('Y-m-d H:i:s', $donnee);
} else {
@ -189,7 +202,7 @@ function donnee_formater_date($donnee) {
*
* @return string Heure au format `H:i`.
*/
function donnee_formater_heure($donnee) {
function donnee_formater_heure(string $donnee) : string {
if (is_numeric($donnee)) {
$taille = strlen($donnee);
if ($taille < 3) {
@ -197,11 +210,11 @@ function donnee_formater_heure($donnee) {
$h = $donnee;
} else {
$m = substr($donnee, -2);
$h = strlen($donnee) == 3
$h = strlen($donnee) === 3
? substr($donnee, 0, 1)
: substr($donnee, 0, 2);
}
$heure = "${h}:${m}";
$heure = "{$h}:{$m}";
} else {
$heure = $donnee;
}
@ -216,7 +229,7 @@ function donnee_formater_heure($donnee) {
*
* @return bool `true` si la valeur est acceptable, `false` sinon.
*/
function donnee_verifier_indice_uv($valeur) {
function donnee_verifier_indice_uv(int $valeur) : bool {
$est_valide = true;
if (($valeur < 0) or ($valeur > 16)) {
$est_valide = false;
@ -226,27 +239,29 @@ function donnee_verifier_indice_uv($valeur) {
}
/**
* @param $erreur
* @param $lieu
* @param $mode
* @param $periodicite
* @param $service
* @param $configuration
*
* @return array
* Complète et normalise la partie additionnelle du bloc d'erreur.
*
* @param array $erreur Bloc d'erreur brut fourni par la fonction de chargement
* @param string $lieu Le lieu concerné par la méteo exprimé selon les critères requis par le service.
* @param string $mode Le type de données météorologiques demandé.
* @param int $periodicite La périodicité horaire des prévisions uniquement (0 si le ode est différent).
* @param string $service Le nom abrégé du service.
* @param null|array $configuration Configuration du service
*
* @return array Bloc d'erreur complété
*/
function erreur_normaliser_extras($erreur, $lieu, $mode, $periodicite, $service, $configuration = array()) {
$extras = array(
'credits' => array(),
'config' => array(
function erreur_normaliser_extras($erreur, $lieu, $mode, $periodicite, $service, $configuration = []) {
$extras = [
'credits' => [],
'config' => [
'nom_service' => $service
),
],
'lieu' => $lieu,
'mode' => $mode,
'periodicite_cache' => $periodicite,
'service' => $service,
'erreur' => $erreur
);
];
// On complète les informations extras uniquement si le service est connu actif ou non.
if ($erreur['type'] != 'service_inconnu') {
@ -260,8 +275,8 @@ function erreur_normaliser_extras($erreur, $lieu, $mode, $periodicite, $service
$extras['credits'] = $configuration['credits'];
$extras['config'] = array_merge(
parametrage_normaliser($service, $configuration['defauts']),
array('source' => configuration_donnees_normaliser($mode, $configuration['donnees'])),
array('nom_service' => $configuration['nom'])
['source' => configuration_donnees_normaliser($mode, $configuration['donnees'])],
['nom_service' => $configuration['nom']]
);
}
@ -269,17 +284,19 @@ function erreur_normaliser_extras($erreur, $lieu, $mode, $periodicite, $service
}
/**
* @param $erreur
* @param $lieu
* @param $mode
* @param $modele
* @param $service
* @param $nom_service
*
* @return array
* Formate le texte d'erreur affiché dans la boite d'alerte.
*
* @param array $erreur Bloc d'erreur brut fourni par la fonction de chargement
* @param string $lieu Le lieu concerné par la méteo exprimé selon les critères requis par le service.
* @param string $mode Le type de données météorologiques demandé.
* @param string $modele Le modèle utilisé pour afficher la météo.
* @param string $service Le nom abrégé du service.
* @param string $nom_service Nom littéral du service
*
* @return array Texte de l'erreur pour affichage sous la forme d'un tableau à 3 index, `service`, `principal` et `conseil`.
*/
function erreur_formater_texte($erreur, $lieu, $mode, $modele, $service, $nom_service) {
$texte = array('principal' => '', 'conseil' => '', 'service' => '');
function erreur_formater_texte(array $erreur, string $lieu, string $mode, string $modele, string $service, string $nom_service) : array {
$texte = ['principal' => '', 'conseil' => '', 'service' => ''];
$type_erreur = $erreur['type'];
switch ($type_erreur) {
@ -290,10 +307,10 @@ function erreur_formater_texte($erreur, $lieu, $mode, $modele, $service, $nom_se
// Cas d'erreur où le service renvoie aucune donnée sans pour autant monter une erreur.
case 'aucune_donnee':
// Cas d'erreur où le nombre de requêtes maximal a été atteint.
$texte['principal'] .= _T("rainette:erreur_${type_erreur}", array('service' => $nom_service));
$texte['principal'] .= _T("rainette:erreur_{$type_erreur}", ['service' => $nom_service]);
$texte['conseil'] .= _T('rainette:erreur_conseil_equipe');
break;
// Cas d'erreur renvoyé par le service lui-même
// Cas d'erreur renvoyé par le service lui-même
case 'reponse_service':
if (!empty($erreur['service']['code'])) {
$texte['service'] .= $erreur['service']['code'];
@ -301,33 +318,33 @@ function erreur_formater_texte($erreur, $lieu, $mode, $modele, $service, $nom_se
if (!empty($erreur['service']['message'])) {
$texte['service'] .= ($texte['service'] ? ' - ' : '') . $erreur['service']['message'];
}
$texte['principal'] .= _T("rainette:erreur_${type_erreur}_${mode}", array('service' => $nom_service, 'lieu' => $lieu));
$texte['principal'] .= _T("rainette:erreur_{$type_erreur}_{$mode}", ['service' => $nom_service, 'lieu' => $lieu]);
$texte['conseil'] .= _T('rainette:erreur_conseil_service');
break;
// Cas d'erreur où le nombre de requêtes maximal a été atteint.
// Cas d'erreur où le nombre de requêtes maximal a été atteint.
case 'limite_service':
$texte['principal'] .= _T("rainette:erreur_${type_erreur}", array('service' => $nom_service));
$texte['principal'] .= _T("rainette:erreur_{$type_erreur}", ['service' => $nom_service]);
$texte['conseil'] .= _T('rainette:erreur_conseil_limite');
break;
// Cas d'erreur du à une mauvaise utilisation des modèles
// Cas d'erreur du à une mauvaise utilisation des modèles
case 'modele_periodicite':
$texte['principal'] .= _T("rainette:erreur_${type_erreur}", array('modele' => $modele));
$texte['principal'] .= _T("rainette:erreur_{$type_erreur}", ['modele' => $modele]);
$texte['conseil'] .= _T('rainette:erreur_conseil_periodicite');
break;
case 'modele_service':
$texte['principal'] .= _T("rainette:erreur_${type_erreur}", array('modele' => $modele, 'service' => $nom_service));
$texte['principal'] .= _T("rainette:erreur_{$type_erreur}", ['modele' => $modele, 'service' => $nom_service]);
$texte['conseil'] .= _T('rainette:erreur_conseil_modele_changer');
break;
case 'modele_inutilisable':
$texte['principal'] .= _T("rainette:erreur_${type_erreur}", array('modele' => $modele));
$texte['principal'] .= _T("rainette:erreur_{$type_erreur}", ['modele' => $modele]);
$texte['conseil'] .= _T('rainette:erreur_conseil_modele_expliciter');
break;
case 'service_inactif':
$texte['principal'] .= _T("rainette:erreur_${type_erreur}", array('service' => $nom_service));
$texte['principal'] .= _T("rainette:erreur_{$type_erreur}", ['service' => $nom_service]);
$texte['conseil'] .= _T('rainette:erreur_conseil_service_changer');
break;
case 'service_inconnu':
$texte['principal'] .= _T("rainette:erreur_${type_erreur}", array('service' => $service));
$texte['principal'] .= _T("rainette:erreur_{$type_erreur}", ['service' => $service]);
$texte['conseil'] .= _T('rainette:erreur_conseil_service_verifier');
break;
}
@ -336,24 +353,25 @@ function erreur_formater_texte($erreur, $lieu, $mode, $modele, $service, $nom_se
}