Changeset 108245 in spip-zone


Ignore:
Timestamp:
Dec 29, 2017, 5:09:44 PM (17 months ago)
Author:
eric@…
Message:

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

Location:
_plugins_/rainette/trunk
Files:
369 added
2 deleted
15 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/rainette/trunk/formulaires/configurer_rainette_service.html

    r108194 r108245  
    1616                        <div class="editer-groupe">
    1717                                #SET{type_cle, obligatoire}
    18                                 [(#SET{url, [<a class="spip_out"[ href="(#ENV{configuration/enregistrement/lien})"] target="_blank">(#ENV{configuration/enregistrement/titre})</a>]})]
     18                                [(#SET{url, [<a class="spip_out"[ href="(#ENV{_configuration/enregistrement/lien})"] target="_blank">(#ENV{_configuration/enregistrement/titre})</a>]})]
    1919                                [(#SET{explication, #VAL{rainette:explication_configurer_cle_}
    2020                                        |concat{#GET{type_cle}}
     
    2424                                        label=<:rainette:label_cle:>,
    2525                                        obligatoire=oui,
    26                                         size=#ENV{configuration/enregistrement/taille_cle},
    27                                         maxlength=#ENV{configuration/enregistrement/taille_cle}
     26                                        size=#ENV{_configuration/enregistrement/taille_cle},
     27                                        maxlength=#ENV{_configuration/enregistrement/taille_cle}
    2828                                })]
    2929                        </div>
     
    4141                                })]
    4242
    43                         [(#ENV{service}|=={weather}|non)
    44                                 [(#REM) <!-- Configuration du système d'icônes à utiliser (sauf pour weather) --> ]
    45                                 [(#SAISIE{radio, condition,
    46                                         datas=#ARRAY{#ENV{service}, <:rainette:label_icone_natif:>, weather, <:rainette:label_icone_weather:>},
    47                                         disable=#ARRAY{#ENV{service}, 0, weather, #ENV{service}|in_array{#LISTE{wunderground, weatherbit, apixu, owm}}},
    48                                         explication=<:rainette:explication_configurer_icone:>,
    49                                         label=<:rainette:label_icone:>,
    50                                 })]
    51                         ]
     43                                [(#ENV{service}|=={weather}|non)
     44                                        [(#REM) <!-- Configuration du système d'icônes à utiliser (sauf pour weather) --> ]
     45                                        [(#SET{data,
     46                                                [(#ARRAY{#ENV{service}, <:rainette:label_icone_natif:>,
     47                                                [(#ENV{service})_local], <:rainette:label_icone_local:>,
     48                                                weather, <:rainette:label_icone_weather:>})]})]
     49                                        [(#SET{disable,
     50                                                [(#ARRAY{#ENV{service}, 0,
     51                                                [(#ENV{service})_local], [(#ENV{_themes/locaux}|non)],
     52                                                weather, [(#ENV{_themes/weather}|non)]})]})]
     53                                        [(#SAISIE{radio, condition,
     54                                                datas=#GET{data},
     55                                                disable=#GET{disable},
     56                                                explication=<:rainette:explication_configurer_icone:>,
     57                                                label=<:rainette:label_icone:>,
     58                                        })]
     59                                ]
    5260
    53                                 [(#REM) <!-- Configuration du thème d'icônes à utiliser (wunderground) --> ]
    54                                 #SET{themes, #ENV{service}|rainette_lister_themes}
    55                         [(#GET{themes}|oui)
    56                                 [(#SAISIE{radio, theme,
    57                                         datas=#GET{themes},
    58                                         explication=<:rainette:explication_configurer_theme:>,
    59                                         label=<:rainette:label_theme:>,
    60                                 })]
    61                         ]
     61                                [(#REM) <!-- Configuration du thème d'icônes distant à utiliser pour le service --> ]
     62                                [(#ENV{_themes/distants}|oui)
     63                                        [(#SAISIE{radio, theme,
     64                                                datas=#ENV{_themes/distants},
     65                                                explication=<:rainette:explication_configurer_theme:>,
     66                                                label=<:rainette:label_theme:>,
     67                                        })]
     68                                ]
     69
     70                                [(#REM) <!-- Configuration du thème d'icônes local à utiliser pour le service --> ]
     71                                [(#ENV{_themes/locaux}|oui)
     72                                        [(#SAISIE{radio, theme_local,
     73                                                datas=#ENV{_themes/locaux},
     74                                                explication=<:rainette:explication_configurer_theme:>,
     75                                                label=<:rainette:label_theme:>,
     76                                        })]
     77                                ]
     78
     79                                [(#REM) <!-- Configuration du thème d'icônes local du service weather à utiliser pour le service --> ]
     80                                [(#ENV{_themes/weather}|oui)
     81                                        [(#SAISIE{radio, theme_weather,
     82                                                datas=#ENV{_themes/weather},
     83                                                explication=<:rainette:explication_configurer_theme:>,
     84                                                label=<:rainette:label_theme:>,
     85                                        })]
     86                                ]
    6287                        </div>
    6388                </fieldset>
     
    6590                <fieldset>
    6691                        <legend><:rainette:legende_configurer_utilisation:></legend>
    67                         [(#SET{url, [<a class="spip_out"[ href="(#ENV{configuration/offres/lien})"] target="_blank">(#ENV{configuration/offres/titre})</a>]})]
     92                        [(#SET{url, [<a class="spip_out"[ href="(#ENV{_configuration/offres/lien})"] target="_blank">(#ENV{_configuration/offres/titre})</a>]})]
    6893                        [<p>(#VAL{rainette:explication_utilisation_}|concat{#ENV{service}}|_T{#ARRAY{url, #GET{url}}})</p>]
    69                         [(#ENV{configuration/offres/limites}|oui)<p><:rainette:explication_utilisation_rainette:></p>]
     94                        [(#ENV{_configuration/offres/limites}|oui)<p><:rainette:explication_utilisation_rainette:></p>]
    7095                        <table>
    7196                                <tbody>
    7297                                        <tr>
    7398                                                <td><:rainette:label_dernier_appel:></td>
    74                                                 <td>[(#ENV{utilisation/dernier_appel})]</td>
     99                                                <td>[(#ENV{_utilisation/dernier_appel})]</td>
    75100                                        </tr>
    76                                 <BOUCLE_compteurs(DATA) {source table, #ENV{utilisation/compteurs}}>
     101                                <BOUCLE_compteurs(DATA) {source table, #ENV{_utilisation/compteurs}}>
    77102                                        <tr>
    78103                                                <td>[(#VAL{rainette:label_compteur_}|concat{#CLE}|_T)]</td>
    79                                                 <td>[[<strong>(#VALEUR)</strong>] / (#ENV{configuration/offres/limites/#CLE})]</td>
     104                                                <td>[[<strong>(#VALEUR)</strong>] / (#ENV{_configuration/offres/limites/#CLE})]</td>
    80105                                        </tr>
    81106                                </BOUCLE_compteurs>
     
    86111                <fieldset>
    87112                        <legend><:rainette:legende_configurer_credit:></legend>
    88                         [(#SET{url, [<a class="spip_out"[ href="(#ENV{configuration/termes/lien})"] target="_blank">(#ENV{configuration/termes/titre})</a>]})]
     113                        [(#SET{url, [<a class="spip_out"[ href="(#ENV{_configuration/termes/lien})"] target="_blank">(#ENV{_configuration/termes/titre})</a>]})]
    89114                        [<p>(#VAL{rainette:explication_credit_}|concat{#ENV{service}}|_T{#ARRAY{url, #GET{url}}})</p>]
    90115                        <p><:rainette:explication_credit_rainette:></p>
     
    101126//<![CDATA[
    102127        jQuery(document).ready(function() {
    103                 [(#ENV{condition, weather}|=={weather}|oui)
     128                [(#ENV{condition}|=={weather}|oui)
    104129                        jQuery(".editer_theme").hide();
     130                        jQuery(".editer_theme_local").hide();
     131                ]
     132                [(#ENV{condition}|=={#ENV{service}}|oui)
     133                        jQuery(".editer_theme_local").hide();
     134                        jQuery(".editer_theme_weather").hide();
     135                ]
     136                [(#ENV{condition}|=={[(#ENV{service})_local]}|oui)
     137                        jQuery(".editer_theme").hide();
     138                        jQuery(".editer_theme_weather").hide();
    105139                ]
    106140                jQuery("input[name='condition']").change(function() {
    107                         if (jQuery("input[name='condition']:checked").val() == 'wunderground') {
     141                        if (jQuery("input[name='condition']:checked").val() == ['(#ENV{service})']) {
     142                                jQuery(".editer_theme_local").hide();
     143                                jQuery(".editer_theme_weather").hide();
    108144                                jQuery(".editer_theme").show();
    109                         }
    110                         else {
     145                        } else if (jQuery("input[name='condition']:checked").val() == 'weather') {
    111146                                jQuery(".editer_theme").hide();
     147                                jQuery(".editer_theme_local").hide();
     148                                jQuery(".editer_theme_weather").show();
     149                        } else {
     150                                jQuery(".editer_theme").hide();
     151                                jQuery(".editer_theme_weather").hide();
     152                                jQuery(".editer_theme_local").show();
    112153                        }
    113154                        jQuery(this).blur();
  • _plugins_/rainette/trunk/formulaires/configurer_rainette_service.php

    r108194 r108245  
    3333        $valeurs['service'] = $service;
    3434        $valeurs['nom'] = $configuration['nom'];
    35         $valeurs['configuration']['termes'] = $configuration['termes'];
    36         $valeurs['configuration']['enregistrement'] = $configuration['enregistrement'];
    37         $valeurs['configuration']['offres'] = $configuration['offres'];
     35        $valeurs['_configuration']['termes'] = $configuration['termes'];
     36        $valeurs['_configuration']['enregistrement'] = $configuration['enregistrement'];
     37        $valeurs['_configuration']['offres'] = $configuration['offres'];
    3838
    3939        // Ajout des informations d'utilisation du service
    4040        include_spip('inc/config');
    4141        $execution = lire_config("rainette_execution/${service}", array());
    42         $valeurs['utilisation']['dernier_appel'] = isset($execution['dernier_appel'])
     42        $valeurs['_utilisation']['dernier_appel'] = isset($execution['dernier_appel'])
    4343                ? $execution['dernier_appel']
    4444                : '';
    45         $valeurs['utilisation']['compteurs'] = isset($execution['compteurs'])
     45        $valeurs['_utilisation']['compteurs'] = isset($execution['compteurs'])
    4646                ? $execution['compteurs']
     47                : array();
     48
     49        // Gestion des thèmes locaux et distants.
     50        $valeurs['_themes']['distants'] = rainette_lister_themes($service, 'api');
     51        $valeurs['_themes']['locaux'] = rainette_lister_themes($service, 'local');
     52        $valeurs['_themes']['weather'] = !in_array($service, array('weather', 'owm', 'weatherbit'))
     53                ? rainette_lister_themes('weather', 'local')
    4754                : array();
    4855
  • _plugins_/rainette/trunk/inc/meteo_charger.php

    r108182 r108245  
    258258                $extras['config'] = array_merge(
    259259                        $configuration_utilisateur,
    260                         array('source' => normaliser_configuration_donnees($mode, $configuration['donnees'])),
     260                        array('source' => configuration_donnees_normaliser($mode, $configuration['donnees'])),
    261261                        array('nom_service' => $configuration['nom'])
    262262                );
  • _plugins_/rainette/trunk/inc/rainette_normaliser.php

    r108194 r108245  
    758758}
    759759
     760/**
     761 * @param $mode
     762 * @param $configuration
     763 *
     764 * @return array
     765 */
     766function configuration_donnees_normaliser($mode, $configuration) {
     767
     768        $configuration_normalisee = array();
     769
     770        foreach ($GLOBALS['rainette_config'][$mode] as $_donnee => $_configuration) {
     771                if ($_configuration['origine'] == 'service') {
     772                        $configuration_normalisee[$_donnee] = !empty($configuration[$_donnee]['cle']) ? true : false;
     773                }
     774        }
     775
     776        return $configuration_normalisee;
     777}
    760778
    761779/**
     
    781799}
    782800
    783 
    784 /**
    785  * @param $mode
    786  * @param $configuration
    787  *
    788  * @return array
    789  */
    790 function normaliser_configuration_donnees($mode, $configuration) {
    791 
    792         $configuration_normalisee = array();
    793 
    794         foreach ($GLOBALS['rainette_config'][$mode] as $_donnee => $_configuration) {
    795                 if ($_configuration['origine'] == 'service') {
    796                         $configuration_normalisee[$_donnee] = !empty($configuration[$_donnee]['cle']) ? true : false;
    797                 }
    798         }
    799 
    800         return $configuration_normalisee;
    801 }
     801/**
     802 * @param int|string $code_meteo
     803 * @param string     $theme
     804 * @param array      $transcodage
     805 * @param int        $periode
     806 *
     807 * @return string
     808 */
     809function icone_weather_normaliser($code_meteo, $theme, $transcodage = array(), $periode = 0) {
     810
     811        // Si le transcodage échoue ou que le code weather est erroné on renvoie toujours N/A.
     812        $icone = 'na';
     813
     814        // Transcodage en code weather.com.
     815        $code = is_string($code_meteo) ? strtolower($code_meteo) : intval($code_meteo);
     816        if ($transcodage) {
     817                // Service différent de weather.com
     818                if (array_key_exists($code, $transcodage) and isset($transcodage[$code][$periode])) {
     819                        $icone = strval($transcodage[$code][$periode]);
     820                }
     821        } else {
     822                // Service weather.com
     823                if (($code >= 0) and ($code < 48)) {
     824                        $icone = strval($code);
     825                }
     826        }
     827
     828        // Construction du chemin complet de l'icone.
     829        $chemin = icone_local_normaliser("${icone}.png",'weather', $theme);
     830
     831        return $chemin;
     832}
     833
     834/**
     835 * @param string $icone
     836 * @param string $service
     837 * @param string $theme
     838 * @param string $periode
     839 *
     840 * @return string
     841 */
     842function icone_local_normaliser($icone, $service, $theme = '', $periode = '') {
     843
     844        // On initialise le dossier de l'icone pour le service demandé.
     845        $chemin = "themes/${service}";
     846        // Si on demande un thème il faut créer le sous-dossier.
     847        if ($theme) {
     848                $chemin .= "/${theme}";
     849        }
     850        // Si le service gère des icones suivant le jour ou la nuit il faut ajouter le sous-dossier concerné.
     851        if ($periode) {
     852                $chemin .= "/${periode}";
     853        }
     854        // On finalise le chemin complet avec le nom de l'icone sauf si on ne veut que le dossier.
     855        if ($icone) {
     856                $chemin .= "/${icone}";
     857        }
     858
     859        return $chemin;
     860}
  • _plugins_/rainette/trunk/lang/rainette_fr.php

    r108194 r108245  
    100100        'label_compteur_hour' => 'Compteur heure',
    101101        'label_compteur_minute' => 'Compteur minute',
    102         'label_icone_natif' => 'Utilisation de l\'icône fourni par ce service',
    103         'label_icone_weather' => 'Utilisation d\'un icône issu du service weather.com&reg; (nécessite une conversion approximative de la condition)',
     102        'label_icone_local' => 'Utilisation d\'un icône issu d\'un thème disponible localement et compatible avec ce service',
     103        'label_icone_natif' => 'Utilisation de l\'icône fourni par l\'API du service',
     104        'label_icone_weather' => 'Utilisation d\'un icône issu d\'un thème du service weather.com&reg; disponible localement',
    104105        'label_icone' => 'Système d\'icônes',
    105106        'label_dernier_appel' => 'Dernier appel',
  • _plugins_/rainette/trunk/paquet.xml

    r108194 r108245  
    22        prefix="rainette"
    33        categorie="divers"
    4         version="3.4.6"
     4        version="3.5.0"
    55        etat="stable"
    66        compatibilite="]3.1.3;3.2.*]"
  • _plugins_/rainette/trunk/prive/squelettes/navigation/configurer_rainette.html

    r108182 r108245  
    44#BOITE_FERMER
    55
     6<ul class="liste-items sous_navigation">
    67[(#REM) <!-- Navigation dans les pages de configuration --> ]
    7 <ul class="liste-items sous_navigation">
    88<BOUCLE_navigation_cfg(DATA){source table, #VAL{tableau}|rainette_lister_services}{par cle}>
    99        [<li class="item">
     
    1414        </li>]
    1515</BOUCLE_navigation_cfg>
     16
     17[(#REM) <!-- Navigation dans la page de visualisation des thèmes d'icônes --> ]
     18[(#PLUGIN{RAINETTETHEME}|oui)
     19        [<li class="item">
     20        (#URL_ECRIRE{themer_rainette}
     21                |lien_ou_expose{
     22                        <:rainette:titre_page_themer:>,
     23                        [(#ENV{exec}|=={themer_rainette})]})
     24        </li>]
     25]
    1626</ul>
  • _plugins_/rainette/trunk/rainette.css

    r102861 r108245  
    5858}
    5959.rainette_conditions .resume {
     60        float: left;
    6061        text-align: center;
    6162        font-weight: bold;
  • _plugins_/rainette/trunk/rainette_fonctions.php

    r108193 r108245  
    55}
    66
    7 if (!defined('_RAINETTE_ICONES_PATH')) {
    8         define('_RAINETTE_ICONES_PATH', 'rainette/');
    9 }
    107if (!defined('_RAINETTE_ICONES_GRANDE_TAILLE')) {
    118        define('_RAINETTE_ICONES_GRANDE_TAILLE', 110);
     
    3734
    3835/**
    39  * @param $lieu
    40  * @param $type
    41  * @param $service
    42  *
    43  * @return mixed|string
     36 * @param string $lieu
     37 * @param string $type
     38 * @param string $service
     39 *
     40 * @return mixed
    4441 */
    4542function calculer_infos($lieu, $type, $service) {
     
    7269
    7370/**
    74  *
    75  * @package    RAINETTE/AFFICHAGE
     71 * Affiche l'icône correspondant au code météo fourni.
     72 *
    7673 * @api
    7774 * @filtre
    7875 *
    79  * @param        $meteo
     76 * @param array  $icone
    8077 * @param string $taille
    81  * @param string $chemin
    82  * @param string $extension
    8378 *
    8479 * @return string
    8580 */
    86 function rainette_afficher_icone($meteo, $taille = 'petit', $chemin = '', $extension = 'png') {
    87         $taille_defaut = ($taille == 'petit') ? _RAINETTE_ICONES_PETITE_TAILLE : _RAINETTE_ICONES_GRANDE_TAILLE;
    88 
    89         if (is_array($meteo)) {
    90                 // Utilisation des icones natifs des services autres que weather.com
    91                 $resume = attribut_html(rainette_afficher_resume($meteo['code']));
    92                 $source = $meteo['url'];
    93         } else {
    94                 // Utilisation des icones weather.com
    95                 $resume = rainette_afficher_resume($meteo);
    96 
    97                 $meteo = ($meteo and (($meteo >= 0) and ($meteo < 48))) ? strval($meteo) : 'na';
    98                 $chemin = (!$chemin) ? _RAINETTE_ICONES_PATH . $taille . '/' : rtrim($chemin, '/') . '/';
    99                 $fichier = $meteo . '.' . $extension;
    100                 // Le dossier personnalise ou le dossier passe en argument
    101                 // a-t-il bien l'icone requise ?
    102                 $source = find_in_path($fichier, $chemin);
    103                 if (!$source) {
    104                         // Non, il faut donc prendre l'icone par defaut dans le repertoire img_meteo qui existe toujours
    105                         $source = find_in_path($fichier, "img_meteo/$taille/");
    106                 }
    107         }
    108 
    109         // On retaille si nécessaire l'image pour qu'elle soit toujours de la même taille (grande ou petite)
     81function rainette_afficher_icone($icone, $taille = 'petit') {
     82
     83        // Initialisation de la source de la balise img avec le fichier icone.
     84        $source = $icone['source'];
     85
     86        // On retaille si nécessaire l'image pour qu'elle soit toujours de la même taille (grande ou petite).
    11087        list($largeur, $hauteur) = @getimagesize($source);
    11188        include_spip('filtres/images_transforme');
     89        $taille_defaut = ($taille == 'petit') ? _RAINETTE_ICONES_PETITE_TAILLE : _RAINETTE_ICONES_GRANDE_TAILLE;
    11290        if (($largeur < $taille_defaut) or ($hauteur < $taille_defaut)) {
    11391                // Image plus petite que celle par défaut :
     
    12199
    122100        // On construit la balise img
    123         $texte = attribut_html($resume);
     101        $texte = attribut_html(rainette_afficher_resume($icone['code']));
    124102        $balise_img = "<img src=\"${source}\" alt=\"${texte}\" title=\"${texte}\" width=\"${taille_defaut}\" height=\"${taille_defaut}\" />";
    125103
     
    133111 * @filtre
    134112 *
    135  * @param $meteo
     113 * @param string|int $resume
    136114 *
    137115 * @return string
    138116 */
    139 function rainette_afficher_resume($meteo) {
    140 
    141         if (is_numeric($meteo)) {
     117function rainette_afficher_resume($resume) {
     118
     119        if (is_numeric($resume)) {
    142120                // On utilise l'option de _T permettant de savoir si un item existe ou pas
    143                 $resume = _T('rainette:meteo_' . $meteo, array(), array('force' => false));
    144                 if (!$resume) {
    145                         $resume = _T('rainette:meteo_na') . " ($meteo)";
    146                 }
    147         } else {
    148                 $resume = $meteo ? $meteo : _T('rainette:meteo_na');
    149         }
    150 
    151         return ucfirst($resume);
     121                $texte = _T('rainette:meteo_' . $resume, array(), array('force' => false));
     122                if (!$texte) {
     123                        $texte = _T('rainette:meteo_na') . " ($resume)";
     124                }
     125        } else {
     126                $texte = $resume ? $resume : _T('rainette:meteo_na');
     127        }
     128
     129        return ucfirst($texte);
    152130}
    153131
     
    171149
    172150        include_spip('inc/rainette_convertir');
    173         $direction = angle2direction($direction);
    174 
    175         if ($direction) {
    176                 return _T("rainette:direction_$direction");
    177         } else {
    178                 return _T('rainette:valeur_indeterminee');
    179         }
     151        $direction_abregee = angle2direction($direction);
     152
     153        if ($direction_abregee) {
     154                $direction_texte = _T("rainette:direction_${direction_abregee}");
     155        } else {
     156                $direction_texte = _T('rainette:valeur_indeterminee');
     157        }
     158
     159        return $direction_texte;
    180160}
    181161
     
    194174 *              - `texte`   : pour afficher un texte en clair décrivant la tendance (méthode par défaut).
    195175 *              - `symbole` : pour afficher un symbole de flèche (1 caractère) décrivant la tendance.
    196  *              - `icone`   : pour afficher un icone spécifique décrivant la tendance avec une infobulle
    197  *                    fournissant le texte en clair.
    198  * @param string $chemin
    199  *              Chemin pour rechercher les icones.
    200  * @param string $extension
    201  *              Extension du fichier de l'icone.
    202176 *
    203177 * @return string
    204178 */
    205 function rainette_afficher_tendance($tendance_en, $methode = 'texte', $chemin = '', $extension = 'png') {
     179function rainette_afficher_tendance($tendance_en, $methode = 'texte') {
    206180
    207181        $tendance = '';
     
    214188                if ($methode == 'texte') {
    215189                        $tendance = $texte;
    216                 } elseif ($methode == 'symbole') {
     190                } else {
    217191                        $tendance = _T("rainette:tendance_symbole_$tendance_en");
    218                 } elseif ($methode == 'icone') {
    219                         $chemin = (!$chemin) ? _RAINETTE_ICONES_PATH : rtrim($chemin, '/') . '/';
    220                         $fichier = $tendance_en . '.' . $extension;
    221                         // Le dossier personnalise ou le dossier passe en argument
    222                         // a-t-il bien l'icone requise ?
    223                         $source = find_in_path($fichier, $chemin);
    224                         if (!$source) {
    225                                 // Non, il faut donc prendre l'icone par defaut dans le repertoire img_meteo qui existe toujours
    226                                 $source = find_in_path($fichier, 'img_meteo/');
    227                         }
    228 
    229                         list($largeur, $hauteur) = @getimagesize($source);
    230                         $tendance = "<img src=\"${source}\" alt=\"${texte}\" title=\"${texte}\" width=\"${largeur}\" height=\"${hauteur}\" />";
    231192                }
    232193        }
     
    342303
    343304/**
    344  * @param string        $mode
    345  * @param int           $periodicite
     305 * @param string $mode
     306 * @param int    $periodicite
    346307 *
    347308 * @return array
     
    372333
    373334/**
    374  * @param string        $mode
    375  * @param int           $periodicite
     335 * @param string $service
     336 * @param string $source
    376337 *
    377338 * @return array
    378339 */
    379 function rainette_lister_themes($service) {
     340function rainette_lister_themes($service, $source = 'local') {
    380341
    381342        $themes = array();
     
    383344        // Certains services proposent des thèmes d'icones accessibles via l'API.
    384345        // C'est le cas de wunderground.
    385         if ($service == 'wunderground') {
    386                 $cles = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k');
    387                 foreach ($cles as $_cle) {
    388                         $themes[$_cle] = _T("rainette:label_theme_wunderground_${_cle}");
    389                 }
    390         }
    391 
    392         // TODO : gérer ici aussi les thèmes d'icones locaux.
     346        if (strtolower($source) == 'api') {
     347                if ($service == 'wunderground') {
     348                        $cles = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k');
     349                        foreach ($cles as $_cle) {
     350                                $themes[$_cle] = _T("rainette:label_theme_wunderground_${_cle}");
     351                        }
     352                }
     353        } else {
     354                // Les thèmes de Rainette sont toujours stockés dans l'arborescence themes/$service.
     355                // Chaque thème a un alias qui correspond à son dossier et un titre pour l'affichage.
     356                // On recherche les sous-dossiers themes/$service présents dans le path.
     357                include_spip('inc/utils');
     358                foreach (creer_chemin() as $_chemin) {
     359                        $dossier_service = $_chemin . icone_local_normaliser('', $service);
     360                        if (@is_dir($dossier_service)) {
     361                                if ($dossiers_theme = glob($dossier_service . '/*', GLOB_ONLYDIR)) {
     362                                        foreach ($dossiers_theme as $_theme) {
     363                                                $theme = strtolower(basename($_theme));
     364                                                // On ne garde que le premier dossier de même nom.
     365                                                if (!isset($themes[$theme])) {
     366                                                        $themes[$theme] = $theme;
     367                                                }
     368                                        }
     369                                }
     370                        }
     371                }
     372
     373        }
    393374
    394375        return $themes;
     
    457438                $extras['config'] = array_merge(
    458439                        parametrage_normaliser($service, $configuration['defauts']),
    459                         array('source' => normaliser_configuration_donnees($mode, $configuration['donnees'])),
     440                        array('source' => configuration_donnees_normaliser($mode, $configuration['donnees'])),
    460441                        array('nom_service' => $configuration['nom'])
    461442                );
  • _plugins_/rainette/trunk/services/apixu.php

    r108194 r108245  
    1212
    1313if (!defined('_RAINETTE_APIXU_URL_BASE')) {
     14        /**
     15         * URL de base (endpoint) des requêtes au service APIXU.
     16         */
    1417        define('_RAINETTE_APIXU_URL_BASE', 'https://api.apixu.com/v1');
    1518}
     
    8588        ),
    8689        'defauts' => array(
    87                 'inscription' => '',
    88                 'unite'       => 'm',
    89                 'condition'   => 'apixu',
    90                 'theme'       => '',
     90                'inscription'   => '',
     91                'unite'         => 'm',
     92                'condition'     => 'apixu',
     93                'theme'         => '',
     94                'theme_local'   => 'original',
     95                'theme_weather' => 'sticker',
     96        ),
     97        // @link http://plugins.trac.wordpress.org/browser/weather-and-weather-forecast-widget/trunk/gg_funx_.php
     98        // Transcodage issu du plugin Wordpress weather forecast.
     99        // TODO : a revoir, index ok, idem que wwo a priori
     100        'transcodage_weather' => array(
     101                1000 => array(32, 31),
     102                1003 => array(30, 29),
     103                1006 => array(28, 27),
     104                1009 => array(26, 26),
     105                1030 => array(20, 20), // plutot 21 21
     106                1063 => array(40, 40),
     107                1066 => array(16, 16), // plutot 42, 42
     108                1069 => array(18, 18),
     109                1072 => array(10, 10),
     110                1087 => array(38, 47),
     111                1114 => array(15, 15),
     112                1117 => array(16, 16),
     113                1135 => array(20, 20),
     114                1147 => array(20, 20),
     115                1150 => array(9, 9),
     116                1153 => array(9, 9),
     117                1168 => array(9, 9),
     118                1171 => array(10, 10),
     119                1180 => array(9, 9),
     120                1183 => array(9, 9),
     121                1186 => array(39, 45),
     122                1189 => array(11, 11),
     123                1192 => array(39, 45),
     124                1195 => array(40, 40),
     125                1198 => array(8, 8),
     126                1201 => array(8, 8),
     127                1204 => array(18, 18),
     128                1207 => array(18, 18),
     129                1210 => array(13, 13),
     130                1213 => array(13, 13),
     131                1216 => array(14, 14),
     132                1219 => array(14, 14),
     133                1222 => array(16, 16),
     134                1225 => array(16, 16),
     135                1237 => array(18, 18),
     136                1240 => array(9, 9),
     137                1243 => array(11, 11),
     138                1246 => array(11, 11),
     139                1249 => array(6, 6),
     140                1252 => array(6, 6),
     141                1255 => array(13, 13),
     142                1258 => array(14, 14),
     143                1261 => array(6, 6),
     144                1264 => array(6, 6),
     145                1273 => array(37, 47),
     146                1276 => array(38, 47),
     147                1279 => array(41, 46),
     148                1282 => array(41, 46)
    91149        )
    92150);
     
    203261
    204262
     263
    205264// ------------------------------------------------------------------------------------------------
    206265// Les fonctions qui suivent définissent l'API standard du service et sont appelées par la fonction
     
    362421
    363422
    364 // ---------------------------------------------------------------------------------------------
    365 // Les fonctions qui suivent sont des utilitaires utilisés uniquement appelées par les fonctions
    366 // de l'API.
    367 // PACKAGE SPIP\RAINETTE\APIXU\OUTILS
    368 // ---------------------------------------------------------------------------------------------
     423/**
     424 * ---------------------------------------------------------------------------------------------
     425 * Les fonctions qui suivent sont des utilitaires uniquement appelées par les fonctions de l'API
     426 * ---------------------------------------------------------------------------------------------
     427 */
    369428
    370429/**
     
    374433 */
    375434function metrique2imperial_apixu(&$tableau) {
    376         include_spip('inc/rainette_convertir');
    377435
    378436        // Seules la température, la température ressentie et la vitesse du vent sont fournies dans
     
    380438        // Etant donnée que les tableaux sont normalisés, ils contiennent toujours les index de chaque
    381439        // donnée météo, il est donc inutile de tester leur existence.
     440        include_spip('inc/rainette_convertir');
    382441        $tableau['visibilite'] = ($tableau['visibilite'])
    383442                ? kilometre2mile($tableau['visibilite'])
     
    392451
    393452
     453/**
     454 * Calcule les états en fonction des états météorologiques natifs fournis par le service.
     455 *
     456 * @internal
     457 *
     458 * @param array $tableau
     459 *        Tableau standardisé des conditions contenant uniquement les données fournies sans traitement
     460 *        par le service. Le tableau est mis à jour et renvoyé à l'appelant.
     461 * @param array $configuration
     462 *        Configuration complète du service, statique et utilisateur.
     463 *
     464 * @return void
     465 */
    394466function etat2resume_apixu(&$tableau, $configuration) {
    395467
    396468        if ($tableau['code_meteo'] and $tableau['icon_meteo']) {
    397                 // Determination de l'indicateur jour/nuit qui permet de choisir le bon icone
    398                 // Pour ce service aucun indicateur n'est disponible
    399                 // -> on utilise le nom de l'icone qui contient l'indication "night" pour la nuit
    400                 $icone = basename($tableau['icon_meteo']);
    401                 if (strpos($icone, '/night/') === false) {
     469                // Determination de l'indicateur jour/nuit. Pour ce service aucun indicateur n'est disponible.
     470                // -> on utilise l'url de l'icone qui contient l'indication "/night/" pour la nuit
     471                if (strpos($tableau['icon_meteo'], '/night/') === false) {
    402472                        // C'est le jour
    403473                        $tableau['periode'] = 0;
     
    415485
    416486                // Determination de l'icone qui sera affiché.
     487                // -- on stocke le code afin de le fournir en alt dans la balise img
     488                $tableau['icone']['code'] = $tableau['code_meteo'];
     489                // -- on calcule le chemin complet de l'icone.
    417490                if ($configuration['condition'] == $configuration['alias']) {
    418                         // On affiche l'icône natif fourni par le service.
    419                         $tableau['icone']['code'] = $tableau['code_meteo'];
    420                         $tableau['icone']['url'] = copie_locale($tableau['icon_meteo']);
     491                        // On affiche l'icône natif fourni par le service et désigné par son url
     492                        // en faisant une copie locale dans IMG/.
     493                        include_spip('inc/distant');
     494                        $tableau['icone']['source'] = copie_locale($tableau['icon_meteo']);
    421495                } else {
    422                         // On affiche l'icône correspondant au code météo transcodé dans le système weather.com.
    423                         $meteo = meteo_apixu2weather($tableau['code_meteo'], $tableau['periode']);
    424                         $tableau['icone'] = $meteo;
     496                        include_spip('inc/rainette_normaliser');
     497                        if ($configuration['condition'] == "{$configuration['alias']}_local") {
     498                                // On affiche un icône d'un thème local compatible avec APIXU.
     499                                // Les icônes sont rangés dans themes/$service/$theme_local/$periode où periode vaut 'day' ou 'night'.
     500                                // Les icônes APIXU sont les mêmes que ceux de wwo, seuls le code météo change. Néanmoins, le service
     501                                // APIXU renvoi dans la donnée 'icon_meteo' le code wwo que l'on peut utiliser pour construire l'icone.
     502                                $chemin = icone_local_normaliser(
     503                                        basename($tableau['icon_meteo']),
     504                                        $configuration['alias'],
     505                                        $configuration['theme_local'],
     506                                        $tableau['periode'] == 0 ? 'day' : 'night');
     507                        } else {
     508                                // On affiche l'icône correspondant au code météo transcodé dans le système weather.com.
     509                                $chemin = icone_weather_normaliser(
     510                                        $tableau['code_meteo'],
     511                                        $configuration['theme_weather'],
     512                                        $configuration['transcodage_weather'],
     513                                        $tableau['periode']);
     514                        }
     515                        include_spip('inc/utils');
     516                        $tableau['icone']['source'] = find_in_path($chemin);
    425517                }
    426518        }
    427519}
    428 
    429 // TODO : à revoir complètement
    430 /**
    431  * @internal
    432  *
    433  * @link http://plugins.trac.wordpress.org/browser/weather-and-weather-forecast-widget/trunk/gg_funx_.php
    434  * Transcodage issu du plugin Wordpress weather forecast.
    435  *
    436  * @param string $meteo
    437  * @param int    $periode
    438  *
    439  * @return string
    440  */
    441  function meteo_apixu2weather($meteo, $periode = 0) {
    442         static $apixu2weather = array(
    443                 395 => array(41, 46),
    444                 392 => array(41, 46),
    445                 389 => array(38, 47),
    446                 386 => array(37, 47),
    447                 377 => array(6, 6),
    448                 374 => array(6, 6),
    449                 371 => array(14, 14),
    450                 368 => array(13, 13),
    451                 365 => array(6, 6),
    452                 362 => array(6, 6),
    453                 359 => array(11, 11),
    454                 356 => array(11, 11),
    455                 353 => array(9, 9),
    456                 350 => array(18, 18),
    457                 338 => array(16, 16),
    458                 335 => array(16, 16),
    459                 332 => array(14, 14),
    460                 329 => array(14, 14),
    461                 326 => array(13, 13),
    462                 323 => array(13, 13),
    463                 320 => array(18, 18),
    464                 317 => array(18, 18),
    465                 314 => array(8, 8),
    466                 311 => array(8, 8),
    467                 308 => array(40, 40),
    468                 305 => array(39, 45),
    469                 302 => array(11, 11),
    470                 299 => array(39, 45),
    471                 296 => array(9, 9),
    472                 293 => array(9, 9),
    473                 284 => array(10, 10),
    474                 281 => array(9, 9),
    475                 266 => array(9, 9),
    476                 263 => array(9, 9),
    477                 260 => array(20, 20),
    478                 248 => array(20, 20),
    479                 230 => array(16, 16),
    480                 227 => array(15, 15),
    481                 200 => array(38, 47),
    482                 185 => array(10, 10),
    483                 182 => array(18, 18),
    484                 179 => array(16, 16),
    485                 176 => array(40, 49),
    486                 143 => array(20, 20),
    487                 122 => array(26, 26),
    488                 119 => array(28, 27),
    489                 116 => array(30, 29),
    490                 113 => array(32, 31)
    491         );
    492 
    493         $icone = 'na';
    494         if (array_key_exists($meteo, $apixu2weather)) {
    495                 $icone = strval($apixu2weather[$meteo][$periode]);
    496         }
    497 
    498         return $icone;
    499 }
  • _plugins_/rainette/trunk/services/owm.php

    r108194 r108245  
    1111
    1212if (!defined('_RAINETTE_OWM_URL_BASE_REQUETE')) {
     13        /**
     14         * URL de base (endpoint) des requêtes au service OpenWeatherMap.
     15         */
    1316        define('_RAINETTE_OWM_URL_BASE_REQUETE', 'http://api.openweathermap.org/data/2.5/');
    1417}
    1518if (!defined('_RAINETTE_OWM_URL_BASE_ICONE')) {
     19        /**
     20         * URL de base des icônes fournis par le service OpenWeatherMap.
     21         */
    1622        define('_RAINETTE_OWM_URL_BASE_ICONE', 'http://openweathermap.org/img/w');
    1723}
     
    6975        ),
    7076        'defauts'        => array(
    71                 'inscription' => '',
    72                 'unite'       => 'm',
    73                 'condition'   => 'owm',
    74                 'theme'       => '',
    75         )
    76 );
    77 
    78 // Configuration des données fournies par le service owm pour le mode 'infos'.
    79 // -- Seules les données non calculées sont configurées.
    80 $GLOBALS['rainette_owm_config']['infos'] = array(
    81         'periode_maj' => 3600 * 24 * 30,
    82         'format_flux' => 'json',
    83         'cle_base'    => array(),
    84         'donnees'     => array(
    85                 // Lieu
    86                 'ville'     => array('cle' => array('name')),
    87                 'pays'      => array('cle' => array()),
    88                 'pays_iso2' => array('cle' => array('sys', 'country')),
    89                 'region'    => array('cle' => array()),
    90                 // Coordonnées
    91                 'longitude' => array('cle' => array('coord', 'lon')),
    92                 'latitude'  => array('cle' => array('coord', 'lat')),
    93                 // Informations complémentaires : aucune configuration car ce sont des données calculées
    94         ),
    95 );
    96 
    97 // Configuration des données fournies par le service owm pour le mode 'conditions'.
    98 // -- Seules les données non calculées sont configurées.
    99 $GLOBALS['rainette_owm_config']['conditions'] = array(
    100         'periode_maj' => 3600 * 2,
    101         'format_flux' => 'json',
    102         'cle_base'    => array(),
    103         'donnees'     => array(
    104                 // Données d'observation
    105                 'derniere_maj'          => array('cle' => array('dt')),
    106                 'station'               => array('cle' => array()),
    107                 // Températures
    108                 'temperature_reelle'    => array('cle' => array('main', 'temp')),
    109                 'temperature_ressentie' => array('cle' => array()),
    110                 // Données anémométriques
    111                 'vitesse_vent'          => array('cle' => array('wind', 'speed')),
    112                 'angle_vent'            => array('cle' => array('wind', 'deg')),
    113                 'direction_vent'        => array('cle' => array()),
    114                 // Données atmosphériques : risque_uv est calculé
    115                 'precipitation'         => array('cle' => array()),
    116                 'humidite'              => array('cle' => array('main', 'humidity')),
    117                 'point_rosee'           => array('cle' => array()),
    118                 'pression'              => array('cle' => array('main', 'pressure')),
    119                 'tendance_pression'     => array('cle' => array()),
    120                 'visibilite'            => array('cle' => array('visibility')),
    121                 'indice_uv'             => array('cle' => array()),
    122                 // Etats météorologiques natifs
    123                 'code_meteo'            => array('cle' => array('weather', 0, 'id')),
    124                 'icon_meteo'            => array('cle' => array('weather', 0, 'icon')),
    125                 'desc_meteo'            => array('cle' => array('weather', 0, 'description')),
    126                 'trad_meteo'            => array('cle' => array()),
    127                 // Etats météorologiques calculés : icone, resume, periode sont calculés
    128         ),
    129 );
    130 
    131 // Configuration des données fournies par le service owm pour le mode 'conditions'.
    132 // -- Seules les données non calculées sont configurées.
    133 $GLOBALS['rainette_owm_config']['previsions'] = array(
    134         'periodicites'       => array(
    135                 24 => array('max_jours' => 16),
    136                 //              3                      => array('max_jours' => 5)
    137         ),
    138         'periodicite_defaut' => 24,
    139         'periode_maj'        => 3600 * 2,
    140         'format_flux'        => 'json',
    141         'cle_base'           => array('list'),
    142         'cle_heure'          => array(),
    143         'structure_heure'    => false,
    144         'donnees'            => array(
    145                 // Données d'observation
    146                 'date'                 => array('cle' => array('dt')),
    147                 'heure'                => array('cle' => array()),
    148                 // Données astronomiques
    149                 'lever_soleil'         => array('cle' => array()),
    150                 'coucher_soleil'       => array('cle' => array()),
    151                 // Températures
    152                 'temperature'          => array('cle' => array()),
    153                 'temperature_max'      => array('cle' => array('temp', 'max')),
    154                 'temperature_min'      => array('cle' => array('temp', 'min')),
    155                 // Données anémométriques
    156                 'vitesse_vent'         => array('cle' => array('speed')),
    157                 'angle_vent'           => array('cle' => array('deg')),
    158                 'direction_vent'       => array('cle' => array()),
    159                 // Données atmosphériques : risque_uv est calculé
    160                 'risque_precipitation' => array('cle' => array()),
    161                 'precipitation'        => array('cle' => array('rain')),
    162                 'humidite'             => array('cle' => array('humidity')),
    163                 'point_rosee'          => array('cle' => array()),
    164                 'pression'             => array('cle' => array('pressure')),
    165                 'visibilite'           => array('cle' => array()),
    166                 'indice_uv'            => array('cle' => array()),
    167                 // Etats météorologiques natifs
    168                 'code_meteo'           => array('cle' => array('weather', 0, 'id')),
    169                 'icon_meteo'           => array('cle' => array('weather', 0, 'icon')),
    170                 'desc_meteo'           => array('cle' => array('weather', 0, 'description')),
    171                 'trad_meteo'           => array('cle' => array()),
    172                 // Etats météorologiques calculés : icone, resume, periode sont calculés
    173         ),
    174 );
    175 
    176 // Configuration des données fournies par le service owm en cas d'erreur.
    177 // -- Seules les données non calculées sont configurées.
    178 $GLOBALS['rainette_owm_config']['erreurs'] = array(
    179         'cle_base' => array(),
    180         'donnees'  => array(
    181                 // Erreur
    182                 'code'    => array('cle' => array('cod')),
    183                 'message' => array('cle' => array('message')),
    184         ),
    185 );
    186 
    187 
    188 /**
    189  * ------------------------------------------------------------------------------------------------
    190  * Les fonctions qui suivent définissent l'API standard du service et sont appelées par la fonction
    191  * unique de chargement des données météorologiques `meteo_charger()`.
    192  * PACKAGE SPIP\RAINETTE\OWM\API
    193  * ------------------------------------------------------------------------------------------------
    194  *
    195  * @param mixed $mode
    196  */
    197 
    198 /**
    199  * @param string $mode
    200  *
    201  * @return array
    202  */
    203 function owm_service2configuration($mode) {
    204         // On merge la configuration propre au mode et la configuration du service proprement dit
    205         // composée des valeurs par défaut de la configuration utilisateur et de paramètres généraux.
    206         $config = array_merge($GLOBALS['rainette_owm_config'][$mode], $GLOBALS['rainette_owm_config']['service']);
    207 
    208         return $config;
    209 }
    210 
    211 
    212 /**
    213  * @param $lieu
    214  * @param $mode
    215  * @param $periodicite
    216  * @param $configuration
    217  *
    218  * @return string
    219  */
    220 function owm_service2url($lieu, $mode, $periodicite, $configuration) {
    221 
    222         // Determination de la demande
    223         $demande = ($mode == 'previsions') ? 'forecast' : 'weather';
    224         if ($periodicite == 24) {
    225                 $demande .= '/daily';
    226         }
    227 
    228         // Identification de la langue du resume.
    229         // Le choix de la langue n'a d'interet que si on utilise le resume natif du service. Si ce n'est pas le cas
    230         // on ne la precise pas et on laisse l'API renvoyer la langue par defaut
    231         include_spip('inc/rainette_normaliser');
    232         $code_langue = langue_determiner($configuration);
    233 
    234         // On normalise le lieu et on récupère son format.
    235         // Le service accepte la format ville,pays et le format latitude,longitude
    236         $lieu_normalise = lieu_normaliser($lieu, $format_lieu);
    237         if ($format_lieu == 'latitude_longitude') {
    238                 list($latitude, $longitude) = explode(',', $lieu_normalise);
    239                 $query = "lat=${latitude}&lon=${longitude}";
    240         } else {
    241                 // Format ville,pays
    242                 $query = "q=${lieu_normalise}";
    243         }
    244 
    245         $url = _RAINETTE_OWM_URL_BASE_REQUETE
    246                    . $demande . '?'
    247                    . $query
    248                    . '&mode=' . $configuration['format_flux']
    249                    . '&units=' . ($configuration['unite'] == 'm' ? 'metric' : 'imperial')
    250                    . ((($mode == 'previsions') and ($periodicite == 24))
    251                         ? '&cnt=' . $configuration['periodicites'][$periodicite]['max_jours']
    252                         : '')
    253                    . '&lang=' . $code_langue
    254                    . ($configuration['inscription'] ? '&APPID=' . $configuration['inscription'] : '');
    255 
    256         return $url;
    257 }
    258 
    259 
    260 /**
    261  * @param array $erreur
    262  *
    263  * @return bool
    264  */
    265 function owm_erreur_verifier($erreur) {
    266 
    267         // Initialisation
    268         $est_erreur = false;
    269 
    270         // Pour OWM une erreur possède deux attributs, le code et le message.
    271         // Néanmoins, le code 200 est aussi renvoyé pour dire ok sans message.
    272         // => il faut donc écarter ce cas d'une erreur.
    273         if (!empty($erreur['code']) and !empty($erreur['message']) and ($erreur['code'] != '200')) {
    274                 $est_erreur = true;
    275         }
    276 
    277         return $est_erreur;
    278 }
    279 
    280 
    281 /**
    282  * @param array $tableau
    283  * @param       $configuration
    284  *
    285  * @return array
    286  */
    287 function owm_complement2infos($tableau, $configuration) {
    288         // Aucune donnée à rajouter en complément au tableau initialisé
    289         // TODO : remplir le nom du pays à partir du code ISO 3166-1 alpha 2.
    290         return $tableau;
    291 }
    292 
    293 
    294 /**
    295  * Complète par des données spécifiques au service le tableau des conditions issu
    296  * uniquement de la lecture du flux.
    297  *
    298  * @api
    299  *
    300  * @param array $tableau
    301  *        Tableau standardisé des conditions contenant uniquement les données fournies sans traitement
    302  *        par le service.
    303  * @param array $configuration
    304  *        Configuration complète du service, statique et utilisateur.
    305  *
    306  * @return array
    307  *        Tableau standardisé des conditions météorologiques complété par les données spécifiques
    308  *        du service.
    309  */
    310 function owm_complement2conditions($tableau, $configuration) {
    311 
    312         if ($tableau) {
    313                 // Calcul de la température ressentie et de la direction du vent (16 points), celles-ci
    314                 // n'étant pas fournie nativement par owm
    315                 include_spip('inc/rainette_convertir');
    316                 $tableau['temperature_ressentie'] = temperature2ressenti($tableau['temperature_reelle'], $tableau['vitesse_vent']);
    317                 $tableau['direction_vent'] = angle2direction($tableau['angle_vent']);
    318                 // On convertit aussi la visibilité en km car elle est fournie en mètres.
    319                 $tableau['visibilite'] = metre2kilometre($tableau['visibilite']);
    320 
    321                 // Compléter le tableau standard avec les états météorologiques calculés
    322                 etat2resume_owm($tableau, $configuration);
    323         }
    324 
    325         return $tableau;
    326 }
    327 
    328 
    329 /**
    330  * Complète par des données spécifiques au service le tableau des conditions issu
    331  * uniquement de la lecture du flux.
    332  *
    333  * @api
    334  *
    335  * @param array $tableau
    336  *        Tableau standardisé des conditions contenant uniquement les données fournies sans traitement
    337  *        par le service.
    338  * @param array $configuration
    339  *        Configuration complète du service, statique et utilisateur.
    340  * @param int   $index_periode
    341  *        Index où trouver et ranger les données. Cet index n'est pas utilisé pour les conditions
    342  *
    343  * @return array
    344  *        Tableau standardisé des conditions météorologiques complété par les données spécifiques
    345  *        du service.
    346  */
    347 function owm_complement2previsions($tableau, $configuration, $index_periode) {
    348 
    349         if (($tableau) and ($index_periode > -1)) {
    350                 // Vérifier les précipitations. Pour les prévisions, OWM renvoie le champ rain uniquement si il est
    351                 // différent de zéro. Il faut donc rétablir la valeur zéro dans ce cas pour éviter d'avoir N/D lors de
    352                 // l'affichage.
    353                 if ($tableau['precipitation'] === '') {
    354                         $tableau['precipitation'] = 0;
    355                 }
    356 
    357                 // Compléter le tableau standard avec les états météorologiques calculés
    358                 etat2resume_owm($tableau, $configuration);
    359         }
    360 
    361         return $tableau;
    362 }
    363 
    364 
    365 /**
    366  * ---------------------------------------------------------------------------------------------
    367  * Les fonctions qui suivent sont des utilitaires utilisés uniquement appelées par les fonctions
    368  * de l'API.
    369  * PACKAGE SPIP\RAINETTE\OWM\OUTILS
    370  * ---------------------------------------------------------------------------------------------
    371  *
    372  * @param mixed $configuration
    373  */
    374 
    375 /**
    376  * Calcule les états en fonction des états météorologiques natifs fournis par le service.
    377  *
    378  * @internal
    379  *
    380  * @param array $tableau
    381  *        Tableau standardisé des conditions contenant uniquement les données fournies sans traitement
    382  *        par le service. Le tableau est mis à jour et renvoyé à l'appelant.
    383  * @param array $configuration
    384  *        Configuration complète du service, statique et utilisateur.
    385  *
    386  * @return void
    387  */
    388 function etat2resume_owm(&$tableau, $configuration) {
    389 
    390         if ($tableau['code_meteo'] and $tableau['icon_meteo']) {
    391                 // Determination de l'indicateur jour/nuit qui permet de choisir le bon icone
    392                 // Pour ce service le nom du fichier icone finit par "d" pour le jour et
    393                 // par "n" pour la nuit.
    394                 $icone = $tableau['icon_meteo'];
    395                 if (strpos($icone, 'n') === false) {
    396                         // C'est le jour
    397                         $tableau['periode'] = 0;
    398                 } else {
    399                         // C'est la nuit
    400                         $tableau['periode'] = 1;
    401                 }
    402 
    403                 // Détermination du résumé à afficher.
    404                 // Depuis la 3.4.6 on affiche plus que le résumé natif de chaque service car les autres services
    405                 // que weather.com possèdent de nombreuses traductions qu'il convient d'utiliser.
    406                 // Pour éviter de modifier la structure de données, on conserve donc desc_meteo et resume même si
    407                 // maintenant ces deux données coincident toujours.
    408                 $tableau['resume'] = ucfirst($tableau['desc_meteo']);
    409 
    410                 // Determination de l'icone qui sera affiché.
    411                 if ($configuration['condition'] == $configuration['alias']) {
    412                         // On affiche l'icône natif fourni par le service.
    413                         $tableau['icone']['code'] = $tableau['code_meteo'];
    414                         $url = _RAINETTE_OWM_URL_BASE_ICONE . '/' . $tableau['icon_meteo'] . '.png';
    415                         $tableau['icone']['url'] = copie_locale($url);
    416                 } else {
    417                         // On affiche l'icône correspondant au code météo transcodé dans le système weather.com.
    418                         $meteo = meteo_owm2weather($tableau['code_meteo'], $tableau['periode']);
    419                         $tableau['icone'] = $meteo;
    420                 }
    421         }
    422 }
    423 
    424 
    425 // TODO : mettre au point le transcodage omw vers weather
    426 function meteo_owm2weather($meteo, $periode = 0) {
    427         static $owm2weather = array(
     77                'inscription'   => '',
     78                'unite'         => 'm',
     79                'condition'     => 'owm',
     80                'theme'         => '',
     81                'theme_local'   => '',
     82                'theme_weather' => 'sticker',
     83        ),
     84        // TODO : a revoir, liste des codes owm ok
     85        'transcodage_weather' => array(
    42886                '200' => array(41, 46),
    42987                '201' => array(39, 45),
     
    499157                '961' => array(26, 26),
    500158                '962' => array(26, 26)
    501         );
    502 
    503         $icone = 'na';
    504         if (array_key_exists($meteo, $owm2weather)) {
    505                 $icone = strval($owm2weather[$meteo][$periode]);
     159        )
     160);
     161
     162// Configuration des données fournies par le service owm pour le mode 'infos'.
     163// -- Seules les données non calculées sont configurées.
     164$GLOBALS['rainette_owm_config']['infos'] = array(
     165        'periode_maj' => 3600 * 24 * 30,
     166        'format_flux' => 'json',
     167        'cle_base'    => array(),
     168        'donnees'     => array(
     169                // Lieu
     170                'ville'     => array('cle' => array('name')),
     171                'pays'      => array('cle' => array()),
     172                'pays_iso2' => array('cle' => array('sys', 'country')),
     173                'region'    => array('cle' => array()),
     174                // Coordonnées
     175                'longitude' => array('cle' => array('coord', 'lon')),
     176                'latitude'  => array('cle' => array('coord', 'lat')),
     177                // Informations complémentaires : aucune configuration car ce sont des données calculées
     178        ),
     179);
     180
     181// Configuration des données fournies par le service owm pour le mode 'conditions'.
     182// -- Seules les données non calculées sont configurées.
     183$GLOBALS['rainette_owm_config']['conditions'] = array(
     184        'periode_maj' => 3600 * 2,
     185        'format_flux' => 'json',
     186        'cle_base'    => array(),
     187        'donnees'     => array(
     188                // Données d'observation
     189                'derniere_maj'          => array('cle' => array('dt')),
     190                'station'               => array('cle' => array()),
     191                // Températures
     192                'temperature_reelle'    => array('cle' => array('main', 'temp')),
     193                'temperature_ressentie' => array('cle' => array()),
     194                // Données anémométriques
     195                'vitesse_vent'          => array('cle' => array('wind', 'speed')),
     196                'angle_vent'            => array('cle' => array('wind', 'deg')),
     197                'direction_vent'        => array('cle' => array()),
     198                // Données atmosphériques : risque_uv est calculé
     199                'precipitation'         => array('cle' => array()),
     200                'humidite'              => array('cle' => array('main', 'humidity')),
     201                'point_rosee'           => array('cle' => array()),
     202                'pression'              => array('cle' => array('main', 'pressure')),
     203                'tendance_pression'     => array('cle' => array()),
     204                'visibilite'            => array('cle' => array('visibility')),
     205                'indice_uv'             => array('cle' => array()),
     206                // Etats météorologiques natifs
     207                'code_meteo'            => array('cle' => array('weather', 0, 'id')),
     208                'icon_meteo'            => array('cle' => array('weather', 0, 'icon')),
     209                'desc_meteo'            => array('cle' => array('weather', 0, 'description')),
     210                'trad_meteo'            => array('cle' => array()),
     211                // Etats météorologiques calculés : icone, resume, periode sont calculés
     212        ),
     213);
     214
     215// Configuration des données fournies par le service owm pour le mode 'conditions'.
     216// -- Seules les données non calculées sont configurées.
     217$GLOBALS['rainette_owm_config']['previsions'] = array(
     218        'periodicites'       => array(
     219                24 => array('max_jours' => 16),
     220                //              3                      => array('max_jours' => 5)
     221        ),
     222        'periodicite_defaut' => 24,
     223        'periode_maj'        => 3600 * 2,
     224        'format_flux'        => 'json',
     225        'cle_base'           => array('list'),
     226        'cle_heure'          => array(),
     227        'structure_heure'    => false,
     228        'donnees'            => array(
     229                // Données d'observation
     230                'date'                 => array('cle' => array('dt')),
     231                'heure'                => array('cle' => array()),
     232                // Données astronomiques
     233                'lever_soleil'         => array('cle' => array()),
     234                'coucher_soleil'       => array('cle' => array()),
     235                // Températures
     236                'temperature'          => array('cle' => array()),
     237                'temperature_max'      => array('cle' => array('temp', 'max')),
     238                'temperature_min'      => array('cle' => array('temp', 'min')),
     239                // Données anémométriques
     240                'vitesse_vent'         => array('cle' => array('speed')),
     241                'angle_vent'           => array('cle' => array('deg')),
     242                'direction_vent'       => array('cle' => array()),
     243                // Données atmosphériques : risque_uv est calculé
     244                'risque_precipitation' => array('cle' => array()),
     245                'precipitation'        => array('cle' => array('rain')),
     246                'humidite'             => array('cle' => array('humidity')),
     247                'point_rosee'          => array('cle' => array()),
     248                'pression'             => array('cle' => array('pressure')),
     249                'visibilite'           => array('cle' => array()),
     250                'indice_uv'            => array('cle' => array()),
     251                // Etats météorologiques natifs
     252                'code_meteo'           => array('cle' => array('weather', 0, 'id')),
     253                'icon_meteo'           => array('cle' => array('weather', 0, 'icon')),
     254                'desc_meteo'           => array('cle' => array('weather', 0, 'description')),
     255                'trad_meteo'           => array('cle' => array()),
     256                // Etats météorologiques calculés : icone, resume, periode sont calculés
     257        ),
     258);
     259
     260// Configuration des données fournies par le service owm en cas d'erreur.
     261// -- Seules les données non calculées sont configurées.
     262$GLOBALS['rainette_owm_config']['erreurs'] = array(
     263        'cle_base' => array(),
     264        'donnees'  => array(
     265                // Erreur
     266                'code'    => array('cle' => array('cod')),
     267                'message' => array('cle' => array('message')),
     268        ),
     269);
     270
     271
     272/**
     273 * ------------------------------------------------------------------------------------------------
     274 * Les fonctions qui suivent définissent l'API standard du service et sont appelées par la fonction
     275 * unique de chargement des données météorologiques `meteo_charger()`.
     276 * PACKAGE SPIP\RAINETTE\OWM\API
     277 * ------------------------------------------------------------------------------------------------
     278 *
     279 * @param mixed $mode
     280 */
     281
     282/**
     283 * @param string $mode
     284 *
     285 * @return array
     286 */
     287function owm_service2configuration($mode) {
     288        // On merge la configuration propre au mode et la configuration du service proprement dit
     289        // composée des valeurs par défaut de la configuration utilisateur et de paramètres généraux.
     290        $config = array_merge($GLOBALS['rainette_owm_config'][$mode], $GLOBALS['rainette_owm_config']['service']);
     291
     292        return $config;
     293}
     294
     295
     296/**
     297 * @param $lieu
     298 * @param $mode
     299 * @param $periodicite
     300 * @param $configuration
     301 *
     302 * @return string
     303 */
     304function owm_service2url($lieu, $mode, $periodicite, $configuration) {
     305
     306        // Determination de la demande
     307        $demande = ($mode == 'previsions') ? 'forecast' : 'weather';
     308        if ($periodicite == 24) {
     309                $demande .= '/daily';
    506310        }
    507311
    508         return $icone;
    509 }
     312        // Identification de la langue du resume.
     313        // Le choix de la langue n'a d'interet que si on utilise le resume natif du service. Si ce n'est pas le cas
     314        // on ne la precise pas et on laisse l'API renvoyer la langue par defaut
     315        include_spip('inc/rainette_normaliser');
     316        $code_langue = langue_determiner($configuration);
     317
     318        // On normalise le lieu et on récupère son format.
     319        // Le service accepte la format ville,pays et le format latitude,longitude
     320        $lieu_normalise = lieu_normaliser($lieu, $format_lieu);
     321        if ($format_lieu == 'latitude_longitude') {
     322                list($latitude, $longitude) = explode(',', $lieu_normalise);
     323                $query = "lat=${latitude}&lon=${longitude}";
     324        } else {
     325                // Format ville,pays
     326                $query = "q=${lieu_normalise}";
     327        }
     328
     329        $url = _RAINETTE_OWM_URL_BASE_REQUETE
     330                   . $demande . '?'
     331                   . $query
     332                   . '&mode=' . $configuration['format_flux']
     333                   . '&units=' . ($configuration['unite'] == 'm' ? 'metric' : 'imperial')
     334                   . ((($mode == 'previsions') and ($periodicite == 24))
     335                        ? '&cnt=' . $configuration['periodicites'][$periodicite]['max_jours']
     336                        : '')
     337                   . '&lang=' . $code_langue
     338                   . ($configuration['inscription'] ? '&APPID=' . $configuration['inscription'] : '');
     339
     340        return $url;
     341}
     342
     343
     344/**
     345 * @param array $erreur
     346 *
     347 * @return bool
     348 */
     349function owm_erreur_verifier($erreur) {
     350
     351        // Initialisation
     352        $est_erreur = false;
     353
     354        // Pour OWM une erreur possède deux attributs, le code et le message.
     355        // Néanmoins, le code 200 est aussi renvoyé pour dire ok sans message.
     356        // => il faut donc écarter ce cas d'une erreur.
     357        if (!empty($erreur['code']) and !empty($erreur['message']) and ($erreur['code'] != '200')) {
     358                $est_erreur = true;
     359        }
     360
     361        return $est_erreur;
     362}
     363
     364
     365/**
     366 * Complète par des données spécifiques au service le tableau des conditions issu
     367 * uniquement de la lecture du flux.
     368 *
     369 * @api
     370 *
     371 * @param array $tableau
     372 *        Tableau standardisé des conditions contenant uniquement les données fournies sans traitement
     373 *        par le service.
     374 * @param array $configuration
     375 *        Configuration complète du service, statique et utilisateur.
     376 *
     377 * @return array
     378 *        Tableau standardisé des conditions météorologiques complété par les données spécifiques
     379 *        du service.
     380 */
     381function owm_complement2conditions($tableau, $configuration) {
     382
     383        if ($tableau) {
     384                // Calcul de la température ressentie et de la direction du vent (16 points), celles-ci
     385                // n'étant pas fournie nativement par owm
     386                include_spip('inc/rainette_convertir');
     387                $tableau['temperature_ressentie'] = temperature2ressenti($tableau['temperature_reelle'], $tableau['vitesse_vent']);
     388                $tableau['direction_vent'] = angle2direction($tableau['angle_vent']);
     389                // On convertit aussi la visibilité en km car elle est fournie en mètres.
     390                $tableau['visibilite'] = metre2kilometre($tableau['visibilite']);
     391
     392                // Compléter le tableau standard avec les états météorologiques calculés
     393                etat2resume_owm($tableau, $configuration);
     394        }
     395
     396        return $tableau;
     397}
     398
     399
     400/**
     401 * Complète par des données spécifiques au service le tableau des conditions issu
     402 * uniquement de la lecture du flux.
     403 *
     404 * @api
     405 *
     406 * @param array $tableau
     407 *        Tableau standardisé des conditions contenant uniquement les données fournies sans traitement
     408 *        par le service.
     409 * @param array $configuration
     410 *        Configuration complète du service, statique et utilisateur.
     411 * @param int   $index_periode
     412 *        Index où trouver et ranger les données. Cet index n'est pas utilisé pour les conditions
     413 *
     414 * @return array
     415 *        Tableau standardisé des conditions météorologiques complété par les données spécifiques
     416 *        du service.
     417 */
     418function owm_complement2previsions($tableau, $configuration, $index_periode) {
     419
     420        if (($tableau) and ($index_periode > -1)) {
     421                // Vérifier les précipitations. Pour les prévisions, OWM renvoie le champ rain uniquement si il est
     422                // différent de zéro. Il faut donc rétablir la valeur zéro dans ce cas pour éviter d'avoir N/D lors de
     423                // l'affichage.
     424                if ($tableau['precipitation'] === '') {
     425                        $tableau['precipitation'] = 0;
     426                }
     427
     428                // Compléter le tableau standard avec les états météorologiques calculés
     429                etat2resume_owm($tableau, $configuration);
     430        }
     431
     432        return $tableau;
     433}
     434
     435
     436/**
     437 * ---------------------------------------------------------------------------------------------
     438 * Les fonctions qui suivent sont des utilitaires uniquement appelées par les fonctions de l'API
     439 * ---------------------------------------------------------------------------------------------
     440 */
     441
     442/**
     443 * Calcule les états en fonction des états météorologiques natifs fournis par le service.
     444 *
     445 * @internal
     446 *
     447 * @param array $tableau
     448 *        Tableau standardisé des conditions contenant uniquement les données fournies sans traitement
     449 *        par le service. Le tableau est mis à jour et renvoyé à l'appelant.
     450 * @param array $configuration
     451 *        Configuration complète du service, statique et utilisateur.
     452 *
     453 * @return void
     454 */
     455function etat2resume_owm(&$tableau, $configuration) {
     456
     457        if ($tableau['code_meteo'] and $tableau['icon_meteo']) {
     458                // Determination de l'indicateur jour/nuit qui permet de choisir le bon icone
     459                // Pour ce service le nom du fichier icone finit par "d" pour le jour et
     460                // par "n" pour la nuit.
     461                if (strpos($tableau['icon_meteo'], 'n') === false) {
     462                        // C'est le jour
     463                        $tableau['periode'] = 0;
     464                } else {
     465                        // C'est la nuit
     466                        $tableau['periode'] = 1;
     467                }
     468
     469                // Détermination du résumé à afficher.
     470                // Depuis la 3.4.6 on affiche plus que le résumé natif de chaque service car les autres services
     471                // que weather.com possèdent de nombreuses traductions qu'il convient d'utiliser.
     472                // Pour éviter de modifier la structure de données, on conserve donc desc_meteo et resume même si
     473                // maintenant ces deux données coincident toujours.
     474                $tableau['resume'] = ucfirst($tableau['desc_meteo']);
     475
     476                // Determination de l'icone qui sera affiché.
     477                // -- on stocke le code afin de le fournir en alt dans la balise img
     478                $tableau['icone']['code'] = $tableau['code_meteo'];
     479                // -- on calcule le chemin complet de l'icone.
     480                if ($configuration['condition'] == $configuration['alias']) {
     481                        // On affiche l'icône natif fourni par le service et désigné par son url
     482                        // en faisant une copie locale dans IMG/.
     483                        include_spip('inc/distant');
     484                        $url = _RAINETTE_OWM_URL_BASE_ICONE . '/' . $tableau['icon_meteo'] . '.png';
     485                        $tableau['icone']['source'] = copie_locale($url);
     486                } else {
     487                        include_spip('inc/rainette_normaliser');
     488                        if ($configuration['condition'] == "{$configuration['alias']}_local") {
     489                                // On affiche un icône d'un thème local compatible avec OWM.
     490                                // TODO : à vérifier car aucun thème n'est pour l'instant disponible
     491                                $chemin = icone_local_normaliser(
     492                                        "{$tableau['icon_meteo']}.png",
     493                                        $configuration['alias'],
     494                                        $configuration['theme_local'],
     495                                        $tableau['periode'] == 0 ? 'day' : 'night');
     496                        } else {
     497                                // On affiche l'icône correspondant au code météo transcodé dans le système weather.com.
     498                                $chemin = icone_weather_normaliser(
     499                                        $tableau['code_meteo'],
     500                                        $configuration['theme_weather'],
     501                                        $configuration['transcodage_weather'],
     502                                        $tableau['periode']);
     503                        }
     504                        include_spip('inc/utils');
     505                        $tableau['icone']['source'] = find_in_path($chemin);
     506                }
     507        }
     508}
  • _plugins_/rainette/trunk/services/weather.php

    r108194 r108245  
    1111
    1212if (!defined('_RAINETTE_WEATHER_URL_BASE')) {
     13        /**
     14         * URL de base (endpoint) des requêtes au service weather.com.
     15         */
    1316        define('_RAINETTE_WEATHER_URL_BASE', 'http://wxdata.weather.com/wxdata/weather/local/');
    1417}
     
    3538        ),
    3639        'defauts'        => array(
    37                 'inscription' => '',
    38                 'unite'       => 'm',
    39                 'condition'   => 'weather',
    40                 'theme'       => '',
    41         )
     40                'inscription'   => '',
     41                'unite'         => 'm',
     42                'condition'     => 'weather_local',
     43                'theme'         => '',
     44                'theme_local'   => 'sticker',
     45                'theme_weather' => '',
     46        ),
     47        // Aucun transcodage puisqu'on est sur le service qui fournit les icônes.
     48        'transcodage_weather' => array()
    4249);
    4350
     
    217224
    218225
     226/**
     227 * @param $tableau
     228 * @param $configuration
     229 *
     230 * @return mixed
     231 */
    219232function weather_complement2infos($tableau, $configuration) {
    220233
     
    232245
    233246
     247/**
     248 * @param $tableau
     249 * @param $configuration
     250 *
     251 * @return mixed
     252 */
    234253function weather_complement2conditions($tableau, $configuration) {
    235254
     
    275294}
    276295
    277 
     296/**
     297 * ---------------------------------------------------------------------------------------------
     298 * Les fonctions qui suivent sont des utilitaires uniquement appelées par les fonctions de l'API
     299 * ---------------------------------------------------------------------------------------------
     300 */
     301
     302/**
     303 * Calcule les états en fonction des états météorologiques natifs fournis par le service.
     304 *
     305 * @internal
     306 *
     307 * @param array $tableau
     308 *        Tableau standardisé des conditions contenant uniquement les données fournies sans traitement
     309 *        par le service. Le tableau est mis à jour et renvoyé à l'appelant.
     310 * @param array $configuration
     311 *        Configuration complète du service, statique et utilisateur.
     312 *
     313 * @return void
     314 */
    278315function etat2resume_weather(&$tableau, $configuration) {
    279316
     
    283320                $tableau['periode'] = 0;
    284321
    285                 $tableau['icone'] = $tableau['code_meteo'];
     322                // Détermination du résumé à afficher.
    286323                $tableau['resume'] = $tableau['code_meteo'];
    287         }
    288 }
     324
     325                // Determination de l'icone qui sera affiché.
     326                // -- on stocke le code afin de le fournir en alt dans la balise img
     327                $tableau['icone']['code'] = $tableau['code_meteo'];
     328                // -- on calcule le chemin complet de l'icone.
     329                include_spip('inc/rainette_normaliser');
     330                $chemin = icone_weather_normaliser(
     331                        $tableau['code_meteo'],
     332                        $configuration['theme_local']);
     333
     334                include_spip('inc/utils');
     335                $tableau['icone']['source'] = find_in_path($chemin);
     336        }
     337}
  • _plugins_/rainette/trunk/services/weatherbit.php

    r108194 r108245  
    9090        ),
    9191        'defauts' => array(
    92                 'inscription' => '',
    93                 'unite'       => 'm',
    94                 'condition'   => 'weatherbit',
    95                 'theme'       => '',
     92                'inscription'   => '',
     93                'unite'         => 'm',
     94                'condition'     => 'weatherbit',
     95                'theme'         => '',
     96                'theme_local'   => 'original',
     97                'theme_weather' => 'sticker',
     98        ),
     99        // TODO : tout à revoir
     100        'transcodage_weather' => array(
    96101        )
    97102);
     
    382387
    383388
    384 // ---------------------------------------------------------------------------------------------
    385 // Les fonctions qui suivent sont des utilitaires utilisés uniquement appelées par les fonctions
    386 // de l'API.
    387 // PACKAGE SPIP\RAINETTE\WEATHERBIT\OUTILS
    388 // ---------------------------------------------------------------------------------------------
    389 
     389/**
     390 * ---------------------------------------------------------------------------------------------
     391 * Les fonctions qui suivent sont des utilitaires uniquement appelées par les fonctions de l'API
     392 * ---------------------------------------------------------------------------------------------
     393 */
     394
     395/**
     396 * Calcule les états en fonction des états météorologiques natifs fournis par le service.
     397 *
     398 * @internal
     399 *
     400 * @param array $tableau
     401 *        Tableau standardisé des conditions contenant uniquement les données fournies sans traitement
     402 *        par le service. Le tableau est mis à jour et renvoyé à l'appelant.
     403 * @param array $configuration
     404 *        Configuration complète du service, statique et utilisateur.
     405 *
     406 * @return void
     407 */
    390408function etat2resume_weatherbit(&$tableau, $configuration) {
    391409
     
    393411                // Determination de l'indicateur jour/nuit qui permet de choisir le bon icône.
    394412                // TODO : Pour ce service il existe un indicateur qu'il faudra utiliser
    395                 $icone = basename($tableau['icon_meteo']);
    396                 if (substr($icone, -1) == 'd') {
     413                if (substr($tableau['icon_meteo'], -1) == 'd') {
    397414                        // C'est le jour
    398415                        $tableau['periode'] = 0;
     
    410427
    411428                // Determination de l'icone qui sera affiché.
     429                // -- on stocke le code afin de le fournir en alt dans la balise img
     430                $tableau['icone']['code'] = $tableau['code_meteo'];
     431                // -- on calcule le chemin complet de l'icone.
    412432                if ($configuration['condition'] == $configuration['alias']) {
    413                         // On affiche l'icône natif fourni par le service.
    414                         // TODO : Weatherbit conseille d'utiliser des images stockées en local.
    415                         $tableau['icone']['code'] = $tableau['code_meteo'];
     433                        // On affiche l'icône natif fourni par le service et désigné par son url
     434                        // en faisant une copie locale dans IMG/.
     435                        include_spip('inc/distant');
    416436                        $url = _RAINETTE_WEATHERBIT_URL_BASE_ICONE . '/' . $tableau['icon_meteo'] . '.png';
    417                         $tableau['icone']['url'] = copie_locale($url);
     437                        $tableau['icone']['source'] = copie_locale($url);
    418438                } else {
    419                         // On affiche l'icône correspondant au code météo transcodé dans le système weather.com.
    420                         $meteo = meteo_weatherbit2weather($tableau['code_meteo'], $tableau['periode']);
    421                         $tableau['icone'] = $meteo;
     439                        include_spip('inc/rainette_normaliser');
     440                        if ($configuration['condition'] == "{$configuration['alias']}_local") {
     441                                // On affiche un icône d'un thème local compatible avec Weatherbit.
     442                                $chemin = icone_local_normaliser(
     443                                        "{$tableau['icon_meteo']}.png",
     444                                        $configuration['alias'],
     445                                        $configuration['theme_local']);
     446                        } else {
     447                                // On affiche l'icône correspondant au code météo transcodé dans le système weather.com.
     448                                $chemin = icone_weather_normaliser(
     449                                        $tableau['code_meteo'],
     450                                        $configuration['theme_weather'],
     451                                        $configuration['transcodage_weather'],
     452                                        $tableau['periode']);
     453                        }
     454                        include_spip('inc/utils');
     455                        $tableau['icone']['source'] = find_in_path($chemin);
    422456                }
    423457        }
    424458}
    425 
    426 // TODO : à revoir complètement
    427 /**
    428  * @internal
    429  *
    430  * @link http://plugins.trac.wordpress.org/browser/weather-and-weather-forecast-widget/trunk/gg_funx_.php
    431  * Transcodage issu du plugin Wordpress weather forecast.
    432  *
    433  * @param string $meteo
    434  * @param int    $periode
    435  *
    436  * @return string
    437  */
    438  function meteo_weatherbit2weather($meteo, $periode = 0) {
    439         static $weatherbit2weather = array(
    440                 395 => array(41, 46),
    441                 392 => array(41, 46),
    442                 389 => array(38, 47),
    443                 386 => array(37, 47),
    444                 377 => array(6, 6),
    445                 374 => array(6, 6),
    446                 371 => array(14, 14),
    447                 368 => array(13, 13),
    448                 365 => array(6, 6),
    449                 362 => array(6, 6),
    450                 359 => array(11, 11),
    451                 356 => array(11, 11),
    452                 353 => array(9, 9),
    453                 350 => array(18, 18),
    454                 338 => array(16, 16),
    455                 335 => array(16, 16),
    456                 332 => array(14, 14),
    457                 329 => array(14, 14),
    458                 326 => array(13, 13),
    459                 323 => array(13, 13),
    460                 320 => array(18, 18),
    461                 317 => array(18, 18),
    462                 314 => array(8, 8),
    463                 311 => array(8, 8),
    464                 308 => array(40, 40),
    465                 305 => array(39, 45),
    466                 302 => array(11, 11),
    467                 299 => array(39, 45),
    468                 296 => array(9, 9),
    469                 293 => array(9, 9),
    470                 284 => array(10, 10),
    471                 281 => array(9, 9),
    472                 266 => array(9, 9),
    473                 263 => array(9, 9),
    474                 260 => array(20, 20),
    475                 248 => array(20, 20),
    476                 230 => array(16, 16),
    477                 227 => array(15, 15),
    478                 200 => array(38, 47),
    479                 185 => array(10, 10),
    480                 182 => array(18, 18),
    481                 179 => array(16, 16),
    482                 176 => array(40, 49),
    483                 143 => array(20, 20),
    484                 122 => array(26, 26),
    485                 119 => array(28, 27),
    486                 116 => array(30, 29),
    487                 113 => array(32, 31)
    488         );
    489 
    490         $icone = 'na';
    491         if (array_key_exists($meteo, $weatherbit2weather)) {
    492                 $icone = strval($weatherbit2weather[$meteo][$periode]);
    493         }
    494 
    495         return $icone;
    496 }
  • _plugins_/rainette/trunk/services/wunderground.php

    r108194 r108245  
    1212if (!defined('_RAINETTE_WUNDERGROUND_URL_BASE_REQUETE')) {
    1313        /**
    14          * URL de base (endpoint) des requêtes au service Wunderground
     14         * URL de base (endpoint) des requêtes au service Wunderground.
    1515         */
    1616        define('_RAINETTE_WUNDERGROUND_URL_BASE_REQUETE', 'http://api.wunderground.com/api');
     
    1818if (!defined('_RAINETTE_WUNDERGROUND_URL_BASE_ICONE')) {
    1919        /**
    20          * URL de base des icônes fournis par le service Wunderground
     20         * URL de base des icônes fournis par le service Wunderground.
    2121         */
    2222        define('_RAINETTE_WUNDERGROUND_URL_BASE_ICONE', 'http://icons.wxug.com/i/c');
     
    131131        ),
    132132        'defauts' => array(
    133                 'inscription' => '',
    134                 'unite'       => 'm',
    135                 'condition'   => 'wundergound',
    136                 'theme'       => 'a',
     133                'inscription'   => '',
     134                'unite'         => 'm',
     135                'condition'     => 'wundergound',
     136                'theme'         => 'a',
     137                'theme_local'   => 'observation',
     138                'theme_weather' => 'sticker',
     139        ),
     140        // TODO : tout à revoir
     141        'transcodage_weather' => array(
     142                'chanceflurries'  => array(41, 46),
     143                'chancerain'      => array(39, 45),
     144                'chancesleet'     => array(39, 45),
     145                'chancesnow'      => array(41, 46),
     146                'chancetstorms'   => array(38, 47),
     147                'clear'           => array(32, 31),
     148                'cloudy'          => array(26, 26),
     149                'flurries'        => array(15, 15),
     150                'fog'             => array(20, 20),
     151                'hazy'            => array(21, 21),
     152                'mostlycloudy'    => array(28, 27),
     153                'mostlysunny'     => array(34, 33),
     154                'partlycloudy'    => array(30, 29),
     155                'partlysunny'     => array(28, 27),
     156                'sleet'           => array(5, 5),
     157                'rain'            => array(11, 11),
     158                'snow'            => array(16, 16),
     159                'sunny'           => array(32, 31),
     160                'tstorms'         => array(4, 4),
     161                'thunderstorms'   => array(4, 4),
     162                'unknown'         => array(4, 4),
     163                'scatteredclouds' => array(30, 29),
     164                'overcast'        => array(26, 26)
    137165        )
    138166);
     
    445473/**
    446474 * ---------------------------------------------------------------------------------------------
    447  * Les fonctions qui suivent sont des utilitaires utilisés uniquement appelées par les fonctions
    448  * de l'API.
    449  * PACKAGE SPIP\RAINETTE\WUNDERGROUND\OUTILS
     475 * Les fonctions qui suivent sont des utilitaires uniquement appelées par les fonctions de l'API
    450476 * ---------------------------------------------------------------------------------------------
    451477 */
     
    486512
    487513                // Determination de l'icone qui sera affiché.
     514                // -- on stocke le code afin de le fournir en alt dans la balise img
     515                $tableau['icone']['code'] = $tableau['code_meteo'];
     516                // -- on calcule le chemin complet de l'icone.
    488517                if ($configuration['condition'] == $configuration['alias']) {
    489                         // On affiche l'icône natif fourni par le service.
    490                         $tableau['icone']['code'] = $tableau['code_meteo'];
     518                        // On affiche l'icône natif fourni par le service et désigné par son url
     519                        // en faisant une copie locale dans IMG/.
     520                        include_spip('inc/distant');
    491521                        $url = _RAINETTE_WUNDERGROUND_URL_BASE_ICONE . '/' . $configuration['theme'] . '/' . $icone;
    492                         $tableau['icone']['url'] = copie_locale($url);
     522                        $tableau['icone']['source'] = copie_locale($url);
    493523                } else {
    494                         // On affiche l'icône correspondant au code météo transcodé dans le système weather.com.
    495                         $meteo = meteo_wunderground2weather($tableau['code_meteo'], $tableau['periode']);
    496                         $tableau['icone'] = $meteo;
     524                        include_spip('inc/rainette_normaliser');
     525                        if ($configuration['condition'] == "{$configuration['alias']}_local") {
     526                                // On affiche un icône d'un thème local compatible avec Wunderground.
     527                                $chemin = icone_local_normaliser(
     528                                        "{$tableau['icon_meteo']}.png",
     529                                        $configuration['alias'],
     530                                        $configuration['theme_local']);
     531                        } else {
     532                                // On affiche l'icône correspondant au code météo transcodé dans le système weather.com.
     533                                $chemin = icone_weather_normaliser(
     534                                        $tableau['code_meteo'],
     535                                        $configuration['theme_weather'],
     536                                        $configuration['transcodage_weather'],
     537                                        $tableau['periode']);
     538                        }
     539                        include_spip('inc/utils');
     540                        $tableau['icone']['source'] = find_in_path($chemin);
    497541                }
    498542        }
    499543}
    500 
    501 
    502 /**
    503  * @internal
    504  *
    505  * @link http://plugins.trac.wordpress.org/browser/weather-and-weather-forecast-widget/trunk/gg_funx_.php
    506  * Transcodage issu du plugin Wordpress weather forecast.
    507  *
    508  * @param string $meteo
    509  * @param int    $periode
    510  *
    511  * @return string
    512  */
    513 function meteo_wunderground2weather($meteo, $periode = 0) {
    514         static $wunderground2weather = array(
    515                 'chanceflurries'  => array(41, 46),
    516                 'chancerain'      => array(39, 45),
    517                 'chancesleet'     => array(39, 45),
    518 //              'chancesleet'     => array(41, 46),
    519                 'chancesnow'      => array(41, 46),
    520                 'chancetstorms'   => array(38, 47),
    521                 'clear'           => array(32, 31),
    522                 'cloudy'          => array(26, 26),
    523                 'flurries'        => array(15, 15),
    524                 'fog'             => array(20, 20),
    525                 'hazy'            => array(21, 21),
    526                 'mostlycloudy'    => array(28, 27),
    527                 'mostlysunny'     => array(34, 33),
    528                 'partlycloudy'    => array(30, 29),
    529                 'partlysunny'     => array(28, 27),
    530                 'sleet'           => array(5, 5),
    531                 'rain'            => array(11, 11),
    532                 'snow'            => array(16, 16),
    533                 'sunny'           => array(32, 31),
    534                 'tstorms'         => array(4, 4),
    535                 'thunderstorms'   => array(4, 4),
    536                 'unknown'         => array(4, 4),
    537                 'scatteredclouds' => array(30, 29),
    538                 'overcast'        => array(26, 26)
    539         );
    540 
    541         $icone = 'na';
    542         $meteo = strtolower($meteo);
    543         if (array_key_exists($meteo, $wunderground2weather)) {
    544                 $icone = strval($wunderground2weather[$meteo][$periode]);
    545         }
    546 
    547         return $icone;
    548 }
  • _plugins_/rainette/trunk/services/wwo.php

    r108194 r108245  
    33 * Ce fichier contient la configuration et l'ensemble des fonctions implémentant le service World Weather Online (wwo).
    44 * Ce service est capable de fournir des données au format XML ou JSON. Néanmoins, l'API actuelle du plugin utilise
    5  * uniquemement le format JSON.
     5 * uniquement le format JSON.
    66 *
    77 * @package SPIP\RAINETTE\SERVICES\WWO
     
    1212
    1313if (!defined('_RAINETTE_WWO_URL_BASE')) {
     14        /**
     15         * URL de base (endpoint) des requêtes au service World Weather Online.
     16         */
    1417        define('_RAINETTE_WWO_URL_BASE', 'http://api.worldweatheronline.com/premium/v1/weather.ashx');
    1518}
     
    8588        ),
    8689        'defauts' => array(
    87                 'inscription' => '',
    88                 'unite'       => 'm',
    89                 'condition'   => 'wwo',
    90                 'theme'       => '',
     90                'inscription'   => '',
     91                'unite'         => 'm',
     92                'condition'     => 'wwo',
     93                'theme'         => '',
     94                'theme_local'   => 'original',
     95                'theme_weather' => 'sticker',
     96        ),
     97        // @link http://plugins.trac.wordpress.org/browser/weather-and-weather-forecast-widget/trunk/gg_funx_.php
     98        // Transcodage issu du plugin Wordpress weather forecast.
     99        // TODO : a revoir, index ok, idem apixu
     100        'transcodage_weather' => array(
     101                113 => array(32, 31),
     102                116 => array(30, 29),
     103                119 => array(28, 27),
     104                122 => array(26, 26),
     105                143 => array(20, 20),
     106                176 => array(40, 49),
     107                179 => array(16, 16),
     108                182 => array(18, 18),
     109                185 => array(10, 10),
     110                200 => array(38, 47),
     111                227 => array(15, 15),
     112                230 => array(16, 16),
     113                248 => array(20, 20),
     114                260 => array(20, 20),
     115                263 => array(9, 9),
     116                266 => array(9, 9),
     117                281 => array(9, 9),
     118                284 => array(10, 10),
     119                293 => array(9, 9),
     120                296 => array(9, 9),
     121                299 => array(39, 45),
     122                302 => array(11, 11),
     123                305 => array(39, 45),
     124                308 => array(40, 40),
     125                311 => array(8, 8),
     126                314 => array(8, 8),
     127                317 => array(18, 18),
     128                320 => array(18, 18),
     129                323 => array(13, 13),
     130                326 => array(13, 13),
     131                329 => array(14, 14),
     132                332 => array(14, 14),
     133                335 => array(16, 16),
     134                338 => array(16, 16),
     135                350 => array(18, 18),
     136                353 => array(9, 9),
     137                356 => array(11, 11),
     138                359 => array(11, 11),
     139                362 => array(6, 6),
     140                365 => array(6, 6),
     141                368 => array(13, 13),
     142                371 => array(14, 14),
     143                374 => array(6, 6),
     144                377 => array(6, 6),
     145                386 => array(37, 47),
     146                389 => array(38, 47),
     147                392 => array(41, 46),
     148                395 => array(41, 46)
    91149        )
    92150);
     
    372430
    373431
    374 // ---------------------------------------------------------------------------------------------
    375 // Les fonctions qui suivent sont des utilitaires utilisés uniquement appelées par les fonctions
    376 // de l'API.
    377 // PACKAGE SPIP\RAINETTE\WWO\OUTILS
    378 // ---------------------------------------------------------------------------------------------
     432/**
     433 * ---------------------------------------------------------------------------------------------
     434 * Les fonctions qui suivent sont des utilitaires uniquement appelées par les fonctions de l'API
     435 * ---------------------------------------------------------------------------------------------
     436 */
    379437
    380438/**
     
    402460
    403461
     462/**
     463 * Calcule les états en fonction des états météorologiques natifs fournis par le service.
     464 *
     465 * @internal
     466 *
     467 * @param array $tableau
     468 *        Tableau standardisé des conditions contenant uniquement les données fournies sans traitement
     469 *        par le service. Le tableau est mis à jour et renvoyé à l'appelant.
     470 * @param array $configuration
     471 *        Configuration complète du service, statique et utilisateur.
     472 *
     473 * @return void
     474 */
    404475function etat2resume_wwo(&$tableau, $configuration) {
    405476
     
    426497
    427498                // Determination de l'icone qui sera affiché.
     499                // -- on stocke le code afin de le fournir en alt dans la balise img
     500                $tableau['icone']['code'] = $tableau['code_meteo'];
     501                // -- on calcule le chemin complet de l'icone.
    428502                if ($configuration['condition'] == $configuration['alias']) {
    429                         // On affiche l'icône natif fourni par le service.
    430                         $tableau['icone']['code'] = $tableau['code_meteo'];
    431                         $tableau['icone']['url'] = copie_locale($tableau['icon_meteo']);
     503                        // On affiche l'icône natif fourni par le service et désigné par son url
     504                        // en faisant une copie locale dans IMG/.
     505                        include_spip('inc/distant');
     506                        $tableau['icone']['source'] = copie_locale($tableau['icon_meteo']);
    432507                } else {
    433                         // On affiche l'icône correspondant au code météo transcodé dans le système weather.com.
    434                         $meteo = meteo_wwo2weather($tableau['code_meteo'], $tableau['periode']);
    435                         $tableau['icone'] = $meteo;
     508                        include_spip('inc/rainette_normaliser');
     509                        if ($configuration['condition'] == "{$configuration['alias']}_local") {
     510                                // On affiche un icône d'un thème local compatible avec WWO.
     511                                $chemin = icone_local_normaliser(
     512                                        "{$tableau['code_meteo']}.png",
     513                                        $configuration['alias'],
     514                                        $configuration['theme_local'],
     515                                        $tableau['periode'] == 0 ? 'day' : 'night');
     516                        } else {
     517                                // On affiche l'icône correspondant au code météo transcodé dans le système weather.com.
     518                                $chemin = icone_weather_normaliser(
     519                                        $tableau['code_meteo'],
     520                                        $configuration['theme_weather'],
     521                                        $configuration['transcodage_weather'],
     522                                        $tableau['periode']);
     523                        }
     524                        include_spip('inc/utils');
     525                        $tableau['icone']['source'] = find_in_path($chemin);
    436526                }
    437527        }
    438528}
    439 
    440 
    441 /**
    442  * @internal
    443  *
    444  * @link http://plugins.trac.wordpress.org/browser/weather-and-weather-forecast-widget/trunk/gg_funx_.php
    445  * Transcodage issu du plugin Wordpress weather forecast.
    446  *
    447  * @param string $meteo
    448  * @param int    $periode
    449  *
    450  * @return string
    451  */
    452 function meteo_wwo2weather($meteo, $periode = 0) {
    453         static $wwo2weather = array(
    454                 395 => array(41, 46),
    455                 392 => array(41, 46),
    456                 389 => array(38, 47),
    457                 386 => array(37, 47),
    458                 377 => array(6, 6),
    459                 374 => array(6, 6),
    460                 371 => array(14, 14),
    461                 368 => array(13, 13),
    462                 365 => array(6, 6),
    463                 362 => array(6, 6),
    464                 359 => array(11, 11),
    465                 356 => array(11, 11),
    466                 353 => array(9, 9),
    467                 350 => array(18, 18),
    468                 338 => array(16, 16),
    469                 335 => array(16, 16),
    470                 332 => array(14, 14),
    471                 329 => array(14, 14),
    472                 326 => array(13, 13),
    473                 323 => array(13, 13),
    474                 320 => array(18, 18),
    475                 317 => array(18, 18),
    476                 314 => array(8, 8),
    477                 311 => array(8, 8),
    478                 308 => array(40, 40),
    479                 305 => array(39, 45),
    480                 302 => array(11, 11),
    481                 299 => array(39, 45),
    482                 296 => array(9, 9),
    483                 293 => array(9, 9),
    484                 284 => array(10, 10),
    485                 281 => array(9, 9),
    486                 266 => array(9, 9),
    487                 263 => array(9, 9),
    488                 260 => array(20, 20),
    489                 248 => array(20, 20),
    490                 230 => array(16, 16),
    491                 227 => array(15, 15),
    492                 200 => array(38, 47),
    493                 185 => array(10, 10),
    494                 182 => array(18, 18),
    495                 179 => array(16, 16),
    496                 176 => array(40, 49),
    497                 143 => array(20, 20),
    498                 122 => array(26, 26),
    499                 119 => array(28, 27),
    500                 116 => array(30, 29),
    501                 113 => array(32, 31)
    502         );
    503 
    504         $icone = 'na';
    505         if (array_key_exists($meteo, $wwo2weather)) {
    506                 $icone = strval($wwo2weather[$meteo][$periode]);
    507         }
    508 
    509         return $icone;
    510 }
Note: See TracChangeset for help on using the changeset viewer.