Compare commits

...

23 Commits

Author SHA1 Message Date
Eric Lupinacci 90fbb69d4d Eviter une notice dans le trim() avec une valeur null (déprécié en 8.1). 3 months ago
Eric Lupinacci dc378746fc Up de z pour fournir un zip en 4.1 8 months ago
Eric Lupinacci 617fff7bcb Fonctionnement spip 4.1 vérifié et mise à jour des necessite. 8 months ago
Eric Lupinacci 489579ce3f Rangement des paramètres de la noisette prévisions 8 months ago
Eric Lupinacci 20db27a25e Mise en place des conditions temps réel pour Meteo Concept. 11 months ago
Eric Lupinacci 8f10a91122 Mise au point de la fonction d'upgrade de façon plus logique et traçable 11 months ago
Eric Lupinacci 6d4667b15a Modifier le schéma de façon à recharger la configuration des services voire la configuration de Rainette. 11 months ago
Eric Lupinacci fca7a98742 Amélioration du transcodage 11 months ago
Eric Lupinacci 2d7fabf9d4 Mise au point du transcodage weather 11 months ago
Eric Lupinacci 85a1bd1252 On remet les codes de weather pour l'instant 11 months ago
Eric Lupinacci 0e2ab33e0d Simplification de l'affichage du résumé et suppression de tous les anciens items de langue liés à Weather. 11 months ago
Eric Lupinacci d5b403a8c9 Correction d'items de langue. 11 months 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. 11 months 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. 2
      demo/demo.css
  2. 2
      demo/rainette.html
  3. 39
      formulaires/configurer_rainette_service.html
  4. 22
      formulaires/configurer_rainette_service.php
  5. 1
      inc/meteo_charger.php
  6. 10
      inc/rainette_debusquer.php
  7. 9
      inc/rainette_normaliser.php
  8. 10
      inc/rainette_requeter.php
  9. 96
      lang/meteoc_fr.php
  10. 65
      lang/rainette_fr.php
  11. 4
      noisettes/meteo_conditions.yaml
  12. 88
      noisettes/meteo_previsions.yaml
  13. 18
      paquet.xml
  14. 8
      prive/squelettes/inclure/inc-rainette_raccourcis_admin.html
  15. BIN
      prive/themes/spip/images/rainette-16.png
  16. BIN
      prive/themes/spip/images/rainette-24.png
  17. 8
      prive/themes/spip/images/rainette-xx.svg
  18. 9
      rainette.svg
  19. 15
      rainette_administrations.php
  20. 104
      rainette_fonctions.php
  21. 25
      rainette_ieconfig_metas.php
  22. BIN
      rainette_logo-64.png
  23. 10
      rainette_pipelines.php
  24. 3
      services/accuweather.php
  25. 4
      services/accuweather.yaml
  26. 271
      services/meteoc.php
  27. 312
      services/meteoc.yaml

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;}

2
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>

39
formulaires/configurer_rainette_service.html

@ -9,10 +9,10 @@
<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>]})]
@ -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}|=={meteoc}|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 meteoc 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:>,
})]

22
formulaires/configurer_rainette_service.php

@ -40,9 +40,7 @@ function formulaires_configurer_rainette_service_charger($service) {
// 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']
: '';
$valeurs['_utilisation']['dernier_appel'] = $execution['dernier_appel'] ?? '';
if (isset($execution['compteurs'])) {
$valeurs['_utilisation']['compteurs'] = $execution['compteurs'];
} else {
@ -54,12 +52,24 @@ function formulaires_configurer_rainette_service_charger($service) {
}
// 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, array('accuweather', 'meteoc'));
$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')
? rainette_lister_themes('weather')
: array();
// -- 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).

1
inc/meteo_charger.php

@ -39,6 +39,7 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* - `weatheapi` pour WeatherAPI
* - `accuweather` pour AccuWeather
* - `wwo` pour World Weather Online
* - `meteoc` pour Meteo-Concept
*
* @return array Le contenu du fichier cache contenant les données à jour demandées.
*/

10
inc/rainette_debusquer.php

@ -194,6 +194,8 @@ function rainette_debug_jeu_defaut() {
foreach ($services as $_service => $_nom) {
if ($_service == 'accuweather') {
$jeu[$_service] = '623';
} elseif ($_service == 'meteoc') {
$jeu[$_service] = '75101';
} else {
$jeu[$_service] = 'Paris,France';
}
@ -218,14 +220,10 @@ function rainette_debug_afficher_execution() {
foreach ($services as $_service => $_nom) {
$configuration = lire_config("rainette_${_service}/service", array());
$debug[$_service]['dernier_appel'] = isset($execution[$_service]['dernier_appel'])
? $execution[$_service]['dernier_appel']
: '--';
$debug[$_service]['dernier_appel'] = $execution[$_service]['dernier_appel'] ?? '--';
foreach (array('year', 'month', 'day', 'hour', 'minute', 'second') as $_periode) {
if (isset($configuration['offres']['limites'][$_periode])) {
$compteur = isset($execution[$_service]['compteurs'][$_periode])
? $execution[$_service]['compteurs'][$_periode]
: '--';
$compteur = $execution[$_service]['compteurs'][$_periode] ?? '--';
$debug[$_service][$_periode] = "${compteur} / {$configuration['offres']['limites'][$_periode]}";
} else {
$debug[$_service][$_periode] = '';

9
inc/rainette_normaliser.php

@ -26,6 +26,12 @@ 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');
}
/**
@ -460,6 +466,9 @@ function lieu_normaliser($lieu, &$format_lieu = '') {
} elseif (preg_match(_RAINETTE_REGEXP_LIEU_IP, $lieu_normalise, $match)) {
$format_lieu = 'adresse_ip';
$lieu_normalise = $match[0];
} elseif (preg_match(_RAINETTE_REGEXP_LIEU_INSEE_ID, $lieu_normalise, $match)) {
$format_lieu = 'insee_id';
$lieu_normalise = $match[0];
} elseif (intval($lieu_normalise)) {
$format_lieu = 'city_id';
} else {

10
inc/rainette_requeter.php

@ -23,8 +23,16 @@ if (!defined('_ECRIRE_INC_VERSION')) {
function requeter($url, $configuration, $service) {
// Acquisition des données spécifiées par l'url
// - on demande le transcodage de la réponse
// - on ajoute le format accepté par la réponse car certains services l'utilise à la place d'un paramètre d'URL
include_spip('inc/distant');
$flux = recuperer_url($url, array('transcoder' => true));
$flux = recuperer_url(
$url,
array(
'headers' => array('Accept' => 'application/' . $configuration['format_flux']),
'transcoder' => true
)
);
// On loge la date de l'appel et on incrémente les compteurs de requêtes du service.
include_spip('inc/config');

96
lang/meteoc_fr.php

@ -0,0 +1,96 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// M
'meteo_0' => 'Soleil',
'meteo_1' => 'Peu nuageux',
'meteo_2' => 'Ciel voilé',
'meteo_3' => 'Nuageux',
'meteo_4' => 'Très nuageux',
'meteo_5' => 'Couvert',
'meteo_6' => 'Brouillard',
'meteo_7' => 'Brouillard givrant',
'meteo_10' => 'Pluie faible',
'meteo_11' => 'Pluie modérée',
'meteo_12' => 'Pluie forte',
'meteo_13' => 'Pluie faible verglaçante',
'meteo_14' => 'Pluie modérée verglaçante',
'meteo_15' => 'Pluie forte verglaçante',
'meteo_16' => 'Bruine',
'meteo_20' => 'Neige faible',
'meteo_21' => 'Neige modérée',
'meteo_22' => 'Neige forte',
'meteo_30' => 'Pluie et neige mêlées faibles',
'meteo_31' => 'Pluie et neige mêlées modérées',
'meteo_32' => 'Pluie et neige mêlées fortes',
'meteo_40' => 'Averses de pluie locales et faibles',
'meteo_41' => 'Averses de pluie locales',
'meteo_42' => 'Averses locales et fortes',
'meteo_43' => 'Averses de pluie faibles',
'meteo_44' => 'Averses de pluie',
'meteo_45' => 'Averses de pluie fortes',
'meteo_46' => 'Averses de pluie faibles et fréquentes',
'meteo_47' => 'Averses de pluie fréquentes',
'meteo_48' => 'Averses de pluie fortes et fréquentes',
'meteo_60' => 'Averses de neige localisées et faibles',
'meteo_61' => 'Averses de neige localisées',
'meteo_62' => 'Averses de neige localisées et fortes',
'meteo_63' => 'Averses de neige faibles',
'meteo_64' => 'Averses de neige',
'meteo_65' => 'Averses de neige fortes',
'meteo_66' => 'Averses de neige faibles et fréquentes',
'meteo_67' => 'Averses de neige fréquentes',
'meteo_68' => 'Averses de neige fortes et fréquentes',
'meteo_70' => 'Averses de pluie et neige mêlées localisées et faibles',
'meteo_71' => 'Averses de pluie et neige mêlées localisées',
'meteo_72' => 'Averses de pluie et neige mêlées localisées et fortes',
'meteo_73' => 'Averses de pluie et neige mêlées faibles',
'meteo_74' => 'Averses de pluie et neige mêlées',
'meteo_75' => 'Averses de pluie et neige mêlées fortes',
'meteo_76' => 'Averses de pluie et neige mêlées faibles et nombreuses',
'meteo_77' => 'Averses de pluie et neige mêlées fréquentes',
'meteo_78' => 'Averses de pluie et neige mêlées fortes et fréquentes',
'meteo_100' => 'Orages faibles et locaux',
'meteo_101' => 'Orages locaux',
'meteo_102' => 'Orages fort et locaux',
'meteo_103' => 'Orages faibles',
'meteo_104' => 'Orages',
'meteo_105' => 'Orages forts',
'meteo_106' => 'Orages faibles et fréquents',
'meteo_107' => 'Orages fréquents',
'meteo_108' => 'Orages forts et fréquents',
'meteo_120' => 'Orages faibles et locaux de neige ou grésil',
'meteo_121' => 'Orages locaux de neige ou grésil',
'meteo_122' => 'Orages locaux de neige ou grésil',
'meteo_123' => 'Orages faibles de neige ou grésil',
'meteo_124' => 'Orages de neige ou grésil',
'meteo_125' => 'Orages de neige ou grésil',
'meteo_126' => 'Orages faibles et fréquents de neige ou grésil',
'meteo_127' => 'Orages fréquents de neige ou grésil',
'meteo_128' => 'Orages fréquents de neige ou grésil',
'meteo_130' => 'Orages faibles et locaux de pluie et neige mêlées ou grésil',
'meteo_131' => 'Orages locaux de pluie et neige mêlées ou grésil',
'meteo_132' => 'Orages fort et locaux de pluie et neige mêlées ou grésil',
'meteo_133' => 'Orages faibles de pluie et neige mêlées ou grésil',
'meteo_134' => 'Orages de pluie et neige mêlées ou grésil',
'meteo_135' => 'Orages forts de pluie et neige mêlées ou grésil',
'meteo_136' => 'Orages faibles et fréquents de pluie et neige mêlées ou grésil',
'meteo_137' => 'Orages fréquents de pluie et neige mêlées ou grésil',
'meteo_138' => 'Orages forts et fréquents de pluie et neige mêlées ou grésil',
'meteo_140' => 'Pluies orageuses',
'meteo_141' => 'Pluie et neige mêlées à caractère orageux',
'meteo_142' => 'Neige à caractère orageux',
'meteo_210' => 'Pluie faible intermittente',
'meteo_211' => 'Pluie modérée intermittente',
'meteo_212' => 'Pluie forte intermittente',
'meteo_220' => 'Neige faible intermittente',
'meteo_221' => 'Neige modérée intermittente',
'meteo_222' => 'Neige forte intermittente',
'meteo_230' => 'Pluie et neige mêlées',
'meteo_231' => 'Pluie et neige mêlées',
'meteo_232' => 'Pluie et neige mêlées',
'meteo_235' => 'Averses de grêle',
);

65
lang/rainette_fr.php

@ -54,7 +54,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'erreur_modele_periodicite' => 'Le modèle @modele@ n\'est pas compatible avec la périodicité horaire demandée.',
'erreur_modele_service' => 'Le service @service@ ne fournit pas de prévisions avec une périodicité horaire compatible avec le modèle @modele@.',
'erreur_reponse_service_conditions' => 'Le service @service@ a renvoyé une erreur lors de l\'acquisition des conditions météorologiques du lieu @lieu@.',
'erreur_reponse_service_infos' => 'Le service @service@ ne fournit actuellement aucune condition météorologique sur le lieu @lieu@.',
'erreur_reponse_service_infos' => 'Le service @service@ ne fournit actuellement aucune information sur le lieu @lieu@.',
'erreur_reponse_service_previsions' => 'Le service @service@ ne fournit actuellement aucune prévision météorologique sur le lieu @lieu@.',
'erreur_service_inconnu' => 'L\'identifiant de service @service@ est erroné.',
'erreur_service_inactif' => 'Le service @service@ choisi a été désactivé car il ne fournit plus de données météorologiques.',
@ -66,10 +66,11 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'explication_configurer_theme' => 'Choisissez le thème d\'icônes à utiliser dans les affichages.',
'explication_configurer_unite' => 'Choisissez le système d\'unité dans lequel seront exprimées les données météorologiques.',
'explication_credit_accuweather' => 'Ce service fournit des données météorologiques pour une utilisation personnelle ou commerciale limitée. Il est demandé de toujours créditer le service avec le logo officiel pointant vers son site web.',
'explication_credit_meteoc' => 'Ce service fournit des données météorologiques pour une utilisation personnelle ou commerciale. Il existe une offre gratuite et des offres payantes. Le service ne précise pas la licence des données fournies ni les conditions d\'utilisation. Néanmoins, il est recommandé de créditer le service avec un lien vers le site web.',
'explication_credit_owm' => 'Ce service fournit des données météorologiques sous licence <a class="spip_out" href="https://creativecommons.org/licenses/by-sa/4.0/" target="_blank">CC BY-SA 4.0</a> et <a class="spip_out" href="https://opendatacommons.org/licenses/odbl/" target="_blank">ODbL</a> pour une utilisation commerciale ou personnelle. Il est demandé de toujours créditer le service avec un lien vers son site web.',
'explication_credit_weatherbit' => 'Ce service fournit des données météorologiques sous licence <a class="spip_out" href"https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode" target="_blank">CC BY-NC-SA 4.0</a> pour l\'offre gratuite limitée à une utilisation personnelle et, sous licence concédée non transférable destinée à une utilisation personnelle ou commerciale pour les offres payantes. Pour l\'offre gratuite, il est demandé de créditer le service avec un lien vers le site web.',
'explication_credit_weatherapi' => 'Ce service fournit des données météorologiques pour une utilisation personnelle ou commerciale (sauf pour l\'offre gratuite). Pour l\'offre gratuite, il est demandé de créditer le service avec un lien vers le site web.',
'explication_credit_wwo' => 'Ce service premium fournit des données météorologiques pour une utilisation commerciale ou personnelle. Etant donné que le service ne fournit plus d\'offre gratuite il n\'est pas nécessaire de créditer le service avec un lien vers le site web.',
'explication_credit_wwo' => 'Ce service premium fournit des données météorologiques pour une utilisation commerciale ou personnelle. Etant donné que le service ne fournit plus d\'offre gratuite il n\'est pas nécessaire de créditer le service avec un lien vers le site web mais cela reste conseillé.',
'explication_credit_page' => 'Pour consulter les termes exacts d\'utilisation veuillez vous rendre sur la page @url@.',
'explication_credit_conseil' => 'Les modèles d\'affichage fournis par Rainette créditent toujours le service indépendamment de l\'offre utilisée. Si vous créez vos propres modèles veillez absolument à respecter les règles d\'usage de l\'offre de service choisie ou plus simplement à créditer systématiquement le service.',
'explication_utilisation_gratuite_non' => 'Ce service propose plusieurs offres mais aucune gratuite&nbsp;: les détails sont consultables sur la page @url@.',
@ -119,17 +120,6 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'label_theme_owm_o1x' => 'Anciens icones (petit taille)',
'label_theme_owm_n1x' => 'Nouveaux icones (petit taille)',
'label_theme_owm_n2x' => 'Nouveaux icones (grande taille, recommandé)',
'label_theme_wunderground_a' => 'Default',
'label_theme_wunderground_b' => 'Smiley',
'label_theme_wunderground_c' => 'Generic',
'label_theme_wunderground_d' => 'Old school',
'label_theme_wunderground_e' => 'Cartoon',
'label_theme_wunderground_f' => 'Clip art',
'label_theme_wunderground_g' => 'Simple',
'label_theme_wunderground_h' => 'Comtemporary',
'label_theme_wunderground_i' => 'Minimalist',
'label_theme_wunderground_j' => 'Helen',
'label_theme_wunderground_k' => 'Incredible',
'label_theme' => 'Thème d\'icônes',
'label_unite_metrique' => 'Système métrique',
'label_unite_standard' => 'Système impérial',
@ -202,55 +192,6 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'meteo_previsions' => 'prévisions météorologiques',
'meteo' => 'météo',
'meteo_113' => 'Ensoleillé',
'meteo_116' => 'Partiellement nuageux',
'meteo_119' => 'Nuageux',
'meteo_122' => 'Nuage épais',
'meteo_143' => 'Brume',
'meteo_176' => 'Pluie éparse',
'meteo_179' => 'Neige éparse',
'meteo_182' => 'Grêle éparse',
'meteo_185' => 'Bruine froide et éparse',
'meteo_200' => 'Orage localisé',
'meteo_227' => 'Neige et vent',
'meteo_230' => 'Tempête de neige',
'meteo_248' => 'Brouillard           ',
'meteo_260' => 'Brouillard et froid',
'meteo_263' => 'Bruine légère et éparse',
'meteo_266' => 'Bruine légère',
'meteo_281' => 'Bruine froide',
'meteo_284' => 'Bruine gelée',
'meteo_293' => 'Pluie légère et éparse',
'meteo_296' => 'Pluie légère',
'meteo_299' => 'Pluie modérée intermittente',
'meteo_302' => 'Pluie modérée',
'meteo_305' => 'Pluie torrentielle intermittente',
'meteo_308' => 'Pluie torrentielle',
'meteo_311' => 'Froid léger',
'meteo_314' => 'Froid',
'meteo_317' => 'Grêle légère',
'meteo_320' => 'Grêle lourde',
'meteo_323' => 'Neige légère et éparse',
'meteo_326' => 'Neige légère',
'meteo_329' => 'Neige modérée et éparse',
'meteo_332' => 'Neige modérée',
'meteo_335' => 'Neige lourde et éparse',
'meteo_338' => 'Neige lourde',
'meteo_350' => 'Grêle',
'meteo_353' => 'Légère pluie',
'meteo_356' => 'Averses',
'meteo_359' => 'Pluie torrentielle',
'meteo_362' => 'Grésils légers',
'meteo_365' => 'Grésils lourds',
'meteo_368' => 'Neige légère',
'meteo_371' => 'Neige lourde',
'meteo_374' => 'Pluie légère avec grêle',
'meteo_377' => 'Pluie avec grêle',
'meteo_386' => 'Tempête',
'meteo_389' => 'Orage',
'meteo_392' => 'Tempête',
'meteo_395' => 'Neige Lourde',
// N
'nebulosite' => 'Nébulosité',
'noisette_description_conditions' => 'Affichage des conditions météorologiques pour un service donné',

4
noisettes/meteo_conditions.yaml

@ -1,6 +1,6 @@
nom: '<:rainette:noisette_titre_conditions:>'
description: '<:rainette:noisette_description_conditions:>'
icon: 'rainette.png'
icon: 'rainette-xx.svg'
contexte: 'aucun'
ajax: 'non'
parametres:
@ -23,6 +23,6 @@ parametres:
nom: 'titre'
label: '<:rainette:noisette_label_titre_conditions:>'
defaut: 'non'
datas:
data:
oui: '<:item_oui:>'
non: '<:item_non:>'

88
noisettes/meteo_previsions.yaml

@ -1,48 +1,50 @@
nom: '<:rainette:noisette_titre_previsions_24h:>'
description: '<:rainette:noisette_description_previsions_24h:>'
icon: 'rainette.png'
icon: 'rainette-xx.svg'
contexte: 'aucun'
ajax: 'non'
parametres:
-
saisie: 'input'
options:
nom: 'lieu'
label: '<:rainette:noisette_label_lieu:>'
explication: '<:rainette:noisette_explication_lieu:>'
-
saisie: 'input'
options:
nom: 'jour_1'
label: '<:rainette:noisette_label_jour_1:>'
explication: '<:rainette:noisette_explication_jour:>'
defaut: '1'
-
saisie: 'input'
options:
nom: 'nb_jours'
label: '<:rainette:noisette_label_nb_jours:>'
defaut: '5'
-
saisie: 'modele_24h'
options:
nom: 'modele'
label: '<:rainette:noisette_label_modele:>'
defaut: 'previsions_24h'
cacher_option_intro: 'oui'
-
saisie: 'service_meteo'
options:
nom: 'service'
label: '<:rainette:noisette_label_service:>'
defaut: ''
cacher_option_intro: 'oui'
-
saisie: 'radio'
options:
nom: 'titre'
label: '<:rainette:noisette_label_titre_previsions:>'
defaut: 'non'
datas:
oui: '<:item_oui:>'
non: '<:item_non:>'
contenu:
-
saisie: 'input'
options:
nom: 'lieu'
label: '<:rainette:noisette_label_lieu:>'
explication: '<:rainette:noisette_explication_lieu:>'
-
saisie: 'input'
options:
nom: 'jour_1'
label: '<:rainette:noisette_label_jour_1:>'
explication: '<:rainette:noisette_explication_jour:>'
defaut: '1'
-
saisie: 'input'
options:
nom: 'nb_jours'
label: '<:rainette:noisette_label_nb_jours:>'
defaut: '5'
-
saisie: 'service_meteo'
options:
nom: 'service'
label: '<:rainette:noisette_label_service:>'
defaut: ''
cacher_option_intro: 'oui'
-
saisie: 'radio'
options:
nom: 'titre'
label: '<:rainette:noisette_label_titre_previsions:>'
defaut: 'non'
data:
oui: '<:item_oui:>'
non: '<:item_non:>'
affichage:
-
saisie: 'modele_24h'
options:
nom: 'modele'
label: '<:rainette:noisette_label_modele:>'
defaut: 'previsions_24h'
cacher_option_intro: 'oui'

18
paquet.xml

@ -1,13 +1,12 @@
<paquet
prefix="rainette"
categorie="divers"
version="3.12.1"
version="4.1.1"
etat="stable"
compatibilite="]3.1.3;3.2.*]"
logo="rainette_logo-64.png"
compatibilite="]3.2.999;4.1.*]"
logo="rainette.svg"
demonstration="demo/rainette"
documentation="https://contrib.spip.net/article4949"
schema="2"
schema="3"
>
<nom>Rainette</nom>
<!-- La météo au quotidien -->
@ -15,6 +14,7 @@
<auteur lien="http://blog.smellup.net">Eric Lupinacci</auteur>
<auteur>Cedric Morin</auteur>
<credit>Anne-lise Martenot</credit>
<credit lien="https://thenounproject.com">Frog by Ayub Irawan from the Noun Project (logo)</credit>
<licence lien="http://www.gnu.org/licenses/gpl-3.0.html">GPL 3</licence>
@ -23,11 +23,11 @@
<pipeline nom="insert_head_css" inclure="rainette_pipelines.php" />
<pipeline nom="insert_head" action="insert_head_css" inclure="rainette_pipelines.php" />
<pipeline nom="post_chargement_meteo" action="" />
<pipeline nom="ieconfig_metas" inclure="rainette_ieconfig_metas.php" />
<necessite nom="yaml" compatibilite="[2.0.11;[" />
<necessite nom="ezcache" compatibilite="[1.0.2;]" />
<necessite nom="saisies" compatibilite="[3.23.2;[" />
<necessite nom="php" compatibilite="[5.3.0;[" />
<necessite nom="yaml" compatibilite="[2.0.18;[" />
<necessite nom="ezcache" compatibilite="[1.2.2;]" />
<necessite nom="saisies" compatibilite="[4.3.5;[" />
<menu nom="rainette" titre="rainette:titre_menu" parent="menu_squelette" icone="images/rainette-16.png" action="configurer_rainette" />
</paquet>

8
prive/squelettes/inclure/inc-rainette_raccourcis_admin.html

@ -1,11 +1,11 @@
[(#AUTORISER{configurer}|oui)
#BOITE_OUVRIR{'','raccourcis'}
[(#REM) <!-- Raccourci de rechargement de la configuration technique de Rainette et de celle de tous les services -->]
[(#URL_ACTION_AUTEUR{recharger_configuration, '', #SELF}
|icone_horizontale{<:rainette:bouton_recharger_configuration:>, cfg-24, '', #LANG_LEFT})]
[(#REM) <!-- Se rendre su la page de vidage des caches -->]
[(#URL_ECRIRE{cache_vider}
|ancre_url{rainette}
|icone_horizontale{<:rainette:bouton_vider_cache:>, cache-del-24, '', #LANG_LEFT})]
[(#REM) <!-- Raccourci de rechargement de la configuration technique de Rainnette et de celle de tous les services -->]
[(#URL_ACTION_AUTEUR{recharger_configuration, '', #SELF}
|icone_horizontale{<:rainette:bouton_recharger_configuration:>, cfg-24, '', #LANG_LEFT})]
|icone_horizontale{<:rainette:bouton_vider_cache:>, ezcache_empty-24, '', #LANG_LEFT})]
#BOITE_FERMER
]

BIN
prive/themes/spip/images/rainette-16.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 885 B

BIN
prive/themes/spip/images/rainette-24.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

8
prive/themes/spip/images/rainette-xx.svg

@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64">
<ellipse cx="32.4" cy="37.5" rx="28.4" ry="19.1" fill="#d3d3d3" />
<circle fill="#fff" cx="42.6" cy="20.1" r="8.6"/>
<circle fill="#fff" cx="21.2" cy="20.1" r="8.6"/>
<path fill="#119914" d="M20.9 24.4c-2.4 0-4.3-1.9-4.3-4.3s1.9-4.3 4.3-4.3 4.3 1.9 4.3 4.3-1.9 4.3-4.3 4.3zM42.6 24.4c-2.4 0-4.3-1.9-4.3-4.3s1.9-4.3 4.3-4.3 4.3 1.9 4.3 4.3-2 4.3-4.3 4.3zM31.7 46c-7.5 0-15-1.5-22.4-4.5-1.1-.4-1.6-1.7-1.2-2.8.4-1.1 1.7-1.6 2.8-1.2 13.8 5.5 27.8 5.5 41.6 0 1.1-.4 2.4.1 2.8 1.2.4 1.1-.1 2.4-1.2 2.8-7.4 3-14.9 4.5-22.4 4.5z"/>
<path fill="#119914" d="M32 58.6c-18.5 0-30-7.4-30-19.3 0-5.7 2.6-10.5 7.6-13.9-1.2-2.6-1.5-5.5-.9-8.4 1.1-4.8 5.1-8.7 9.9-9.7 5.4-1 10.6 1.3 13.4 5.6 2.8-4.2 8-6.5 13.4-5.5 4.8 1 8.8 4.9 9.9 9.7.7 2.9.3 5.8-.9 8.4 5 3.4 7.7 8.1 7.7 13.8C62 50.1 48.8 58.6 32 58.6zM21.3 11.4c-.6 0-1.2.1-1.8.2-3.2.6-5.8 3.2-6.5 6.4-.6 2.4-.1 4.9 1.4 6.9.4.5.5 1.1.3 1.7-.1.6-.5 1.1-1.1 1.4-4.8 2.6-7.3 6.4-7.3 11.2 0 11.1 13.3 15 25.7 15 14.2 0 25.7-6.7 25.7-15 0-4.8-2.5-8.6-7.3-11.2-.5-.3-.9-.8-1.1-1.4-.1-.6 0-1.2.3-1.7 1.4-2 1.9-4.5 1.4-6.9-.7-3.2-3.4-5.8-6.5-6.4-4.7-.9-9.1 1.9-10.2 6.5-.2 1.1-1.2 1.9-2.3 1.9-1.1 0-2.1-.8-2.4-1.9-.9-4-4.4-6.7-8.3-6.7z"/>
<path fill="#119914" d="M29.6 35.2c0 1.2-1 2.2-2.2 2.2s-2.2-1-2.2-2.2 1-2.2 2.2-2.2 2.2 1 2.2 2.2zM38.2 35.2c0 1.2-1 2.2-2.2 2.2-1.2 0-2.2-1-2.2-2.2s1-2.2 2.2-2.2c1.3.1 2.2 1 2.2 2.2z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

9
rainette.svg

@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64">
<path d="M16.9 35.1C7.8 34.2 1.1 26 2.1 16.9S11.2 1.1 20.3 2.1c5.4.6 10.1 3.7 12.8 8.4 6.8-1.2 13.2 3.4 14.4 10.2 1.2 6.8-3.4 13.2-10.2 14.4-.7.1-1.4.2-2.1.2h-2.4" fill="#888"/>
<ellipse cx="38" cy="44.6" rx="23" ry="15.4" fill="#d3d3d3"/>
<circle fill="#fff" cx="46.3" cy="30.5" r="7"/>
<circle fill="#fff" cx="28.8" cy="30.5" r="7"/>
<path fill="#119914" d="M28.8 34c-1.9 0-3.5-1.6-3.5-3.5s1.6-3.5 3.5-3.5 3.5 1.6 3.5 3.5-1.6 3.5-3.5 3.5zM46.3 34c-1.9 0-3.5-1.6-3.5-3.5s1.6-3.5 3.5-3.5 3.5 1.6 3.5 3.5-1.6 3.5-3.5 3.5zM37.5 51.5c-6.1 0-12.1-1.2-18.2-3.6-.9-.4-1.3-1.4-1-2.3.4-.9 1.4-1.3 2.3-1 11.2 4.5 22.5 4.5 33.7 0 .9-.4 1.9.1 2.3 1 .4.9-.1 1.9-1 2.3-6 2.4-12 3.6-18.1 3.6z"/>
<path fill="#119914" d="M37.5 62C22.4 62 13 56 13 46.2c0-4.7 2.2-8.6 6.2-11.3-1-2.1-1.3-4.5-.7-6.8.9-3.9 4.1-7.1 8.1-7.9 4.4-.9 8.6 1 10.9 4.5 2.3-3.5 6.5-5.3 10.9-4.5 3.9.8 7.2 4 8.1 7.9.5 2.4.3 4.7-.7 6.8 4.1 2.8 6.3 6.6 6.3 11.3C62 55.1 51.2 62 37.5 62zm-8.8-38.5c-.5 0-1 0-1.5.1-2.6.5-4.7 2.6-5.3 5.2-.4 2-.1 4 1.1 5.6.3.4.4.9.3 1.4-.1.5-.4.9-.9 1.1-4 2.1-6 5.2-6 9.2 0 9 10.8 12.3 21 12.3 11.6 0 21-5.5 21-12.3 0-3.9-2-7-6-9.1-.4-.2-.8-.7-.9-1.1-.1-.5 0-1 .3-1.4 1.2-1.7 1.6-3.7 1.1-5.7-.6-2.6-2.7-4.7-5.3-5.2-3.8-.8-7.5 1.6-8.3 5.3-.2.9-1 1.5-1.9 1.5s-1.7-.6-1.9-1.5c-.7-3.2-3.5-5.4-6.8-5.4z"/>
<path fill="#119914" d="M35.8 42.7c0 1-.8 1.8-1.8 1.8s-1.8-.8-1.8-1.8S33 41 34 41s1.8.8 1.8 1.7zM42.8 42.7c0 1-.8 1.8-1.8 1.8s-1.8-.8-1.8-1.8S40 41 41 41s1.8.8 1.8 1.7z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

15
rainette_administrations.php

@ -20,13 +20,18 @@ if (!defined('_ECRIRE_INC_VERSION')) {
**/
function rainette_upgrade($nom_meta_base_version, $version_cible) {
$maj['create'] = array();
// A la création on initialise la configuration complète (technique + services)
$maj['create'] = array(
array('rainette_configurer'),
);
// Ajout de la configuration du nouveau service Meteo Concept
$maj['3'] = array(
array('configuration_service_charger', 'meteoc'),
);
include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj);
// Initialisation de la configuration : c'est la seule chose à faire à chaque mise à jour de schéma.
rainette_configurer();
}
@ -51,7 +56,7 @@ function rainette_vider_tables($nom_meta_base_version) {
// - la meta de stockage des informations de dernière exécution de chaque service
effacer_meta('rainette_execution');
// - la configuration utilisateur de chaque service
// effacer_meta('rainette');
effacer_meta('rainette');
// - la meta de schéma
effacer_meta($nom_meta_base_version);
}

104
rainette_fonctions.php

@ -14,7 +14,7 @@ if (!defined('_RAINETTE_ICONES_PETITE_TAILLE')) {
define('_RAINETTE_ICONES_PETITE_TAILLE', 28);
}
// Balises du plugin utilisables dans les squelettes et modèles
/**
* @param $p
*
@ -91,10 +91,10 @@ function rainette_afficher_icone($icone, $taille = 'petit', $options = array())
$source = $icone['source'];
// On retaille si nécessaire l'image pour qu'elle soit toujours de la même taille (grande ou petite).
// -- calcul de la taille de l'image
list($largeur, $hauteur) = @getimagesize($source);
include_spip('filtres/images_transforme');
// Calcul de la taille maximale de l'icone
// -- calcul de la taille maximale de l'icone
if ($taille == 'petit') {
$taille_max = _RAINETTE_ICONES_PETITE_TAILLE;
} elseif ($taille == 'grand') {
@ -103,14 +103,47 @@ function rainette_afficher_icone($icone, $taille = 'petit', $options = array())
$taille_max = intval($taille);
}
if (($largeur < $taille_max) or ($hauteur < $taille_max)) {
include_spip('filtres/images_transforme');
if (
($largeur < $taille_max)
and ($hauteur < $taille_max)
) {
// Image plus petite que celle par défaut :
// --> Il faut insérer et recadrer l'image dans une image plus grande à la taille par défaut
$source = extraire_attribut(image_recadre($source, $taille_max, $taille_max, 'center', 'transparent'), 'src');
} elseif (($largeur > $taille_max) or ($hauteur > $taille_max)) {
$source = extraire_attribut(
image_recadre(
$source,
$taille_max,
$taille_max,
'center',
'transparent'
),
'src'
);
} else {
// Si l'image n'est pas carrée on la recadre
if ($largeur !== $hauteur) {
$source = extraire_attribut(
image_recadre(
$source,
max($largeur, $hauteur),
max($largeur, $hauteur),
'center',
'transparent'
),
'src'
);
}
// Image plus grande que celle par défaut :
// --> Il faut réduire l'image à la taille par défaut
$source = extraire_attribut(image_reduire($source, $taille_max), 'src');
$source = extraire_attribut(
image_reduire(
$source,
$taille_max
),
'src'
);
}
// On construit la balise img
@ -123,25 +156,23 @@ function rainette_afficher_icone($icone, $taille = 'petit', $options = array())
}
/**
* Affiche le résumé fourni par le service ou calculé à partir d'un item de langue.
*
* A partir de la version 4.1.0, le résumé est toujours une chaine, le code météo n'est plus passé à la fonction même
* si le service ne fournit pas de résumé. Dans ce cas, c'est la fonction de complément du service qui calcule le résumé.
*
* @package RAINETTE/AFFICHAGE
*
* @api
* @filtre
*
* @param int|string $resume
* @param string $resume Résumé météo déjà fourni ou calculé par le service dans la langue de l'interface
*
* @return string
*/
function rainette_afficher_resume($resume) {
if (is_numeric($resume)) {
// On utilise l'option de _T permettant de savoir si un item existe ou pas
$texte = _T('rainette:meteo_' . $resume, array(), array('force' => false));
if (!$texte) {
$texte = _T('rainette:meteo_na') . " (${resume})";
}
} else {
$texte = $resume ? $resume : _T('rainette:meteo_na');
}
$texte = $resume ? $resume : _T('rainette:meteo_na');
return ucfirst($texte);
}
@ -185,12 +216,10 @@ function rainette_afficher_direction($direction) {
* @api
* @filtre
*
* @param string $tendance_en
* Texte anglais représentant la tendance et récupérée par le service.
* @param string $methode
* Methode d'affichage de la tendance qui prend les valeurs:
* - `texte` : pour afficher un texte en clair décrivant la tendance (méthode par défaut).
* - `symbole` : pour afficher un symbole de flèche (1 caractère) décrivant la tendance.
* @param string|null $tendance_en Texte anglais représentant la tendance et récupérée par le service.
* @param string $methode Methode d'affichage de la tendance qui prend les valeurs:
* - `texte` : pour afficher un texte en clair décrivant la tendance (méthode par défaut).
* - `symbole` : pour afficher un symbole de flèche (1 caractère) décrivant la tendance.
*
* @return string
*/
@ -199,7 +228,7 @@ function rainette_afficher_tendance($tendance_en, $methode = 'texte') {
// Certains textes sont composés de plusieurs mots comme "falling rapidly".
// On en fait un texte unique en remplaçant les espaces par des underscores.
$tendance_en = str_replace(' ', '_', trim($tendance_en));
$tendance_en = str_replace(' ', '_', trim((string) $tendance_en));
if (($tendance_en) and ($texte = _T("rainette:tendance_texte_${tendance_en}", array(), array('force' => false)))) {
if ($methode == 'texte') {
@ -220,14 +249,11 @@ function rainette_afficher_tendance($tendance_en, $methode = 'texte') {
* @api
* @filtre
*
* @param int/float $valeur
* La valeur à afficher
* @param string $type_donnee
* Type de données à afficher parmi 'temperature', 'pourcentage', 'angle', 'pression',
* @param int|float $valeur La valeur à afficher
* @param string $type_donnee Type de données à afficher parmi 'temperature', 'pourcentage', 'angle', 'pression',
* 'distance', 'vitesse', 'population', 'precipitation'.
* @param int $precision
* Nombre de décimales à afficher pour les réels uniquement ou -1 pour utiliser le défaut.
* @param string $service
* @param int $precision Nombre de décimales à afficher pour les réels uniquement ou -1 pour utiliser le défaut.
* @param string $service Identifiant du service utilisé. Si non fourni, on prend le service par défaut
*
* @return string
* La chaine calculée ou le texte désignant une valeur indéterminée ou vide si la valeur est null.
@ -287,6 +313,11 @@ function rainette_afficher_unite($valeur, $type_donnee = '', $precision = -1, $s
return $valeur_affichee;
}
/**
* @param $service
*
* @return mixed|string|null
*/
function rainette_afficher_service($service) {
// On renvoie le nom du service ou a défaut son id.
@ -296,6 +327,9 @@ function rainette_afficher_service($service) {
}
/**
* @return string
*/
function rainette_service_defaut() {
return _RAINETTE_SERVICE_DEFAUT;
@ -400,11 +434,9 @@ function rainette_lister_themes($service, $source = 'local') {
if (strtolower($source) == 'api') {
// Certains services proposent des thèmes d'icones accessibles via l'API.
// C'est le cas de wunderground.
if (in_array($service, array('wunderground', 'owm'))) {
$cles = $service == 'wunderground'
? array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k')
: array('n2x', 'n1x', 'o1x');
// C'est le cas de owm.
if ($service == 'owm') {
$cles = array('n2x', 'n1x', 'o1x');
foreach ($cles as $_cle) {
$themes[$service][$source][$_cle] = _T("rainette:label_theme_${service}_${_cle}");
}

25
rainette_ieconfig_metas.php

@ -0,0 +1,25 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* @param $table
*
* @return array
*/
function rainette_ieconfig_metas($table){
$prefixe = 'rainette';
include_spip('inc/filtres');
$informer = charger_filtre('info_plugin');
$nom = $informer($prefixe, 'nom', true);
$table['rainette']['titre'] = $nom;
$table['rainette']['icone'] = "$prefixe-16.png";
$table['rainette']['metas_serialize'] = $prefixe;
return $table;
}

BIN
rainette_logo-64.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

10
rainette_pipelines.php

@ -5,6 +5,11 @@ if (!defined('_ECRIRE_INC_VERSION')) {
}
// Insertion des css de Rainette
/**
* @param $flux
*
* @return mixed|string
*/
function rainette_insert_head_css($flux) {
static $done = false;
if (!$done) {
@ -15,6 +20,11 @@ function rainette_insert_head_css($flux) {
return $flux;
}
/**
* @param $flux
*
* @return string
*/
function rainette_insert_head($flux) {
// au cas ou il n'est pas implemente
$flux .= rainette_insert_head_css($flux);

3
services/accuweather.php

@ -231,8 +231,7 @@ function etat2resume_accuweather(&$tableau, $configuration) {
if ($configuration['condition'] == $configuration['alias']) {
// On affiche l'icône natif fourni par le service et désigné par son url
// en faisant une copie locale dans IMG/.
include_spip('inc/distant');
$tableau['icone']['source'] = copie_locale($tableau['icon_meteo']);
// --> pas disponible actuellement pour Accuweather
} else {
include_spip('inc/rainette_normaliser');
if ($configuration['condition'] == "{$configuration['alias']}_local") {

4
services/accuweather.yaml

@ -7,7 +7,7 @@
# - previsions : la configuration du mash-up pour les prévisions
# - erreurs : la configuration du mash-up pour les erreurs fournies par le service
#
# Si un champ vaut la valeur par défaut il est possible de l'omettre.
# Si un champ vaut la valeur par défaut il est possible de l'omettre (souvent en commentaire).
# -----------------------------------------------------------------------------------------------
# Bloc service : caractéristiques du service
@ -80,7 +80,7 @@ service:
defauts:
#inscription: ''
#unite: 'm'
#condition: 'accuweather'
condition: 'accuweather_local'
theme: ''
theme_local: 'original'
#theme_weather: 'sticker'

271
services/meteoc.php

@ -0,0 +1,271 @@
<?php
/**
* Ce fichier contient la configuration et l'ensemble des fonctions implémentant le service Méteo-Concept (meteoc).
* Ce service est capable de fournir des données au format JSON ou XML.
*
* @package SPIP\RAINETTE\SERVICES\METEOC
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
// ------------------------------------------------------------------------------------------------
// Les fonctions qui suivent définissent l'API standard du service et sont appelées par la fonction
// unique de chargement des données météorologiques `meteo_charger()`.
// ------------------------------------------------------------------------------------------------
/**
* Construit l'url de la requête correspondant au lieu, au type de données et à la configuration utilisateur
* du service (par exemple, le code d'inscription, le format des résultats...).
*
* @api
* @uses lieu_normaliser()
*
* @param string $lieu
* Lieu pour lequel on acquiert les données météorologiques.
* @param string $mode
* Type de données météorologiques. Les valeurs possibles sont `infos`, `conditions` ou `previsions`.
* @param int $periodicite
* La périodicité horaire des prévisions :
* - `24`, `12`, `6`, `3` ou `1`, pour le mode `previsions`
* - `0`, pour les modes `conditions` et `infos`
* @param array $configuration
* Configuration complète du service, statique et utilisateur.
*
* @return string
* URL complète de la requête.
*/
function meteoc_service2url($lieu, $mode, $periodicite, $configuration) {
// On normalise le lieu et on récupère son format.
// Le service accepte les coordonnées et la code INSEE
$lieu_normalise = lieu_normaliser($lieu, $format_lieu);
if ($format_lieu == 'latitude_longitude') {
$query = "latlng=${lieu_normalise}";
} else {
// Format INSEE
$query = "insee=${lieu_normalise}";
}
// On construit le mode
if ($mode === 'infos') {
$demande = 'location/city';
// On demande de considérer les pays étrangers si on identifie la ville par ses coordonnées
if ($format_lieu == 'latitude_longitude') {
$query .= '&world=true';
}
} elseif ($mode === 'conditions') {
$demande = 'observations/around';
} else {
$demande = 'forecast/daily';
}
return
$configuration['endpoint_requete']
. $demande
. '?token=' . $configuration['inscription']
. '&' . $query;
}
/**
* @param array $erreur
*
* @return bool
*/
function meteoc_erreur_verifier($erreur) {
// Initialisation
$est_erreur = false;
// Une erreur est uniquement décrite par un message.
if (!empty($erreur['message'])) {
$est_erreur = true;
}
return $est_erreur;
}
/**
* Complète par des données spécifiques au service le tableau des informations issu
* uniquement de la lecture du flux.
*
* @api
*
* @param array $tableau
* Tableau standardisé des conditions contenant uniquement les données fournies sans traitement
* par le service.
* @param array $configuration
* Configuration complète du service, statique et utilisateur.
*
* @return array
* Tableau standardisé des conditions météorologiques complété par les données spécifiques
* du service.
*/
function meteoc_complement2infos($tableau, $configuration) {
if ($tableau) {
if (empty($tableau['pays'])) {
// France : le pays n'est pas précisé, on le rajoute
$tableau['pays'] = 'France';
$tableau['pays_iso2'] = 'FR';
} else {
// Pays limitrophes : Belgique, Luxembourg et Andorre. On rajoute l'ISO alpha-2
$pays = strtolower($tableau['pays']);
switch($pays) {
case 'belgique':
$tableau['pays_iso2'] = 'BE';
break;
case 'luxembourg':
$tableau['pays_iso2'] = 'LU';
break;
case 'andorre':
$tableau['pays_iso2'] = 'AD';
break;
}
}
}
return $tableau;
}
/**
* Complète par des données spécifiques au service le tableau des conditions issu
* uniquement de la lecture du flux.
*
* @api
*
* @param array $tableau
* Tableau standardisé des conditions contenant uniquement les données fournies sans traitement
* par le service.
* @param array $configuration
* Configuration complète du service, statique et utilisateur.
*
* @return array
* Tableau standardisé des conditions météorologiques complété par les données spécifiques
* du service.
*/
function meteoc_complement2conditions($tableau, $configuration) {
if ($tableau) {
include_spip('inc/rainette_convertir');
// Calcul de la direction du vent (16 points), celle-ci n'étant pas fournie nativement par owm
$tableau['direction_vent'] = angle2direction($tableau['angle_vent']);
// Calcul de la température ressentie
$tableau['temperature_ressentie'] = temperature2ressenti(
$tableau['temperature_reelle'],
$tableau['vitesse_vent']
);
// Conversion en système impérial
// --> Etant donné que le service ne concerne que les pays France, Luxembourg, Belgique et Andorre, on
// ne propose pas la conversion en système impérial.
// Compléter le tableau standard avec les états météorologiques calculés
etat2resume_meteoc($tableau, $configuration);
}
return $tableau;
}
/**
* Complète par des données spécifiques au service le tableau des prévisions issu
* uniquement de la lecture du flux.
*
* @api
*
* @param array $tableau
* Tableau standardisé des conditions contenant uniquement les données fournies sans traitement
* par le service.
* @param array $configuration
* Configuration complète du service, statique et utilisateur.
* @param int $index_periode
* Index où trouver et ranger les données. Cet index n'est pas utilisé pour les conditions
*
* @return array
* Tableau standardisé des conditions météorologiques complété par les données spécifiques
* du service.
*/
function meteoc_complement2previsions($tableau, $configuration, $index_periode) {
if (($tableau) and ($index_periode > -1)) {
include_spip('inc/rainette_convertir');
// Calcul de la direction du vent (16 points), celle-ci n'étant pas fournie nativement par owm
$tableau['direction_vent'] = angle2direction($tableau['angle_vent']);
// Conversion en système impérial
// --> Etant donné que le service ne concerne que les pays France, Luxembourg, Belgique et Andorre, on
// ne propose pas la conversion en système impérial.
// Compléter le tableau standard avec les états météorologiques calculés
etat2resume_meteoc($tableau, $configuration);
}
return $tableau;
}
/**
* ---------------------------------------------------------------------------------------------
* Les fonctions qui suivent sont des utilitaires uniquement appelées par les fonctions de l'API
* ---------------------------------------------------------------------------------------------
*/
/**
* Calcule les états en fonction des états météorologiques natifs fournis par le service.
*
* @internal
*
* @param array $tableau
* Tableau standardisé des conditions contenant uniquement les données fournies sans traitement
* par le service. Le tableau est mis à jour et renvoyé à l'appelant.
* @param array $configuration
* Configuration complète du service, statique et utilisateur.
*
* @return void
*/
function etat2resume_meteoc(&$tableau, $configuration) {
if ($tableau['code_meteo']) {
// Determination de l'indicateur jour/nuit qui permet de choisir le bon icone
// Pour ce service aucun indicateur n'est disponible, on positionne la période à 0 tout le temps
$tableau['periode'] = 0;
// Détermination du résumé à afficher:
// - Meteo-Concept ne fourni pas de résumé dans l'API, seul le code est fourni. Rainette construit donc
// un fichier de langue spécifique initialisé en français par le tableau fourni par le service.
$tableau['resume'] = _T('meteoc:meteo_' . $tableau['code_meteo']);
// Determination de l'icone qui sera affiché.
// -- on stocke le code afin de le fournir en alt dans la balise img
$tableau['icone'] = array();
$tableau['icone']['code'] = $tableau['code_meteo'];
// -- on calcule le chemin complet de l'icone.
if ($configuration['condition'] == $configuration['alias']) {
// On affiche l'icône natif fourni par le service et désigné par son url
// en faisant une copie locale dans IMG/.
// --> pas disponible actuellement pour Méteo-Concept
} else {
include_spip('inc/rainette_normaliser');
if ($configuration['condition'] == "{$configuration['alias']}_local") {
// On affiche un icône d'un thème local compatible avec Méteo-Concept.
// --> pas disponible actuellement pour Méteo-Concept
} else {
// On affiche l'icône correspondant au code météo transcodé dans le système weather.com.
$chemin = icone_weather_normaliser(
$tableau['code_meteo'],
$configuration['theme_weather'],
$configuration['transcodage_weather'],
$tableau['periode']
);
}
include_spip('inc/utils');
$tableau['icone']['source'] = find_in_path($chemin);
}
}
}

312
services/meteoc.yaml

@ -0,0 +1,312 @@
# Template du YAML de configuration du service <nom> (<id>)
# -----------------------------------------------------------------------------------------------
#
# Il est composé de 5 blocs, à savoir :
# - service : la configuration du service lui-même, son titre, son id, ses caractéristiques...
# - infos : la configuration du mash-up pour les informations sur le lieu de la météo
# - conditions : la configuration du mash-up pour les conditions temps réel
# - previsions : la configuration du mash-up pour les prévisions
# - erreurs : la configuration du mash-up pour les erreurs fournies par le service
#
# Si un champ vaut la valeur par défaut il est possible de l'omettre.
# -----------------------------------------------------------------------------------------------
# Bloc service : caractéristiques du service
# ------------------------------------------
service:
# -- Identification: saisir le nom complet du service
nom: 'Meteo Concept'
# -- URL de base des requêtes et des icones (éventuellement)
endpoint_requete: 'https://api.meteo-concept.com/api/'
endpoint_icone: ''
# -- Activité: par défaut à true, donc à laisser en commentaire. A mettre à false si on veut déprécier le service
actif: true
# -- Liens vers les crédits et titre de la page (pour les affichages / modèles)
# Le logo, si il existe, est chargé automatiquement à partir du chemin /services/images/<id>.png
credits:
titre: 'Credits'
lien: 'https://api.meteo-concept.com/'
# -- Liens vers les termes d'utilisation (pour la page de configuration)
termes:
titre: 'Conditions générales de vente'
lien: 'https://api.meteo-concept.com/cgv'
# -- Liens la page d'enregistrement (pour la page de configuration)
enregistrement:
titre: 'Inscription'
lien: 'https://api.meteo-concept.com/register/'
# -- Taille de la clé d'enregistrement en général de 32 caractères (valeur par défaut)
taille_cle: 64
# -- Liens vers les offres de service (pour la page de configuration et les rafraichissements)
offres:
titre: 'Tarifs'
lien: 'https://api.meteo-concept.com/pricing'
# -- Indique si il existe une offre gratuite.
#gratuite: true
# -- Les limites sont exprimées via les périodes year, month, day, hour, minute et second dans cet ordre.
# Seules les périodes utilisées sont à fournir.
limites: { day: 500 }
# -- Liste des langues fournies par le service
langues:
# -- langues dont le code est identique à celui de SPIP: par défaut initialisé au singleton 'en' qui est aussi la
# valeur par défaut
codes_spip: [ 'fr' ]
# -- langues dont le code est différent de celui de SPIP.
# Le champ est rempli par la liste des couples (code service, code spip)
codes_non_spip: {}
# -- langage par défaut est 'en'.
defaut: 'fr'
# -- Transcodage du code méteo retourné par le service avec ceux de Weather. Ceci permet d'utiliser les nombreux
# jeux d'icones existant.
# Chaque code méteo est associé à un tableau [x, y] où x est le code Weather jour et y le code Weather nuit
transcodage_weather:
0: [ 32, 31 ]
1: [ 34, 33 ]
2: [ 30, 29 ]
3: [ 28, 27 ]
4: [ 26, 26 ]
5: [ 26, 26 ]
6: [ 20, 20 ]
7: [ 20, 20 ]
10: [ 12, 12 ]
11: [ 12, 12 ]
12: [ 12, 12 ]
13: [ 10, 10 ]
14: [ 10, 10 ]
15: [ 10, 10 ]
16: [ 9, 9 ]
20: [ 16, 16 ]
21: [ 16, 16 ]
22: [ 16, 16 ]
30: [ 5, 5 ]
31: [ 5, 5 ]
32: [ 5, 5 ]
40: [ 11, 11 ]
41: [ 11, 11 ]
42: [ 40, 40 ]
43: [ 11, 11 ]
44: [ 11, 11 ]
45: [ 40, 40 ]
46: [ 11, 11 ]
47: [ 11, 11 ]
48: [ 40, 40 ]
60: [ 14, 46 ]
61: [ 14, 46 ]
62: [ 42, 42 ]
63: [ 14, 46 ]
64: [ 14, 46 ]
65: [ 42, 42 ]
66: [ 14, 46 ]
67: [ 14, 46 ]
68: [ 42, 42 ]