Changeset 100584 in spip-zone


Ignore:
Timestamp:
Nov 20, 2016, 8:51:37 PM (3 years ago)
Author:
eric@…
Message:

Passage de recuperer_page à recuperer_url.
Correction d'un item de langue.
Ajout d'une fonction de normalisation du cache qui simplifie beaucoup le code de création du cache pour cahque service.
Ajout d'une fonction de normalisation du lieu et prise en compte de nouveaux formats pour exprimer le lieu à savoir :

  • adresse IP
  • latitude, longitude

pour les services qui le supportent.

Location:
_plugins_/rainette/trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/rainette/trunk/inc/rainette_normaliser.php

    r100486 r100584  
    33if (!defined('_ECRIRE_INC_VERSION')) {
    44        return;
     5}
     6
     7if (!defined('_RAINETTE_REGEXP_LIEU_IP')) {
     8        /**
     9         * Regexp permettant de reconnaitre un lieu au format adresse IP
     10         */
     11        define('_RAINETTE_REGEXP_LIEU_IP', '#(?:\d{1,3}\.){3}\d{1,3}#');
     12}
     13if (!defined('_RAINETTE_REGEXP_LIEU_COORDONNEES')) {
     14        /**
     15         * Regexp permettant de reconnaitre un lieu au format coordonnées géographiques latitude,longitude
     16         */
     17        define('_RAINETTE_REGEXP_LIEU_COORDONNEES', '#([\-\+]?\d+(?:\.\d+)?)\s*,\s*([\-\+]?\d+(?:\.\d+)?)#');
     18}
     19if (!defined('_RAINETTE_REGEXP_LIEU_WEATHER_ID')) {
     20        /**
     21         * Regexp permettant de reconnaitre un lieu au format Weather ID
     22         */
     23        define('_RAINETTE_REGEXP_LIEU_WEATHER_ID', '#[a-zA-Z]{4}\d{4}#i');
    524}
    625
     
    277296}
    278297
     298
     299function normaliser_lieu($lieu) {
     300
     301        $lieu_normalise = trim($lieu);
     302
     303        if (preg_match(_RAINETTE_REGEXP_LIEU_WEATHER_ID, $lieu_normalise, $match)) {
     304                $format_lieu = 'weather_id';
     305                $lieu_normalise = $match[0];
     306        } elseif (preg_match(_RAINETTE_REGEXP_LIEU_COORDONNEES, $lieu_normalise, $match)) {
     307                $format_lieu = 'latitude_longitude';
     308                $lieu_normalise = "{$match[1]},{$match[2]}";
     309        } elseif (preg_match(_RAINETTE_REGEXP_LIEU_IP, $lieu_normalise, $match)) {
     310                $format_lieu = 'adresse_ip';
     311                $lieu_normalise = $match[0];
     312        } else {
     313                $format_lieu = 'ville_pays';
     314                // On détermine la ville et éventuellement le pays (ville[,pays])
     315                // et on élimine les espaces par un seul +
     316                $elements = explode(',', $lieu_normalise);
     317                $lieu_normalise = trim($elements[0]) . (!empty($elements[1]) ? ',' . trim($elements[1]) : '');
     318                $lieu_normalise = preg_replace('#\s{1,}#', '+', $lieu_normalise);
     319        }
     320
     321        return array($lieu_normalise, $format_lieu);
     322}
     323
     324
     325function normaliser_cache($service, $lieu, $mode, $periodicite, $code_langue) {
     326
     327        // Création et/ou détermination du dossier de destination du cache en fonction du service
     328        $dossier_cache = sous_repertoire(_DIR_CACHE, 'rainette');
     329        $dossier_cache = sous_repertoire($dossier_cache, $service);
     330
     331        // Le nom du fichier cache est composé comme suit, chaque élement étant séparé par un underscore :
     332        // -- le nom du lieu normalisé (sans espace et dont tous les caractères non alphanumériques sont remplacés par un tiret
     333        // -- le nom du mode (infos, conditions ou previsions) accolé à la périodicité du cache pour les prévisions uniquement
     334        // -- la langue du résumé si il existe ou rien si aucune traduction n'est fournie par le service
     335        list($lieu_normalise,) = normaliser_lieu($lieu);
     336        $fichier_cache = $dossier_cache
     337                                         . str_replace(array(' ', ',', '+', '.', '/'), '-', $lieu_normalise)
     338                                         . '_' . $mode
     339                                         . ($periodicite ? strval($periodicite) : '')
     340                                         . ($code_langue ? '_' . strtolower($code_langue) : '')
     341                                         . '.txt';
     342
     343        return $fichier_cache;
     344}
  • _plugins_/rainette/trunk/inc/rainette_phraser.php

    r97957 r100584  
    1515        // Acquisition des données spécifiées par l'url
    1616        include_spip('inc/distant');
    17         $flux = recuperer_page($url);
     17        $flux = recuperer_url($url, array('transcoder' => true));
    1818
    19         if (!$flux) {
    20                 spip_log("URL indiponible : $url", "rainette");
     19        if (empty($flux['page'])) {
     20                spip_log("URL indiponible : ${url}", 'rainette');
    2121                return array();
    2222        }
     
    3232
    3333        try {
    34                 $xml = $convertir(simplexml_load_string($flux), $utiliser_namespace);
     34                $xml = $convertir(simplexml_load_string($flux['page']), $utiliser_namespace);
    3535                $xml = $xml['root'];
    3636        } catch (Exception $e) {
    3737                restore_error_handler();
    38                 spip_log("Erreur d'analyse XML pour l'URL `$url` : " . $e->getMessage(), "rainette");
     38                spip_log("Erreur d'analyse XML pour l'URL `${url}` : " . $e->getMessage(), 'rainette' . _LOG_ERREUR);
    3939                return array();
    4040        }
     
    5454        // Acquisition des données spécifiées par l'url
    5555        include_spip('inc/distant');
    56         $flux = recuperer_page($url);
     56        $flux = recuperer_url($url, array('transcoder' => true));
    5757
    58         if (!$flux) {
    59                 spip_log("URL indiponible : $url", "rainette");
     58        if (empty($flux['page'])) {
     59                spip_log("URL indiponible : ${url}", 'rainette');
    6060                return array();
    6161        }
     
    6363        // Tranformation de la chaine json reçue en tableau associatif
    6464        try {
    65                 $json = json_decode($flux, true);
     65                $json = json_decode($flux['page'], true);
    6666        } catch (Exception $e) {
    67                 spip_log("Erreur d'analyse JSON pour l'URL `$url` : " . $e->getMessage(), "rainette");
     67                spip_log("Erreur d'analyse JSON pour l'URL `${url}` : " . $e->getMessage(), 'rainette' . _LOG_ERREUR);
    6868                return array();
    6969        }
  • _plugins_/rainette/trunk/lang/rainette_fr.php

    r100574 r100584  
    223223
    224224        // R
    225         'region' => 'region',
     225        'region' => 'région',
    226226        'risque_precipitation' => 'risque de précip.',
    227227
  • _plugins_/rainette/trunk/modeles/infos_ville.html

    r100574 r100584  
    1111        <h2 class="ville">[(#ENV{donnees/ville})[, (#ENV{donnees/pays})]]</h2>
    1212        <ul class="coordonnees">
     13                <li><:rainette:latitude|ucfirst:>&nbsp;:[&nbsp;(#ENV{donnees}|table_valeur{latitude, '', #EVAL{true}}|rainette_afficher_unite{angle, 2, #ENV{extras/service}})</li>]
    1314                <li><:rainette:longitude|ucfirst:>&nbsp;:[&nbsp;(#ENV{donnees}|table_valeur{longitude, '', #EVAL{true}}|rainette_afficher_unite{angle, 2, #ENV{extras/service}})</li>]
    14                 <li><:rainette:latitude|ucfirst:>&nbsp;:[&nbsp;(#ENV{donnees}|table_valeur{latitude, '', #EVAL{true}}|rainette_afficher_unite{angle, 2, #ENV{extras/service}})</li>]
    1515                [<li><:rainette:region|ucfirst:>&nbsp;:&nbsp;(#ENV{donnees/region})</li>]
    1616        </ul>
  • _plugins_/rainette/trunk/paquet.xml

    r100580 r100584  
    22        prefix="rainette"
    33        categorie="divers"
    4         version="3.0.16"
     4        version="3.0.17"
    55        etat="test"
    66        compatibilite="]3.1.3;3.2.*]"
  • _plugins_/rainette/trunk/services/owm.php

    r97961 r100584  
    164164 */
    165165function owm_service2cache($lieu, $mode, $periodicite, $configuration) {
    166         $dir = sous_repertoire(_DIR_CACHE, 'rainette');
    167         $dir = sous_repertoire($dir, 'owm');
    168166
    169167        // Identification de la langue du resume.
     
    172170                : $configuration['langue_service'];
    173171
    174         $fichier_cache = $dir
    175                                          . str_replace(array(' ', ',', '+', '.', '/'), '-', trim($lieu))
    176                                          . '_' . $mode
    177                                          . ($periodicite ? strval($periodicite) : '')
    178                                          . '_' . strtolower($code_langue)
    179                                          . '.txt';
     172        // Construction du chemin du fichier cache
     173        include_spip('inc/rainette_normaliser');
     174        $fichier_cache = normaliser_cache('owm', $lieu, $mode, $periodicite, $code_langue);
    180175
    181176        return $fichier_cache;
     
    205200                : $configuration['langue_service'];
    206201
     202        // On normalise le lieu et on récupère son format.
     203        // Le service accepte la format ville,pays et le format latitude,longitude
     204        include_spip('inc/rainette_normaliser');
     205        list($lieu_normalise, $format_lieu) = normaliser_lieu($lieu);
     206        if ($format_lieu == 'latitude_longitude') {
     207                list($latitude, $longitude) = explode(',', $lieu_normalise);
     208                $query = "lat=${latitude}&lon=${longitude}";
     209        } else {
     210                // Format ville,pays
     211                $query = "q=${lieu_normalise}";
     212        }
     213
    207214        $url = _RAINETTE_OWM_URL_BASE_REQUETE
    208215                   . $demande . '?'
    209                    . 'q=' . str_replace(' ', '+', trim($lieu))
     216                   . $query
    210217                   . '&mode=' . $configuration['format_flux']
    211218                   . '&units=' . ($configuration['unite'] == 'm' ? 'metric' : 'imperial')
  • _plugins_/rainette/trunk/services/weather.php

    r100577 r100584  
    2929                'lien'  => 'http://www.weather.com/',
    3030        ),
    31         'langue_service' => ''
     31        'langue_service' => 'en'
    3232);
    3333
     
    152152 */
    153153function weather_service2cache($lieu, $mode, $periodicite, $configuration) {
    154         $dir = sous_repertoire(_DIR_CACHE, 'rainette');
    155         $dir = sous_repertoire($dir, 'weather');
    156 
    157         $f = $dir
    158                  . strtoupper(trim($lieu))
    159                  . '_' . $mode
    160                  . ($periodicite ? strval($periodicite) : '')
    161                  . '.txt';
    162 
    163         return $f;
     154
     155        // Identification de la langue du resume : pas de traduction pour ce service
     156        // le résumé est toujours en anglais.
     157        $code_langue = $configuration['langue_service'];
     158
     159        // Construction du chemin du fichier cache
     160        include_spip('inc/rainette_normaliser');
     161        $fichier_cache = normaliser_cache('weather', $lieu, $mode, $periodicite, $code_langue);
     162        return $fichier_cache;
    164163}
    165164
     
    175174function weather_service2url($lieu, $mode, $periodicite, $configuration) {
    176175
     176
     177        // On normalise le lieu et on récupère son format.
     178        // Le service accepte la format ville,pays, le format latitude,longitude et le format adresse IP.
     179        // Néanmoins, la query a toujours la même forme; il n'est donc pas nécessaire de gérer le format.
     180        include_spip('inc/rainette_normaliser');
     181        list($lieu_normalise,) = normaliser_lieu($lieu);
     182
    177183        $url = _RAINETTE_WEATHER_URL_BASE
    178            . strtoupper(trim($lieu))
     184           . $lieu_normalise
    179185           . '?unit='
    180186           . $configuration['unite'];
  • _plugins_/rainette/trunk/services/wunderground.php

    r100486 r100584  
    180180 */
    181181function wunderground_service2cache($lieu, $mode, $periodicite, $configuration) {
    182         $dir = sous_repertoire(_DIR_CACHE, 'rainette');
    183         $dir = sous_repertoire($dir, 'wunderground');
    184182
    185183        // Identification de la langue du resume.
     
    188186                : $configuration['langue_service'];
    189187
    190         $fichier_cache = $dir
    191                                          . str_replace(array(' ', ',', '+', '.', '/'), '-', trim($lieu))
    192                                          . '_' . $mode
    193                                          . ($periodicite ? strval($periodicite) : '')
    194                                          . '_' . strtolower($code_langue)
    195                                          . '.txt';
     188        // Construction du chemin du fichier cache
     189        include_spip('inc/rainette_normaliser');
     190        $fichier_cache = normaliser_cache('wunderground', $lieu, $mode, $periodicite, $code_langue);
    196191
    197192        return $fichier_cache;
     
    233228        }
    234229
    235         // Identification et formatage du lieu.
    236         // Le service Wunderground permet d'utiliser les codes de Weather comme FRXX0076 pour Paris.
    237         // On détecte donc le format du lieu.
    238         $query = str_replace(array(' ', ','), array('', '/'), trim($lieu));
    239         if (preg_match('#[a-zA-Z]{4}[0-9]{4}#', $query)) {
    240                 $query = 'locid:' . strtoupper($query);
    241         } else {
    242                 $index = strpos($query, '/');
    243                 if ($index !== false) {
    244                         $ville = substr($query, 0, $index);
    245                         $pays = substr($query, $index + 1, strlen($query) - $index - 1);
    246                         $query = $pays . '/' . $ville;
     230        // On normalise le lieu et on récupère son format.
     231        // Le service accepte la format ville,pays, le format latitude,longitude, le format adresse IP
     232        // et le format weather ID (comme FRXX0076 pour Paris).
     233        include_spip('inc/rainette_normaliser');
     234        list($lieu_normalise, $format_lieu) = normaliser_lieu($lieu);
     235        if ($format_lieu == 'weather_id') {
     236                $query = "locid:${lieu_normalise}";
     237        } elseif ($format_lieu == 'adresse_ip') {
     238                $query = "autoip.json?geo_ip=${lieu_normalise}";
     239        } elseif ($format_lieu == 'latitude_longitude') {
     240                $query = $lieu_normalise;
     241        } else { // Format ville,pays
     242                $query = $lieu_normalise;
     243                $elements = explode(',', $lieu_normalise);
     244                if (count($elements) == 2) {
     245                        // Le pays est précisé, il faut alors le positionner avant la ville et le séparer par un slash.
     246                        $query = $elements[1] . '/' . $elements[0];
    247247                }
    248248        }
  • _plugins_/rainette/trunk/services/wwo.php

    r97961 r100584  
    172172 * @param int    $periodicite
    173173 *        La périodicité horaire des prévisions :
    174  *            - `24`, `12`, `6`, `3` ou `1`, pour le mode `previsions`
    175  *            - `0`, pour les modes `conditions` et `infos`
     174 *        - `24`, `12`, `6`, `3` ou `1`, pour le mode `previsions`
     175 *        - `0`, pour les modes `conditions` et `infos`
    176176 * @param array  $configuration
    177177 *        Configuration complète du service, statique et utilisateur.
     
    181181 */
    182182function wwo_service2cache($lieu, $mode, $periodicite, $configuration) {
    183         $dir = sous_repertoire(_DIR_CACHE, 'rainette');
    184         $dir = sous_repertoire($dir, 'wwo');
    185183
    186184        // Identification de la langue du resume.
     
    189187                : $configuration['langue_service'];
    190188
    191         $fichier_cache = $dir
    192                                          . str_replace(array(' ', ',', '+', '.', '/'), '-', trim($lieu))
    193                                          . '_' . $mode
    194                                          . ($periodicite ? strval($periodicite) : '')
    195                                          . '_' . strtolower($code_langue)
    196                                          . '.txt';
     189        // Construction du chemin du fichier cache
     190        include_spip('inc/rainette_normaliser');
     191        $fichier_cache = normaliser_cache('wwo', $lieu, $mode, $periodicite, $code_langue);
    197192
    198193        return $fichier_cache;
     
    208203 *
    209204 * @param string $lieu
    210  *        Lieu pour lequel requiert les données météorologiques.
     205 *        Lieu pour lequel on acquiert les données météorologiques.
    211206 * @param string $mode
    212207 *        Type de données météorologiques. Les valeurs possibles sont `infos`, `conditions` ou `previsions`.
    213208 * @param int    $periodicite
    214209 *        La périodicité horaire des prévisions :
    215  *            - `24`, `12`, `6`, `3` ou `1`, pour le mode `previsions`
    216  *            - `0`, pour les modes `conditions` et `infos`
     210 *        - `24`, `12`, `6`, `3` ou `1`, pour le mode `previsions`
     211 *        - `0`, pour les modes `conditions` et `infos`
    217212 * @param array  $configuration
    218213 *        Configuration complète du service, statique et utilisateur.
     
    227222                ? langue2code_wwo($GLOBALS['spip_lang'])
    228223                : $configuration['langue_service'];
     224
     225        // On normalise le lieu et on récupère son format.
     226        // Le service accepte la format ville,pays, le format latitude,longitude et le format adresse IP.
     227        // Néanmoins, la query a toujours la même forme; il n'est donc pas nécessaire de gérer le format.
     228        include_spip('inc/rainette_normaliser');
     229        list($lieu_normalise,) = normaliser_lieu($lieu);
    229230
    230231        $url = _RAINETTE_WWO_URL_BASE
     
    233234                   . '&extra=localObsTime'
    234235                   . '&lang=' . $code_langue
    235                    . '&q=' . str_replace(' ', '+', trim($lieu));
     236                   . '&q=' . $lieu_normalise;
    236237
    237238        if ($mode == 'infos') {
Note: See TracChangeset for help on using the changeset viewer.