source: spip-zone/_plugins_/taxonomie/trunk/services/wikipedia/wikipedia_api.php @ 114312

Last change on this file since 114312 was 114312, checked in by eric@…, 7 months ago

Une utilisation supplémentaire de l'API objet.
Quelques pétouilles de code.
Ajout des langues manquantes pour wikipedia

  • Property svn:eol-style set to native
File size: 8.9 KB
Line 
1<?php
2/**
3 * Ce fichier contient l'ensemble des constantes et fonctions implémentant le service web de Wikipedia.
4 *
5 * @package SPIP\TAXONOMIE\SERVICES\WIKIPEDIA
6 */
7if (!defined('_ECRIRE_INC_VERSION')) {
8        return;
9}
10
11if (!defined('_TAXONOMIE_WIKIPEDIA_ENDPOINT_BASE_URL')) {
12        /**
13         * Préfixe des URL du service web de WIKIPEDIA.
14         */
15        define('_TAXONOMIE_WIKIPEDIA_ENDPOINT_BASE_URL', 'https://%langue%.wikipedia.org/w/api.php');
16}
17
18if (!defined('_TAXONOMIE_WIKIPEDIA_PAGE_BASE_URL')) {
19        /**
20         * URL de base pour construire une page de Wikipedia dans une langue donnée
21         */
22        define('_TAXONOMIE_WIKIPEDIA_PAGE_BASE_URL', 'https://%langue%.wikipedia.org/wiki/');
23}
24
25if (!defined('_TAXONOMIE_WIKIPEDIA_CACHE_TIMEOUT')) {
26        /**
27         * Période de renouvellement du cache de Wikipedia (30 jours)
28         */
29        define('_TAXONOMIE_WIKIPEDIA_CACHE_TIMEOUT', 86400 * 30);
30}
31
32$GLOBALS['wikipedia_language'] = array(
33        /**
34         * Configuration de la correspondance entre langue Wikipedia et code de langue SPIP.
35         * La langue du service est l'index, le code SPIP est la valeur.
36         */
37        'fr' => 'fr',
38        'en' => 'en',
39        'es' => 'es',
40        'de' => 'de',
41        'pt' => 'pt',
42        'it' => 'it'
43);
44
45
46// ----------------------------------------------------------------------------
47// ------------ API du web service WIKIPEDIA - Actions principales ------------
48// ----------------------------------------------------------------------------
49
50/**
51 * Renvoie, à partir d'une phrase de recherche, soit le texte de la page ou d'une section de la page avec ou pas
52 * la liste des autres pages possibles, soit la liste des langues de la page.
53 * Cette phrase de recherche est toujours le nom scientifique du taxon dans l'utilisation qui en est faite
54 * par le plugin Taxonomie.
55 * Le résultat de la requête est mis en cache pour une durée de plusieurs jours afin d'être servi à nouveau
56 * sans accès à Wikipedia.
57 *
58 * @api
59 * @uses cache_est_valide()
60 * @uses wikipedia_build_url()
61 * @uses inc_taxonomie_requeter()
62 * @uses cache_ecrire()
63 * @uses cache_lire()
64 *
65 * @param array  $search
66 *        Tableau contenant le taxon à cherché sous une forme textuelle et numérique:
67 *        - `name` : chaine de recherche qui est en généralement le nom scientifique du taxon.
68 *        - `tsn`  : identifiant ITIS du taxon, le TSN. Etant donné que ce service s'utilise toujours sur un taxon
69 *                   existant le TSN existe toujours. Il sert à créer le fichier cache.
70 * @param string $spip_language
71 *        Code de langue SPIP dans lequel on souhaite récupérer la page Wikipedia.
72 * @param int    $section
73 *        Section de page dont le texte est à renvoyer. Entier supérieur ou égal à 0 ou `null` pour tout la page.
74 * @param array  $options
75 *        Tableau d'options qui peut contenir les index suivants :
76 *        - `reload`  : force le recalcul du cache.
77 *        Cet argument est optionnel.
78 *
79 * @return array
80 *        Texte trouvé rédigé en mediawiki ou chaine vide sinon. Pour traduire le texte en SPIP
81 *        il est nécessaire d'utiliser le plugin Convertisseur. Néanmoins, le texte même traduit
82 *        doit être remanié manuellement.
83 */
84function wikipedia_get_page($search, $spip_language, $section = null, $options = array()) {
85
86        // Initialisation du tableau de sortie et du tableau d'options
87        $information = array();
88
89        // Si le cache est absent ou invalide on le recrée en utilisant le service web Wikipedia
90        // sinon on le lit et on renvoie le tableau du contenu désérialisé.
91        if (!empty($search['name'] and !empty($search['tsn']))) {
92                // Détermination de la langue Wikipedia
93                $language = wikipedia_find_language($spip_language);
94
95                // Construction des options permettant de nommer le fichier cache.
96                // -- on précise la durée de conservation car ce service utilise 1 mois et pas 6 mois (par défaut).
97                include_spip('inc/cache');
98                $cache = array(
99                        'service'      => 'wikipedia',
100                        'action'       => 'get',
101                        'tsn'          => $search['tsn'],
102                        'language'     => $spip_language,
103                        'conservation' => _TAXONOMIE_WIKIPEDIA_CACHE_TIMEOUT
104                );
105                if ($section !== null) {
106                        $cache['section'] = $section;
107                }
108
109                if (!empty($options['reload'])
110                or (!$file_cache = cache_est_valide('taxonomie', $cache))
111                or (defined('_TAXONOMIE_CACHE_FORCER') ? _TAXONOMIE_CACHE_FORCER : false)) {
112                        // Normaliser la recherche: trim et mise en lettres minuscules
113                        $title = strtolower(trim($search['name']));
114
115                        // Calcul de l'url de la requête: on supprime
116                        $url = wikipedia_build_url($title, $language, $section);
117
118                        // Acquisition des données spécifiées par l'url
119                        $requeter = charger_fonction('taxonomie_requeter', 'inc');
120                        $data = $requeter($url);
121
122                        // Récupération de la section demandée.
123                        if (isset($data['query']['pages'])) {
124                                $reponses = $data['query']['pages'];
125                                $page = reset($reponses);
126                                $id = key($reponses);
127                                if (($id > 0) and !isset($page['missing'])) {
128                                        $information['text'] = isset($page['revisions'][0]['*']) ? $page['revisions'][0]['*'] : '';
129                                        $information['links'] = isset($page['links']) ? $page['links'] : array();
130                                        $information['languages'] = isset($page['langlinks']) ? $page['langlinks'] : array();
131                                }
132
133                                // Mise en cache systématique pour gérer le cas où la page cherchée n'existe pas.
134                                cache_ecrire('taxonomie', $cache, $information);
135                        }
136                } else {
137                        // Lecture et désérialisation du cache
138                        $information = cache_lire('taxonomie', $file_cache);
139                }
140        }
141
142        return $information;
143}
144
145
146// --------------------------------------------------------------------------
147// ------------ API du web service WIKIPEDIA - Fonctions annexes ------------
148// --------------------------------------------------------------------------
149
150/**
151 * Renvoie la langue telle que le service Wikipedia la désigne à partir du code de langue
152 * de SPIP.
153 *
154 * @api
155 *
156 * @param string $spip_language
157 *        Code de langue de SPIP. Prend les valeurs `fr`, `en`, `es`, etc.
158 *        La variable globale `$wikipedia_language` définit le transcodage langue Wikipedia vers code SPIP.
159 *
160 * @return string
161 *        Langue au sens de Wikipedia - `fr`, `en`, `es` - ou chaine vide sinon.
162 */
163function wikipedia_find_language($spip_language) {
164
165        if (!$language = array_search($spip_language, $GLOBALS['wikipedia_language'])) {
166                $language = 'fr';
167        }
168
169        return $language;
170}
171
172
173/**
174 * Construit la phrase de crédits précisant que les données fournies proviennent d'une page de Wikipedia.
175 *
176 * @api
177 *
178 * @param int   $id_taxon
179 *        Id du taxon nécessaire pour construire l'url de la page Wikipedia concernée.
180 * @param array $informations
181 *        Tableau des informations complémentaires sur la source. Pour Wikipedia ce tableau fourni le ou
182 *        les champs remplis avec Wikipedia.
183 *
184 * @return string
185 *      Phrase de crédit.
186 */
187function wikipedia_credit($id_taxon, $informations) {
188        // On recherche le tsn du taxon afin de construire l'url vers sa page sur ITIS
189        $taxon = sql_fetsel('tsn, nom_scientifique', 'spip_taxons', 'id_taxon=' . sql_quote($id_taxon));
190
191        // On crée l'url du taxon sur le site de Wikipedia
192        $url = str_replace('%langue%', 'fr', _TAXONOMIE_WIKIPEDIA_PAGE_BASE_URL)
193                   . rawurlencode($taxon['nom_scientifique']);
194        $link = '<a class="nom_scientifique_inline" href="' . $url . '" rel="noreferrer">' . ucfirst($taxon['nom_scientifique']) . '</a>';
195
196        // La liste des champs concernés (a priori le descriptif)
197        include_spip('inc/taxonomie');
198        $champs = implode(', ', array_map('taxon_traduire_champ', $informations['champs']));
199
200        // On établit la citation
201        $credit = _T('taxonomie:credit_wikipedia', array('champs' => strtolower($champs), 'url_taxon' => $link));
202
203        return $credit;
204}
205
206
207// ----------------------------------------------------------------
208// ------------ Fonctions internes utilisées par l'API ------------
209// ----------------------------------------------------------------
210
211/**
212 * Construit l'URL de la requête Wikipedia correspondant à la demande utilisateur.
213 *
214 * @internal
215 *
216 * @param string $search
217 *        Clé de recherche qui est essentiellement le nom scientifique dans l'utilisation normale.
218 *        Cette clé doit être encodée si besoin par l'appelant.
219 * @param string $language
220 *        Code de langue au sens de Wikipedia qui préfixe l'url du endpoint. Vaut `fr`, `en`, `es` pour l'instant.
221 * @param array  $section
222 *        Section de page dont le texte est à renvoyer. Entier supérieur ou égal à 0 ou `null`
223 *        pour tout la page.
224 *        Cet argument est optionnel.
225 *
226 * @return string
227 *        L'URL de la requête au service
228 */
229function wikipedia_build_url($search, $language, $section = null) {
230
231        // Construire la partie standard de l'URL de l'api sollicitée
232        $url = str_replace('%langue%', $language, _TAXONOMIE_WIKIPEDIA_ENDPOINT_BASE_URL)
233                . '?'
234                . 'action=query'
235                . '&format=json'
236                . '&continue=&redirects=1'
237                . '&prop=revisions|links|langlinks&rvprop=content&pllimit=500&lllimit=500&llprop=url'
238                . '&titles=' . rawurlencode(ucfirst($search));
239
240        // Choix d'une section précise si demandé.
241        $url .= (!empty($section) ? '&rvsection=' . $section : '');
242
243        return $url;
244}
Note: See TracBrowser for help on using the repository browser.