source: spip-zone/_plugins_/isocode/trunk/services/iso/iso_api.php @ 100375

Last change on this file since 100375 was 100375, checked in by eric@…, 3 years ago

Mise au point des commentaires.

  • Property svn:eol-style set to native
File size: 15.0 KB
Line 
1<?php
2/**
3 * Ce fichier contient l'ensemble des constantes et fonctions implémentant le service ISO.
4 * Etant donné que la lecture des sources est réalisée par une fonction générique `lire_source` ce
5 * fichier ne contient que les fonctions spécifiques permettant de compléter les champs de base fournis
6 * par la source.
7 *
8 * @package SPIP\ISOCODE\SERVICES\ISO
9 */
10if (!defined('_ECRIRE_INC_VERSION')) {
11        return;
12}
13
14
15if (!defined('_ISOCODE_SIL_ISO639_3_ENDPOINT')) {
16        /**
17         * URL de base pour charger la page de documentation d'un code de langue alpha-3 sur le site
18         * sil.org. Complément à la table iso639families
19         */
20        define('_ISOCODE_SIL_ISO639_3_ENDPOINT', 'http://www-01.sil.org/iso639-3/documentation.asp?id=');
21}
22if (!defined('_ISOCODE_LOC_ISO639_5_HIERARCHY')) {
23        /**
24         * URL de base pour charger la page du tableau de la hiérarchie ISO-639-5 sur le site
25         * de la Library of Congress. Complément à la table iso639families
26         */
27        define('_ISOCODE_LOC_ISO639_5_HIERARCHY', 'https://www.loc.gov/standards/iso639-5/hier.php');
28}
29if (!defined('_ISOCODE_GEONAMES_INFORMATIONS_PAYS')) {
30        /**
31         * Chemin du fichier Geonames contenant des informations géographiques sur les pays.
32         * Complément à la table iso639countries.
33         */
34        define('_ISOCODE_GEONAMES_INFORMATIONS_PAYS', 'services/iso/iso3166countries-geonames-info.txt');
35}
36if (!defined('_ISOCODE_IOTA_ISO4217_SYMBOL')) {
37        /**
38         * URL de base pour charger la page du tableau des devises ISO-4217 sur le site
39         * de IOTA Finance qui permet de compléter les informations de base de l'ISO-4217.
40         * Complément à la table iso639currencies.
41         */
42        define('_ISOCODE_IOTA_ISO4217_SYMBOL', 'http://www.iotafinance.com/Codes-ISO-Devises.html');
43}
44
45
46$GLOBALS['isocode']['iso']['tables'] = array(
47        'iso639codes'       => array(
48                'basic_fields' => array(
49                        'Id'            => 'code_639_3',
50                        'Part2B'        => 'code_639_2b',
51                        'Part2T'        => 'code_639_2t',
52                        'Part1'         => 'code_639_1',
53                        'Scope'         => 'scope',
54                        'Language_Type' => 'type',
55                        'Ref_Name'      => 'ref_name',
56                        'Comment'       => 'comment'
57                ),
58                'populating'   => 'file_csv',
59                'delimiter'    => "\t",
60                'extension'    => '.tab'
61        ),
62        'iso639names'       => array(
63                'basic_fields' => array(
64                        'Id'            => 'code_639_3',
65                        'Print_Name'    => 'print_name',
66                        'Inverted_Name' => 'inverted_name'
67                ),
68                'populating'   => 'file_csv',
69                'delimiter'    => "\t",
70                'extension'    => '.tab'
71        ),
72        'iso639macros'      => array(
73                'basic_fields' => array(
74                        'M_Id'     => 'macro_639_3',
75                        'I_Id'     => 'code_639_3',
76                        'I_Status' => 'status'
77                ),
78                'populating'   => 'file_csv',
79                'delimiter'    => "\t",
80                'extension'    => '.tab'
81        ),
82        'iso639retirements' => array(
83                'basic_fields' => array(
84                        'Id'         => 'code_639_3',
85                        'Ref_Name'   => 'ref_name',
86                        'Ret_Reason' => 'ret_reason',
87                        'Change_To'  => 'change_to',
88                        'Ret_Remedy' => 'ret_remedy',
89                        'Effective'  => 'effective_date'
90                ),
91                'populating'   => 'file_csv',
92                'delimiter'    => "\t",
93                'extension'    => '.tab'
94        ),
95        'iso639families'    => array(
96                'basic_fields' => array(
97                        'URI'             => 'uri',
98                        'code'            => 'code_639_5',
99                        'Label (English)' => 'label_en',
100                        'Label (French)'  => 'label_fr'
101                ),
102                'addon_fields' => array(
103                        'sil' => array(
104                                'Equivalent' => 'code_639_1',
105                                'Code set'   => 'code_set',
106                                'Code sets'  => 'code_set',
107                                'Scope'      => 'scope'
108                        ),
109                        'loc' => array(
110                                'Hierarchy' => 'hierarchy',
111                                'parent'    => 'parent'                 // Colonne est calculée à partir de la hiérarchie
112                        )
113                ),
114                'populating'   => 'file_csv',
115                'delimiter'    => "\t",
116                'extension'    => '.tab'
117        ),
118        'iso15924scripts'   => array(
119                'basic_fields' => array(
120                        'Code'         => 'code_15924',
121                        'English Name' => 'label_en',
122                        'Nom français' => 'label_fr',
123                        'N°'           => 'code_num',
124                        'PVA'          => 'alias_en',
125                        'Date'         => 'date_ref',
126                ),
127                'populating'   => 'file_csv',
128                'delimiter'    => ';',
129                'extension'    => '.txt'
130        ),
131        'iso3166countries'  => array(
132                'basic_fields' => array(
133                        'English name' => 'label_en',
134                        'French name'  => 'label_fr',
135                        'Alpha-2'      => 'code_alpha2',
136                        'Alpha-3'      => 'code_alpha3',
137                        'Numeric'      => 'code_num',
138                ),
139                'addon_fields' => array(
140                        'geonames' => array(
141                                'Capital'        => 'capital',
142                                'Area(in sq km)' => 'area',
143                                'Population'     => 'population',
144                                'Continent'      => 'code_continent',
145                                'tld'            => 'tld',
146                                'CurrencyCode'   => 'code_4217_3',
147                                'CurrencyName'   => 'currency_en',
148                                'Phone'          => 'phone_id',
149                        )
150                ),
151                'populating'   => 'file_csv',
152                'delimiter'    => ';',
153                'extension'    => '.txt'
154        ),
155        'iso4217currencies' => array(
156                'basic_fields' => array(
157                        'Ccy'        => 'code_4217_3',
158                        'CcyNbr'     => 'code_num',
159                        'CcyNm'      => 'label_en',
160                        'CcyMnrUnts' => 'minor_units',
161                ),
162                'addon_fields' => array(
163                        'iota' => array(
164                                'Symbol devise' => 'symbol',
165                                'Devise'        => 'label_fr',
166                        )
167                ),
168                'populating'   => 'file_xml',
169                'extension'    => '.xml',
170                'base'         => 'CcyTbl/CcyNtry'      // clé à laquelle débute la liste des éléments
171        ),
172);
173
174
175// ----------------------------------------------------------------------------
176// ----------------- API du service ISO - Actions spécifiques -----------------
177// ----------------------------------------------------------------------------
178
179function iso639families_completer_enregistrement($enregistrement, $config) {
180
181        // Initialisation
182        static $enregistrement_sil_defaut = array();
183
184        // Initialisation des champs additionnels dans l'enregistrement passé en argument
185        // (qui contient déjà les champs de base).
186        $config_champs_sil = $config['addon_fields']['sil'];
187        if (!$enregistrement_sil_defaut) {
188                include_spip('inc/isocode_sourcer');
189                $enregistrement_sil_defaut = initialiser_enregistrement('iso639families', $config_champs_sil);
190        }
191        $enregistrement = array_merge($enregistrement, $enregistrement_sil_defaut);
192
193        // On récupère la page de description de la famille sur le site SIL.
194        include_spip('inc/distant');
195        $url = _ISOCODE_SIL_ISO639_3_ENDPOINT . $enregistrement['code_639_5'];
196        $flux = recuperer_url($url, array('transcoder' => true));
197
198        // On décrypte la page et principalement le premier tableau pour en extraire les données
199        // additionnelles suivantes :
200        // - scope : C(ollective)
201        // - equivalent : éventuellement le code ISO-639-1
202        // - code set(s) : ISO-639-5 et/ou ISO-639-2
203        include_spip('inc/filtres');
204        $table = extraire_balise($flux['page'], 'table');
205        if ($table) {
206                // On extrait la première table de la page qui contient les données voulues
207                $lignes = extraire_balises($table, 'tr');
208                if ($lignes) {
209                        foreach ($lignes as $_ligne) {
210                                // Chaque ligne de la table est composée de deux colonnes, la première le libellé
211                                // et la deuxième la valeur.
212                                $colonnes = extraire_balises($_ligne, 'td');
213                                $colonnes = array_map('supprimer_tags', $colonnes);
214                                $colonnes = array_map('trim', $colonnes);
215                                if (count($colonnes) == 2) {
216                                        $titre = trim(substr($colonnes[0], 0, strpos($colonnes[0], ':')));
217                                        if (isset($config_champs_sil[$titre])) {
218                                                $valeur = str_replace(' ', '', $colonnes[1]);
219                                                switch ($titre) {
220                                                        case 'Equivalent':
221                                                                $equivalent = explode(':', $valeur);
222                                                                $enregistrement[$config_champs_sil[$titre]] = isset($equivalent[1]) ? trim($equivalent[1]) : '';
223                                                                break;
224                                                        case 'Code sets':
225                                                        case 'Code set':
226                                                                $enregistrement[$config_champs_sil[$titre]] = str_replace('and', ',', $valeur);
227                                                                break;
228                                                        case 'Scope':
229                                                                $enregistrement[$config_champs_sil[$titre]] = substr($valeur, 0, 1);
230                                                                break;
231                                                        default:
232                                                                break;
233                                                }
234                                        }
235                                }
236                        }
237                }
238        }
239
240        return $enregistrement;
241}
242
243
244function iso639families_completer_table($enregistrements, $config) {
245
246        // Initialisation des champs additionnels
247        $hierarchies = array();
248        $config_champs_loc = $config['addon_fields']['loc'];
249        include_spip('inc/isocode_sourcer');
250        $enregistrement_loc_defaut = initialiser_enregistrement('iso639families', $config_champs_loc);
251
252        // On récupère la page de description de la famille sur le site SIL.
253        include_spip('inc/distant');
254        $url = _ISOCODE_LOC_ISO639_5_HIERARCHY;
255        $flux = recuperer_url($url, array('transcoder' => true));
256
257        // On décrypte la page et principalement le tableau pour en extraire la colonne hiérarchie
258        // de chaque famille et créer la colonne parent dans la table iso639families.
259        include_spip('inc/filtres');
260        $table = extraire_balise($flux['page'], 'table');
261        if ($table) {
262                // On extrait la première table de la page qui contient les données voulues
263                $lignes = extraire_balises($table, 'tr');
264                if ($lignes) {
265                        // La première ligne du tableau est celle des titres de colonnes : on la supprime.
266                        array_shift($lignes);
267                        foreach ($lignes as $_ligne) {
268                                // Chaque ligne de la table est composée de deux colonnes, le première le libellé
269                                // et la deuxième la valeur.
270                                $colonnes = extraire_balises($_ligne, 'td');
271                                $colonnes = array_map('supprimer_tags', $colonnes);
272                                if (count($colonnes) >= 2) {
273                                        // La première colonne contient la hiérarchie et la seconde le code alpha-3 de la famille.
274                                        $code = trim($colonnes[1]);
275                                        $hierarchies[$code] = str_replace(array(' ', ':'), array('', ','), trim($colonnes[0]));
276                                }
277                        }
278                }
279        }
280
281        // On complète maintenant le tableau des enregistrements avec la colonne additionnelle hierarchy et la colonne
282        // dérivée parent qui ne contient que le code alpha-3 de la famille parente si elle existe.
283        foreach ($enregistrements as $_cle => $_enregistrement) {
284                $enregistrements[$_cle] = array_merge($enregistrements[$_cle], $enregistrement_loc_defaut);
285                $code = $_enregistrement['code_639_5'];
286                if (isset($hierarchies[$code])) {
287                        $enregistrements[$_cle][$config_champs_loc['Hierarchy']] = $hierarchies[$code];
288                        // Calcul du parent : si la hiérarchie ne contient qu'un code c'est qu'il n'y a pas de parent.
289                        // Sinon, le parent est le premier code qui précède le code du record.
290                        $parents = explode(',', $hierarchies[$code]);
291                        if (count($parents) > 1) {
292                                array_pop($parents);
293                                $enregistrements[$_cle][$config_champs_loc['parent']] = array_pop($parents);
294                        }
295                }
296        }
297
298        return $enregistrements;
299}
300
301
302function iso3166countries_completer_table($enregistrements, $config) {
303
304        // Initialisation des champs additionnels
305        $enregistrements_geo = array();
306        $config_champs_geo = $config['addon_fields']['geonames'];
307        include_spip('inc/isocode_sourcer');
308        $enregistrement_geo_defaut = initialiser_enregistrement('iso3166countries', $config_champs_geo);
309
310        // Lecture du fichier CSV geonames-countryInfo.txt pour récupérer les informations additionnelles.
311        // Le délimiteur est une tabulation.
312        $fichier = find_in_path(_ISOCODE_GEONAMES_INFORMATIONS_PAYS);
313        $separateur = "\t";
314        $lignes = file($fichier);
315        if ($lignes) {
316                $titres = array();
317                $index_code_pays = null;
318                include_spip('inc/isocode_sourcer');
319                foreach ($lignes as $_numero => $_ligne) {
320                        $valeurs = explode($separateur, trim($_ligne, "\r\n"));
321                        if ($_numero == 0) {
322                                // Stockage des noms de colonnes car la première ligne contient toujours le header et de
323                                // l'index correspondant au code ISO-3166 alpha2 du pays qui se nomme ISO dans le fichier CSV.
324                                $titres = $valeurs;
325                                $index_code_pays = array_search('ISO', $titres);
326                        } else {
327                                // On extrait de chaque ligne les informations additionnelles du pays ainsi que le code alpha2 du pays
328                                // qui servira d'index du tableau constitué.
329                                // On ne sélectionne que les colonnes correspondant à des champs additionnels.
330                                $enregistrement_geo = $enregistrement_geo_defaut;
331                                foreach ($titres as $_cle => $_titre) {
332                                        $titre = trim($_titre);
333                                        if (isset($config_champs_geo[$titre]) and !empty($valeurs[$_cle])) {
334                                                $enregistrement_geo[$config_champs_geo[$titre]] = trim($valeurs[$_cle]);
335                                        }
336                                }
337                                if (isset($valeurs[$index_code_pays])) {
338                                        $enregistrements_geo[$valeurs[$index_code_pays]] = $enregistrement_geo;
339                                }
340                        }
341                }
342        }
343
344        // On complète maintenant le tableau des enregistrements avec la colonne additionnelle hierarchy et la colonne
345        // dérivée parent qui ne contient que le code alpha-3 de la famille parente si elle existe.
346        foreach ($enregistrements as $_cle => $_enregistrement) {
347                $code = $_enregistrement['code_alpha2'];
348                if (isset($enregistrements_geo[$code])) {
349                        $enregistrements[$_cle] = array_merge($enregistrements[$_cle], $enregistrements_geo[$code]);
350                }
351        }
352
353        return $enregistrements;
354}
355
356
357function iso4217currencies_completer_table($enregistrements, $config) {
358
359        // Initialisation des champs additionnels
360        $enregistrements_iota = array();
361        $config_champs_iota = $config['addon_fields']['iota'];
362        include_spip('inc/isocode_sourcer');
363        $enregistrement_iota_defaut = initialiser_enregistrement('iso4217currencies', $config_champs_iota);
364
365        // On récupère la page de description de la famille sur le site SIL.
366        include_spip('inc/distant');
367        $url = _ISOCODE_IOTA_ISO4217_SYMBOL;
368        $flux = recuperer_url($url, array('transcoder' => true));
369
370        include_spip('inc/filtres');
371        $table = extraire_balise($flux['page'], 'table');
372        if ($table) {
373                // On extrait la première table de la page qui contient les données voulues
374                $lignes = extraire_balises($table, 'tr');
375                if ($lignes) {
376                        $cles_iota = array();
377                        $index_code_devise = null;
378                        foreach ($lignes as $_numero => $_ligne) {
379                                $balise_colonne = $_numero == 0 ? 'th' : 'td';
380                                $colonnes = extraire_balises($_ligne, $balise_colonne);
381                                $colonnes = array_map('supprimer_tags', $colonnes);
382                                $colonnes = array_map('trim', $colonnes);
383                                if ($_numero == 0) {
384                                        // La première ligne du tableau est celle des titres de colonnes.
385                                        // On détermine les index de colonnes correspondant aux champs additionnels configurés.
386                                        foreach ($colonnes as $_cle => $_titre) {
387                                                if (array_key_exists($_titre, $config_champs_iota)) {
388                                                        $cles_iota[$_titre] = $_cle;
389                                                }
390                                        }
391                                        // On détermine l'index de la colonne qui porte le code alpha3 ISO-4217 nommé
392                                        $index_code_devise = array_search('ISO devise', $colonnes);
393                                } else {
394                                        // Chaque ligne de la table est composée de plusieurs colonnes, la première étant le code alpha3
395                                        // de la devise selon l'ISO-4217
396                                        $enregistrement_iota = $enregistrement_iota_defaut;
397                                        foreach ($cles_iota as $_titre => $_cle) {
398                                                if ($colonnes[$_cle]) {
399                                                        $enregistrement_iota[$config_champs_iota[$_titre]] = $colonnes[$_cle];
400                                                }
401                                        }
402                                        $code = $colonnes[$index_code_devise];
403                                        $enregistrements_iota[$code] = $enregistrement_iota;
404                                }
405                        }
406                }
407        }
408
409        // On complète maintenant le tableau des enregistrements avec les colonne additionnelles symbole
410        // et devise en français.
411        // Etant donné qu'il faut que tous les enregistrements possèdent la même structure, si une devise ne
412        // possède pas d'informations complémentaires IOTA on lui adjoint des colonnes par défaut.
413        foreach ($enregistrements as $_cle => $_enregistrement) {
414                $code = $_enregistrement['code_4217_3'];
415                if (isset($enregistrements_iota[$code])) {
416                        $enregistrements[$_cle] = array_merge($enregistrements[$_cle], $enregistrements_iota[$code]);
417                } else {
418                        $enregistrements[$_cle] = array_merge($enregistrements[$_cle], $enregistrement_iota_defaut);
419                }
420        }
421
422        return $enregistrements;
423}
Note: See TracBrowser for help on using the repository browser.