Changeset 97265 in spip-zone


Ignore:
Timestamp:
May 6, 2016, 8:06:22 PM (4 years ago)
Author:
eric@…
Message:

Amélioration de l'api wikipédia.
On peut maintenant soit récupérer le texte de l'article soit la liste des langues de l'article

Location:
_plugins_/taxonomie/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/taxonomie/trunk/action/taxonomie_get_wikipedia.php

    r96993 r97265  
    5454                        include_spip('services/wikipedia/wikipedia_api');
    5555                        $langue = wikipedia_spipcode2language($spip_langue); // TODO : attention à gérer la langue en amont
    56                         $information = wikipedia_get($taxon['tsn'], $nom_scientifique, $langue, $section);
    57                         if ($information['texte']) {
     56                        $options = array('language' => $langue, 'section' => $section);
     57                        $information = wikipedia_get('text', $taxon['tsn'], $nom_scientifique, $options);
     58                        if ($information['text']) {
    5859                                // Si le plugin Convertisseur est actif, conversion du texte mediawiki vers SPIP.
    5960                                // Mise en format multi systématique.
     
    6263                                $texte_converti = '<multi>'
    6364                                                                  . '[' . $spip_langue . ']'
    64                                                                   . ($convertir ? $convertir($information['texte'], 'MediaWiki_SPIP') : $information['texte'])
     65                                                                  . ($convertir ? $convertir($information['text'], 'MediaWiki_SPIP') : $information['texte'])
    6566                                                                  . '</multi>';
    6667
  • _plugins_/taxonomie/trunk/inc/taxonomer.php

    r96992 r97265  
    186186         */
    187187        define('_TAXONOMIE_CACHE_DIR', _DIR_VAR . _TAXONOMIE_CACHE_NOMDIR);
     188}
     189if (!defined('_TAXONOMIE_CACHE_FORCER')) {
     190        /**
     191         * Indicateur permettant de focer le recalcul du cache systématiquement.
     192         * A n'utiliser que temporairement en mode debug par exemple.
     193         *
     194         * @package SPIP\TAXONOMIE\CACHE
     195         */
     196        define('_TAXONOMIE_CACHE_FORCER', false);
    188197}
    189198
     
    343352 *        d'appeler cette fonction.
    344353 * @param string $service
     354 * @param string $action
    345355 * @param int    $tsn
    346  * @param string $spip_langue
    347  * @param string $action
     356 * @param array  $options
    348357 *
    349358 * @return boolean
    350359 *        Toujours à vrai.
    351360 */
    352 function cache_taxonomie_ecrire($cache, $service, $tsn, $spip_langue = '', $action = '') {
     361function cache_taxonomie_ecrire($cache, $service, $action, $tsn, $options) {
    353362        // Création du dossier cache si besoin
    354363        sous_repertoire(_DIR_VAR, trim(_TAXONOMIE_CACHE_NOMDIR, '/'));
    355364
    356365        // Ecriture du fichier cache
    357         $fichier_cache = cache_taxonomie_nommer($service, $tsn, $spip_langue, $action);
     366        $fichier_cache = cache_taxonomie_nommer($service, $tsn, $action, $options);
    358367        ecrire_fichier($fichier_cache, $cache);
    359368
     
    363372
    364373/**
    365  * Construit le nom du fichier cache en fonction du service, du taxon concernés et
     374 * Construit le nom du fichier cache en fonction du service, de l'action, du taxon concernés et
    366375 * d'autres critères optionnels.
    367376 *
     
    369378 *
    370379 * @param string $service
     380 * @param string $action
    371381 * @param int    $tsn
    372  * @param string $spip_langue
    373  * @param string $action
     382 * @param array  $options
    374383 *
    375384 * @return string
    376385 */
    377 function cache_taxonomie_nommer($service, $tsn, $spip_langue = '', $action = '') {
     386function cache_taxonomie_nommer($service, $action, $tsn, $options) {
    378387        // Construction du chemin complet d'un fichier cache
    379388        $fichier_cache = _TAXONOMIE_CACHE_DIR
    380389                                         . $service
    381390                                         . ($action ? '_' . $action : '')
    382                                          . '_' . $tsn
    383                                          . ($spip_langue ? '_' . $spip_langue : '')
    384                                          . '.txt';
     391                                         . '_' . $tsn;
     392
     393        // On complète le nom avec les options éventuelles
     394        if ($options) {
     395                foreach ($options as $_option => $_valeur) {
     396                        if ($_valeur) {
     397                                $fichier_cache .= '_' . $_valeur;
     398                        }
     399                }
     400        }
     401
     402        // On rajoute l'extension texte
     403        $fichier_cache .= '.txt';
    385404
    386405        return $fichier_cache;
     
    388407
    389408/**
    390  * Vérifie l'existence du fichier cache pour un taxon et un service donnés.
     409 * Vérifie l'existence du fichier cache pour un taxon, un service et une actions donnés.
    391410 * Si le fichier existe la fonction retourne son chemin complet.
    392411 *
     
    394413 *
    395414 * @param string $service
     415 * @param string $action
    396416 * @param int    $tsn
    397  * @param string $spip_langue
    398  * @param string $action
     417 * @param array  $options
    399418 *
    400419 * @return string
    401420 *        Chemin du fichier cache si il existe ou chaine vide sinon.
    402421 */
    403 function cache_taxonomie_existe($service, $tsn, $spip_langue = '', $action = '') {
     422function cache_taxonomie_existe($service, $action, $tsn, $options = array()) {
    404423        // Contruire le nom du fichier cache
    405         $fichier_cache = cache_taxonomie_nommer($service, $tsn, $spip_langue, $action);
     424        $fichier_cache = cache_taxonomie_nommer($service, $action, $tsn, $options);
    406425
    407426        // Vérification de l'existence du fichier:
  • _plugins_/taxonomie/trunk/services/wikipedia/wikipedia_api.php

    r96993 r97265  
    4747
    4848/**
    49  * Renvoie le texte de la page ou d'une section de la page à partir d'une phrase de recherche.
     49 * Renvoie, à partir d'une phrase de recherche, soit le texte de la page ou d'une section de la page,
     50 * soit la liste des langues de la page.
    5051 * Cette phrase de recherche est toujours le nom scientifique du taxon dans l'utilisation qui en est faite
    5152 * par le plugin Taxonomie.
     
    5960 * @uses service_requeter_json()
    6061 *
     62 * @param string   $resource
     63 *      Chaine indiquant le type d'information à récupérer pour le taxon donné:
     64 *      - `text`      : le texte de l'article ou d'une section de l'article
     65 *              - `languages` : la liste des langues de l'article concerné
    6166 * @param int      $tsn
    62  *        Identifiant ITIS du taxon, le TSN. Etant donné que ce service s'utilise toujours sur un taxon
    63  *        existant le TSN existe toujours. Il sert à créer le fichier cache.
     67 *      Identifiant ITIS du taxon, le TSN. Etant donné que ce service s'utilise toujours sur un taxon
     68 *      existant le TSN existe toujours. Il sert à créer le fichier cache.
    6469 * @param string   $search
    65  *        Chaine de recherche qui est en généralement le nom scientifique du taxon.
     70 *      Chaine de recherche qui est en généralement le nom scientifique du taxon.
    6671 * @param string   $language
    67  *        Langue au sens de Wikipedia qui préfixe l'url du endpoint. Vaut `fr`, `en`, `es`...
     72 *      Langue au sens de Wikipedia qui préfixe l'url du endpoint. Vaut `fr`, `en`, `es`...
    6873 * @param int|null $section
    69  *        Section de page dont le texte est à renvoyer. Entier supérieur ou égal à 0 ou `null` pour tout la page.
    70  *        Cet argument est optionnel.
    71  *
    72  * @return string
    73  *        Texte trouvé rédigé en mediawiki ou chaine vide sinon. Pour traduire le texte en SPIP
    74  *        il est nécessaire d'utiliser le plugin Convertisseur. Néanmoins, le texte même traduit
    75  *        doit être remanié manuellement.
    76  */
    77 function wikipedia_get($tsn, $search, $language, $section = null) {
    78         $information = array('texte' => '');
     74 *      Section de page dont le texte est à renvoyer. Entier supérieur ou égal à 0 ou `null` pour tout la page.
     75 *      Cet argument est optionnel.
     76 *
     77 * @return string|array
     78 *      Texte trouvé rédigé en mediawiki ou chaine vide sinon. Pour traduire le texte en SPIP
     79 *      il est nécessaire d'utiliser le plugin Convertisseur. Néanmoins, le texte même traduit
     80 *      doit être remanié manuellement.
     81 */
     82function wikipedia_get($resource, $tsn, $search, $options = array()) {
     83
     84        // Initialisation du tableau de sortie et du tableau d'options
     85        $information = array();
    7986
    8087        // Si le cache est absent ou invalide on le recrée en utilisant le service web Wikipedia
    81         // sinon on le litet on revoie le tableau du contenu désérialisé.
     88        // sinon on le lit et on renvoie le tableau du contenu désérialisé.
    8289        include_spip('inc/taxonomer');
    83         if (!$file_cache = cache_taxonomie_existe('wikipedia', $tsn, $language)
    84                 or !filemtime($file_cache)
    85                 or (time() - filemtime($file_cache) > _TAXONOMIE_WIKIPEDIA_CACHE_TIMEOUT)
    86         ) {
     90        if (!$file_cache = cache_taxonomie_existe('wikipedia', $resource, $tsn, $options)
     91        or !filemtime($file_cache)
     92        or (time() - filemtime($file_cache) > _TAXONOMIE_WIKIPEDIA_CACHE_TIMEOUT)
     93        or (_TAXONOMIE_CACHE_FORCER)) {
    8794                // Normaliser la recherche: trim et mise en lettres minuscules
    8895                $search = strtolower(trim($search));
     
    9097                // Construire l'URL de la function de recherche par nom vernaculaire.
    9198                // L'encodage de la recherche est effectuée dans la fonction.
    92                 $url = api2url_wikipedia('json', 'query', $language, $search, $section);
     99                $url = api2url_wikipedia('json', 'query', $resource, $search, $options);
    93100
    94101                // Acquisition des données spécifiées par l'url
    95                 include_spip('inc/taxonomer');
    96102                $data = service_requeter_json($url);
    97103
    98104                // Récupération de la section demandée.
    99105                if (isset($data['batchcomplete'])
    100                         and isset($data['query']['pages'])
    101                 ) {
     106                and isset($data['query']['pages'])) {
    102107                        $reponses = $data['query']['pages'];
    103108                        $page = reset($reponses);
    104109                        $id = key($reponses);
    105                         if (($id > 0) and !isset($page['missing']) and isset($page['revisions'][0]['*'])) {
    106                                 $information['texte'] = $page['revisions'][0]['*'];
     110                        if (($id > 0) and !isset($page['missing'])) {
     111                                if (($resource == 'text') and isset($page['revisions'][0]['*'])) {
     112                                        $information[$resource] = $page['revisions'][0]['*'];
     113                                } elseif (($resource == 'languages')) {
     114                                        $information[$resource] = $page['revisions'][0]['langlinks'];
     115                                }
    107116                        }
    108117                }
    109118
    110119                // Mise en cache
    111                 cache_taxonomie_ecrire(serialize($information), 'wikipedia', $tsn, $language);
     120                cache_taxonomie_ecrire(serialize($information), 'wikipedia', $resource, $tsn, $options);
    112121        } else {
    113122                // Lecture et désérialisation du cache
     
    193202 * @param string   $action
    194203 *        Nom de l'action du service Wikipedia. La seule action `query` est utilisée dans cette API.
    195  * @param string   $language
    196  *        Langue au sens de Wikipedia en minuscules. Prend les valeurs `fr`, `en`, `es`, etc.
     204 * @param string   $resource
     205 *      Chaine indiquant le type d'information à récupérer pour le taxon donné:
     206 *      - `text`      : le texte de l'article ou d'une section de l'article
     207 *              - `languages` : la liste des langues de l'article concerné
    197208 * @param string   $search
    198209 *        Clé de recherche qui est essentiellement le nom scientifique dans l'utilisation normale.
    199210 *        Cette clé doit être encodée si besoin par l'appelant.
     211 * @param string   $language
     212 *        Langue au sens de Wikipedia en minuscules. Prend les valeurs `fr`, `en`, `es`, etc.
    200213 * @param int|null $section
    201214 *        Section de la page à renvoyer. Valeur entière de 0 à n ou null si on veut toute la page.
     
    204217 *        L'URL de la requête au service
    205218 */
    206 function api2url_wikipedia($format, $action, $language, $search, $section) {
    207 
    208         // Construire l'URL de l'api sollicitée
     219function api2url_wikipedia($format, $action, $resource, $search, $options) {
     220
     221        // Construire la partie standard de l'URL de l'api sollicitée
     222        $language = !empty($options['language']) ? $options['language'] : 'fr';
    209223        $url = str_replace('%langue%', $language, _TAXONOMIE_WIKIPEDIA_ENDPOINT_BASE_URL) . '?'
    210224                   . 'action=' . $action
    211                    . '&meta=siteinfo|wikibase'
    212                    . '&prop=revisions&rvprop=content'
    213                    . (!is_null($section) ? '&rvsection=' . $section : '')
    214                    . '&continue=&redirects=1'
    215225                   . '&format=' . $format
    216                    . '&titles=' . rawurlencode(ucfirst($search));
     226                   . '&titles=' . rawurlencode(ucfirst($search))
     227                   . '&continue=&redirects=1';
     228
     229        // Finalisation de l'URL suivant le type de ressource demandée.
     230        switch ($resource) {
     231                case 'text':
     232                        $url .= '&meta=siteinfo|wikibase'
     233                             . '&prop=revisions&rvprop=content'
     234                             . (!empty($options['section']) ? '&rvsection=' . $options['section'] : '');
     235                        break;
     236                case 'languages':
     237                        $url .= '&prop=langlinks&lllimit=500';
     238                        break;
     239        }
    217240
    218241        return $url;
Note: See TracChangeset for help on using the changeset viewer.