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

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

Complément à la table iso4217currencies.
Renommage d'un champ de la table iso4217currencies.

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