Subversion Repositories eFlore/Applications.cel

Rev

Rev 606 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
417 aurelien 1
<?php
2
 
3
// In : utf8
4
// Out : utf8
5
 
483 david 6
 
7
// TODO : traiter image multilignes
540 david 8
// TODO : doublons
483 david 9
 
480 david 10
/*
417 aurelien 11
 
480 david 12
Octobre 2010 David Delon.
13
Import d'observations dans le carnet en ligne à partir d'un fichier excel chargé par l'utilisateur
14
et liaison d'images déjà chargee aux observations ainsi crées.
417 aurelien 15
 
480 david 16
Nom des colonnes imposé, mais présence de toutes les colonnes non obligatoires, ordre non imposé
17
Aucune valeur dans les colonnes n'est obligatoire
18
Pour une ligne donnée, si tous les champs vides on ne fait rien, ou si seul le champ image est présent.
19
Si la seule différence entre deux lignes est la valeur de la colonne image, on considère que c'est la même observation à laquelle on associe plusieurs images.
20
Si au moins deux lignes (ou plus) sont complètement identiques on prend en compte une seule ligne (les doublons sont éliminés).
445 david 21
 
480 david 22
*/
445 david 23
 
480 david 24
 
25
// Nom des colonnes
26
 
445 david 27
define('COMMUNE','commune'); // soit un nom de commune, soit un code INSEE (5 chiffres), ou "nom de commune (numero departement)"
28
define('LIEUDIT','lieu-dit'); // Texte libre
29
define('STATION','station'); // Texte libre
30
define('MILIEU','milieu'); // Texte libre
31
define('LATITUDE','latitude'); // En decimal systeme WGS84
32
define('LONGITUDE','longitude'); // En decimal systeme WGS84
33
define('NOTES','notes'); // Texte libre
34
define('DATEOBS','date'); // date au format jj/mm/aaaa
35
define('ESPECE','espece'); // texte libre, nom latin, ou code nomenclatural (format BDNFFnn999999)
36
define('IMAGE','image'); //  nom des fichiers images préalablement uploadés sur le CEL séparés par des "/"
540 david 37
define('DEPARTEMENT','departement'); //  Texte libre
445 david 38
 
540 david 39
 
480 david 40
// Resultat de l'analyse d'une ligne
445 david 41
define('LIGNE_VIDE',1); //
42
define('LIGNE_NORMALE',2); //
43
define('LIGNE_IMAGE_SEULEMENT',3); //
44
 
540 david 45
// Parser de Nom
46
include('NameParser.php');
445 david 47
 
417 aurelien 48
Class InventoryImportExcel extends DBAccessor  {
49
 
445 david 50
// Element constituant une observation
417 aurelien 51
 
540 david 52
	var $format_observation=array(COMMUNE ,LIEUDIT ,STATION , DEPARTEMENT, MILIEU ,LATITUDE ,LONGITUDE ,NOTES ,DATEOBS ,ESPECE ,IMAGE );
480 david 53
 
54
// Fichier configuration
417 aurelien 55
	var $config;
480 david 56
 
57
// Encapsulation classe lecture fichier excel
417 aurelien 58
	var $extendExcelReader;
59
 
540 david 60
// Dernier numero d'ordre utilise
61
	var $dernier_ordre=1;
62
 
480 david 63
/**
64
 Constructeur
65
**/
417 aurelien 66
	function InventoryImportExcel($config) {
67
 
68
		$this->config=$config;
69
		// Pas d'heritage multiple en php :(
70
 
71
		$this->extendExcelReader = new ExcelReader();
72
		$this->extendExcelReader->initExcelReader();
540 david 73
 
74
/* Recherche dernier numero d'ordre utilise : pas de mise a jour concurente a priori */
75
 
76
 
417 aurelien 77
	}
78
 
480 david 79
/**
80
 Sur post
81
**/
445 david 82
	function createElement($pairs) {
417 aurelien 83
 
84
 
480 david 85
		$pairs['utilisateur']=$_POST['identifiant'];
417 aurelien 86
 
540 david 87
        session_start();
88
        $this->controleUtilisateur($pairs['utilisateur']);
480 david 89
 
417 aurelien 90
 
540 david 91
        foreach($_FILES as $file) { // C'est le plus simple
92
            $infos_fichier = $file ;
93
        }
417 aurelien 94
 
480 david 95
 
96
// Chargement tableau en memoire
445 david 97
 
98
		$data = new Spreadsheet_Excel_Reader($infos_fichier['tmp_name'], false); // false : pour menager la memoire.
480 david 99
		$arr = array();
445 david 100
 
101
		$rowcount=$data->rowcount(0);
102
		$colcount=$data->colcount(0);
103
 
104
		if ($rowcount<=1) { // TODO : retour erreur
105
			print "Tableau vide";
106
			exit;
107
		}
108
 
540 david 109
// Chargement tableau
110
        for($row=1;$row<=$rowcount;$row++)
111
            for($col=1;$col<=$colcount;$col++)
112
                $arr[$col][$row] = $data->val($row,$col,0); // Attention, inversion voulue
445 david 113
 
540 david 114
 
417 aurelien 115
 
540 david 116
// 1 : Traitement intitules
417 aurelien 117
 
445 david 118
		$line = array();
417 aurelien 119
 
445 david 120
/* Les colonnes ne sont pas forcemment dans l'ordre  : on les extrait pour traitement futur  */
121
 
540 david 122
        for($col=1;$col<=$colcount;$col++) {
123
            $colonne=strtolower($arr[$col][1]);
124
            $colonne=trim($colonne);
125
            $colonne=cp1252_to_utf8($colonne);
126
            $colonne=remove_accent($colonne);
127
            switch ($colonne) {  // On ne garde que les colonnes que l'on souhaite traiter
128
                case COMMUNE:
129
                case LIEUDIT:
130
                case STATION:
131
                case MILIEU:
132
                case DEPARTEMENT:
133
                case LATITUDE:
134
                case LONGITUDE:
135
                case NOTES:
136
                case DATEOBS:
137
                case ESPECE:
138
                case IMAGE:
139
                    $selection=array_values($arr[$col]);
140
                    array_shift($selection); // On ne garde pas la premiere ligne, qui contient les intitules
141
                    $line[$colonne]=$selection;
142
                    break;
445 david 143
 
540 david 144
            }
145
        }
445 david 146
 
147
 
540 david 148
//	print_r($line[COMMUNE]);
149
//		print_r($line[LIEUDIT]);
150
//		print_r($line[STATION]);
151
//		print_r($line[MILIEU]);
152
//		print_r($line[DEPARTEMENT]);
153
//		print_r($line[LATITUDE]);
154
//		print_r($line[LONGITUDE]);
155
//		print_r($line[NOTES]);
156
//		print_r($line[DATEOBS]);
157
//		print_r($line[ESPECE]);
158
//		print_r($line[IMAGE]);
159
 
160
 
445 david 161
// 1 : Traitement lignes
162
 
483 david 163
		$cpt_obs=0;
540 david 164
 
165
 
166
        /* Recherche dernier numero d'ordre utilise : pas de mise a jour concurente a priori */
167
 
168
 
169
        $DB=$this->connectDB($this->config,'database_cel');
170
        $query="SELECT MAX(ordre) AS ordre FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($pairs['utilisateur'])."' ";
171
 
172
        $res =& $DB->query($query);
173
        if (DB::isError($res)) {
174
            die($res->getMessage());
175
        }
176
 
177
        while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
178
            $this->dernier_ordre=$row['ordre']; // 1  par defaut
179
        }
180
 
480 david 181
		for ($i=0;$i<=$rowcount-1;$i++) {
540 david 182
			// On saute les eventuelles lignes vides du debut et les lignes contenant des information sur image uniquement
480 david 183
			while ((in_array($retour_analyse=$this->analyserLigne($line,$i),array(LIGNE_IMAGE_SEULEMENT, LIGNE_VIDE))) && ($i<=$rowcount)) {
184
				if  ($retour_analyse==LIGNE_IMAGE_SEULEMENT) {
185
	//				print "image non rattachee a une observation";
186
				}
187
				else {
188
	//				print "vide";
189
				}
445 david 190
				$i++;
191
			}
480 david 192
			while (($this->analyserLigne($line,$i)==LIGNE_NORMALE) && ($i<=$rowcount)) {
540 david 193
				$ordre=$this->traiterLigne($line,$i,$pairs['utilisateur'],$DB);
483 david 194
				if ($ordre>0) {
195
					$cpt_obs++; // Compteur d'observations crees
196
				}
445 david 197
				$i++;
480 david 198
				// On saute les lignes vide ou on traite les lignes suivantes contenant des informations sur image seulement
199
				while ((in_array($retour_analyse=$this->analyserLigne($line,$i),array(LIGNE_IMAGE_SEULEMENT, LIGNE_VIDE))) && ($i<=$rowcount)) {
445 david 200
					if  ($retour_analyse==LIGNE_IMAGE_SEULEMENT) {
480 david 201
						$this->traiterLigneComplement($line,$i,$pairs['utilisateur'],$ordre); // images supplementaires
445 david 202
					}
203
					else {
480 david 204
	//					print "vide";
445 david 205
					}
206
					$i++;
207
				}
208
			}
209
 
210
 
211
		}
540 david 212
		//print $cpt_obs ." nouvelle(s) observation(s) !";
213
		print $cpt_obs ;
445 david 214
 
417 aurelien 215
	}
216
 
445 david 217
function analyserLigne($line,$i) {
218
	$ligne_vide=true;
219
	$ligne_image_seulement=true;
220
	$ligne_normale=true;
221
	foreach ($this->format_observation as $colonne) {
222
		if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
223
			if ($colonne!=IMAGE) {
224
				$ligne_image_seulement=false;
225
				$ligne_vide=false;
226
				break;
227
			}
228
			$ligne_vide=false;
229
		}
230
	}
231
	if ($ligne_vide) {
232
		return LIGNE_VIDE;
233
	}
234
	else {
235
		if ($ligne_image_seulement) {
236
			return LIGNE_IMAGE_SEULEMENT;
237
		}
238
		else {
239
			return LIGNE_NORMALE;
240
		}
241
	}
242
 
417 aurelien 243
 
445 david 244
}
417 aurelien 245
 
540 david 246
function traiterLigne($line,$i,$utilisateur,$DB) { // Controle donnee et insertion
480 david 247
	$info_image=array();
445 david 248
	foreach ($this->format_observation as $colonne) {
249
		if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
250
			switch ($colonne) {  // On ne garde que les colonnes que l'on souhaite traiter
251
				case COMMUNE:
252
					$info_commune=$this->traiterCommune($line[COMMUNE][$i]);
253
					break;
254
				case LIEUDIT:
480 david 255
					$info_lieudit=$this->traiterLieudit($line[LIEUDIT][$i]);
445 david 256
					break;
257
				case STATION:
480 david 258
					$info_station=$this->traiterStation($line[STATION][$i]);
445 david 259
					break;
260
				case MILIEU:
480 david 261
					$info_milieu=$this->traiterMilieu($line[MILIEU][$i]);
445 david 262
					break;
540 david 263
                case DEPARTEMENT:
264
					$info_commune['code']=$this->traiterDepartement($line[DEPARTEMENT][$i]);
265
					break;
445 david 266
				case LATITUDE:
480 david 267
					$info_latitude=$this->traiterLatitude($line[LATITUDE][$i]);
445 david 268
					break;
269
				case LONGITUDE:
480 david 270
					$info_longitude=$this->traiterLongitude($line[LONGITUDE][$i]);
445 david 271
					break;
272
				case NOTES:
480 david 273
					$info_notes=$this->traiterNotes($line[NOTES][$i]);
445 david 274
					break;
275
				case DATEOBS:
480 david 276
					$info_dateobs=$this->traiterDateObs($line[DATEOBS][$i]);
445 david 277
					break;
278
				case ESPECE:
480 david 279
					$info_espece=$this->traiterEspece($line[ESPECE][$i]);
540 david 280
                    if (isset($info_espece['en_id_nom']) && $info_espece['en_id_nom']!='') {
281
                        $complement=$this->rechercherInformationsComplementaires($info_espece['en_id_nom']);
282
                        $info_espece['nom_ret']=$complement['Nom_Retenu'];
283
                        $info_espece['num_nom_ret']=$complement['Num_Nom_Retenu'];
284
                        $info_espece['num_taxon']=$complement['Num_Taxon'];
285
                        $info_espece['famille']=$complement['Famille'];
286
                    }
287
                    break;
445 david 288
				case IMAGE:
480 david 289
					$info_image=$this->traiterImage($line[IMAGE][$i],$utilisateur); // Image separee par des / +  utilisateur
445 david 290
					break;
291
			}
292
		}
480 david 293
		else {
294
		 	switch($colonne) {
295
				case COMMUNE:
296
					$info_commune['name']="000null";
297
					$info_commune['code']="000null";
298
					break;
299
				case LIEUDIT:
300
					$info_lieudit="000null";
301
					break;
302
				case STATION:
303
					$info_station="000null";
304
					break;
305
				case MILIEU:
306
					$info_milieu="000null";
307
					break;
540 david 308
				case DEPARTEMENT:
582 david 309
		            /*if (!isset ($info_commune['code']) || $info_commune['code']=='') {
310
					    $info_commune['code']="000null";
311
                    }*/
540 david 312
					break;
480 david 313
				case LATITUDE:
314
					$info_latitude="000null";
315
					break;
316
				case LONGITUDE:
317
					$info_longitude="000null";
318
					break;
319
 
320
			}
321
 
322
		}
445 david 323
	}
324
 
540 david 325
                $this->dernier_ordre++;
480 david 326
 
327
                list($jour,$mois,$annee)=split("/",$info_dateobs);
328
                $info_dateobs=$annee."-".$mois."-".$jour." 0:0:0";
540 david 329
                $query  = "INSERT INTO cel_inventory (identifiant,ordre,nom_sel,num_nom_sel,nom_ret,num_nom_ret,num_taxon,famille,location,id_location,date_observation,lieudit,station, milieu, commentaire, date_creation,date_modification,coord_x,coord_y) " .
330
                    " VALUES('".$DB->escapeSimple($utilisateur)."','".
331
                    $DB->escapeSimple($this->dernier_ordre)."','".
332
                    $DB->escapeSimple($info_espece['nom_sel'])."','".
333
                    $DB->escapeSimple($info_espece['en_id_nom'])."','".
334
                    $DB->escapeSimple($info_espece['nom_ret'])."','".
335
                    $DB->escapeSimple($info_espece['num_nom_ret'])."','".
336
                    $DB->escapeSimple($info_espece['num_taxon'])."','".
337
                    $DB->escapeSimple($info_espece['famille'])."','".
338
                    $DB->escapeSimple($info_commune['name'])."','".
339
                    $DB->escapeSimple($info_commune['code'])."','".
340
                    $DB->escapeSimple($info_dateobs)."','".
341
                    $DB->escapeSimple($info_lieudit)."','".
342
                    $DB->escapeSimple($info_station)."','".
343
                    $DB->escapeSimple($info_milieu)."','".
344
                    $DB->escapeSimple($info_notes)."',".
345
                    "now() , now(),'".
346
                    $DB->escapeSimple($info_latitude)."','".
347
                    $DB->escapeSimple($info_longitude)."')";
480 david 348
//		print "\n";
349
 
350
		   $res =& $DB->query($query);
351
 
352
                if (PEAR::isError($res)) {
353
                        return false;
354
                }
355
 
356
 
357
	// creation lien image
358
	foreach ($info_image as $pic) {
359
 
541 david 360
		$query = 'INSERT INTO cel_obs_images (coi_ce_image, coi_ce_utilisateur, coi_ce_observation) VALUES ("'.$DB->escapeSimple($pic['ci_id_image']).'","'.$DB->escapeSimple($utilisateur).'",    "'.$DB->escapeSimple($this->dernier_ordre).'") ON DUPLICATE KEY UPDATE coi_ce_image = coi_ce_image' ;
480 david 361
 
362
//print $query;
363
 
364
		$res =& $DB->query($query);
365
 
366
                if (PEAR::isError($res)) {
367
                        return false;
368
                }
369
 
370
 
371
	}
372
 
373
 
374
 
540 david 375
		return $this->dernier_ordre;
480 david 376
 
377
 
417 aurelien 378
}
379
 
480 david 380
function traiterLigneComplement($line,$i,$utilisateur) {
417 aurelien 381
 
480 david 382
// TODO
383
 
445 david 384
}
385
function traiterCommune($identifiant_commune) {  // Recherche correspondance sur nom, si pas unique, correspondance dep. sinon code insee
386
 
387
 
540 david 388
        $identifiant_commune=trim($identifiant_commune);
445 david 389
 
390
        $identifiant_commune=utf8_encode($identifiant_commune); // FIXME : devrait deja etre en utf8 a ce niveau
391
 
540 david 392
	preg_match('/(.*) \(([0-9][0-9]*)\)/',$identifiant_commune,$elements);
445 david 393
 
394
        $DB=$this->connectDB($this->config,'database_cel'); // FIXME regarder si opportun ici
395
 
540 david 396
	if ($elements[1]) { // commune + departement : montpellier (34)
445 david 397
		$nom_commune=$elements[1];
398
		$code_commune=$elements[2];
399
 
480 david 400
 	        $query="SELECT DISTINCT name, code  FROM locations WHERE name = '".$DB->escapeSimple($nom_commune)."' AND code ='".$DB->escapeSimple($code_commune)."'";
445 david 401
 
402
	}
540 david 403
	else { // Code insee seul
404
        preg_match('/([0-9][0-9]*)|(2A[0-9][0-9]*)|(2B[0-9][0-9]*)/',$identifiant_commune,$elements);
405
        if ($elements[1]) { // code insee  commune
406
            $code_insee_commune=$elements[1];
407
            $query="SELECT DISTINCT name, code  FROM locations WHERE insee_code ='".$DB->escapeSimple($code_insee_commune)."'";
408
        }
409
        else { // Commune seule (le departement sera recupere dans la colonne departement si elle est presente, on prend le risque ici de retourner une mauvaise
410
               // Commune
411
            preg_match('/(.*)/',$identifiant_commune,$elements);
412
            if ($elements[1]) { // commune
413
                $nom_commune=$elements[1];
541 david 414
                $nom_commune=trim($nom_commune);
415
                $nom_commune=utf8_decode($nom_commune);
416
                $nom_commune=cp1252_to_utf8($nom_commune);
417
                $nom_commune=remove_accent($nom_commune);
418
                $nom_commune=preg_replace("/ /","%",$nom_commune);
419
                $query="SELECT DISTINCT name, code  FROM locations WHERE name like '".$DB->escapeSimple($nom_commune)."'";
540 david 420
            }
421
        }
445 david 422
	}
423
 
424
	$res =& $DB->query($query);
425
 
426
        if (DB::isError($res)) {
427
		 die($res->getMessage());
428
	}
429
 
430
	return $res->fetchrow(DB_FETCHMODE_ASSOC);
431
 
432
 
433
 
434
 
435
}
436
 
437
function traiterLieudit($lieudit) { // texte libre
438
 
480 david 439
	//echo "traitement lieudit";
582 david 440
    $lieudit=fix_latin($lieudit);
441
	return trim($lieudit);
445 david 442
}
443
 
444
function traiterStation($station) { // texte libre
480 david 445
//	echo "traitement station";
582 david 446
    $station=fix_latin($station);
447
	return trim($station);
445 david 448
}
449
 
450
function traiterMilieu($milieu) { // texte libre
480 david 451
//	echo "traitement milieu";
582 david 452
    $milieu=fix_latin($milieu);
453
	return trim($milieu);
445 david 454
}
455
 
540 david 456
function traiterDepartement($departement) { // texte libre
457
//	echo "traitement milieu";
458
	return utf8_encode(trim($departement));
459
}
460
 
445 david 461
function traiterLatitude($latitude) {	//  verifier formal decimal + limite france ? TODO
480 david 462
//	echo "traitement latitude";
540 david 463
	return trim($latitude);
445 david 464
}
465
 
466
function traiterLongitude($longitude) { // verifier format decimal + limite france ? TODO
480 david 467
//	echo "traitement longitude";
540 david 468
	return trim($longitude);
445 david 469
}
470
 
471
function traiterNotes($notes) { // texte libre
480 david 472
//	echo "traitement notes";
582 david 473
    $notes=remove_accent($notes);
540 david 474
	return utf8_encode(trim($notes));
445 david 475
}
476
 
477
function traiterDateObs($dateobs) { // verifier jj/mm/aaaa sinon date vide TODO
480 david 478
//	echo "traitement dateobs";
540 david 479
	return trim($dateobs);
445 david 480
}
481
 
540 david 482
function traiterEspece($identifiant_espece) {  // texte libre, nom scientifique , ou code nomenclatural (format BDNFFnn999999) ou code taxonomique (format BDNFFnt999999)
449 david 483
 
480 david 484
//	echo "traitement  espece";
540 david 485
        $identifiant_espece=trim($identifiant_espece);
445 david 486
 
487
        $identifiant_espece=utf8_encode($identifiant_espece); // FIXME : devrait deja etre en utf8 a ce niveau
488
 
540 david 489
	    preg_match('/BDNFFnn([0-9][0-9]*)/',$identifiant_espece,$elements);
490
 
449 david 491
		if ($elements[1]) { // Numero nomenclatural
445 david 492
 
449 david 493
 
540 david 494
            // Recherche du nom associe
495
            $DB=$this->connectDB($this->config); // FIXME : gerer cache de connection
496
            $query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
497
                "   auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
498
                " , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
499
                " , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
500
                " , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
501
                " , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, en_id_nom" .
502
                " FROM eflore_nom, eflore_nom_rang, eflore_selection_nom a,  " .
503
                " eflore_naturaliste_intitule_abreviation AS auteur_bex ".
504
                " , eflore_naturaliste_intitule_abreviation AS auteur_b ".
505
                " , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
506
                " , eflore_naturaliste_intitule_abreviation AS auteur_m ".
507
                " WHERE a.esn_id_nom= '".$elements[1]. "'".
508
                " AND a.esn_id_version_projet_taxon = 25 ".
509
                " AND en_ce_rang = enrg_id_rang" .
510
                " AND en_id_nom = a.esn_id_nom" .
511
                " AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
512
                " AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege  ".
513
                " AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
514
                " AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
515
                " AND a.esn_id_version_projet_taxon=en_id_version_projet_nom ";
480 david 516
 
540 david 517
            $res =& $DB->query($query);
480 david 518
 
519
 
540 david 520
            if (DB::isError($res)) {
521
                die($res->getMessage());
522
            }
480 david 523
 
540 david 524
            $row =& $res->fetchrow(DB_FETCHMODE_ASSOC);
525
            return array("nom_sel"=>$this->formaterNom($row),"en_id_nom"=>$elements[1]);
526
 
449 david 527
		}
528
 
540 david 529
		else { //  Numero taxonomique ou nom scientifique
530
	        preg_match('/BDNFFnt([0-9][0-9]*)/',$identifiant_espece,$elements);
449 david 531
 
540 david 532
		    if ($elements[1]) { // Numero taxonomique
533
 
534
                $DB=$this->connectDB($this->config);
449 david 535
 
540 david 536
                $query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
537
                    "   auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
538
                    " , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
539
                    " , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
540
                    " , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
541
                    " , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, en_id_nom" .
542
                    " FROM eflore_nom, eflore_nom_rang," .
543
                    "     eflore_naturaliste_intitule_abreviation AS auteur_bex ".
544
                    "   , eflore_naturaliste_intitule_abreviation AS auteur_b ".
545
                    "   , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
546
                    "   , eflore_naturaliste_intitule_abreviation AS auteur_m ".
547
                    " , eflore_selection_nom ".
548
                    " WHERE esn_id_taxon = '".$elements[1]. "'".
549
                    " AND esn_id_version_projet_taxon = 25 ".
550
                    " AND esn_ce_statut=3 ".
551
                    " AND en_id_nom = esn_id_nom" .
552
                    " AND en_ce_rang = enrg_id_rang" .
553
                    " AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
554
                    " AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege  ".
555
                    " AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
556
                    " AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
557
                    " AND esn_id_version_projet_taxon=en_id_version_projet_nom ";
449 david 558
 
540 david 559
                $res =& $DB->query($query);
449 david 560
 
540 david 561
                if (DB::isError($res)) {
562
                    die($res->getMessage());
563
                }
449 david 564
 
540 david 565
                $row =& $res->fetchrow(DB_FETCHMODE_ASSOC);
566
                return array("nom_sel"=>$this->formaterNom($row),"en_id_nom"=>$row['en_id_nom']);
449 david 567
 
568
 
540 david 569
            }
480 david 570
 
540 david 571
            else { // Nom scientifique
572
                $nameparser=new NameParser();
573
                $nom_latin_decoupe=$nameparser->parse($identifiant_espece);
480 david 574
 
540 david 575
//print_r($nom_latin_decoupe);
576
                    $DB=$this->connectDB($this->config); // FIXME regarder si opportun ici
480 david 577
 
540 david 578
                        // requete sous espece (on privilegie les noms retenu cf tri par esn_ce_statut)
579
                        if (isset($nom_latin_decoupe['infra']) && $nom_latin_decoupe['infra']!="") {
580
                            $query="SELECT DISTINCT en_id_nom, esn_ce_statut" .
581
                                            " FROM eflore_nom, eflore_nom_rang, eflore_selection_nom " .
582
                                            " WHERE en_id_version_projet_nom = '25' AND en_nom_genre = '".$DB->escapeSimple($nom_latin_decoupe['genus'])."' " .
583
                                            " AND enrg_abreviation_rang = '".$DB->escapeSimple($nom_latin_decoupe['infra_type'])."' " .
584
                                            " AND en_epithete_infra_specifique = '".$DB->escapeSimple($nom_latin_decoupe['infra'])."' " .
585
                                            " AND esn_id_nom= en_id_nom ".
586
                                            " AND esn_id_version_projet_taxon=en_id_version_projet_nom " .
587
                                            " AND en_epithete_espece =  '".$DB->escapeSimple($nom_latin_decoupe['species'])."' AND en_ce_rang = enrg_id_rang " .
588
                                            " ORDER BY esn_ce_statut ".
589
                                            " LIMIT 1";
590
                        }
591
                        else { // espece  (on privilegie les noms retenu cf tri par esn_ce_statut)
592
                             $query="SELECT DISTINCT en_id_nom, esn_ce_statut" .
593
                                            " FROM eflore_nom, eflore_nom_rang, eflore_selection_nom " .
594
                                            " WHERE en_id_version_projet_nom = '25' AND en_nom_genre = '".$DB->escapeSimple($nom_latin_decoupe['genus'])."' " .
595
                                            " AND enrg_abreviation_rang = 'sp.' " .
596
                                            " AND esn_id_nom= en_id_nom ".
597
                                            " AND esn_id_version_projet_taxon=en_id_version_projet_nom " .
598
                                            " AND en_epithete_espece =  '".$DB->escapeSimple($nom_latin_decoupe['species'])."' AND en_ce_rang = enrg_id_rang " .
599
                                            " ORDER BY esn_ce_statut ".
600
                                            " LIMIT 1";
601
 
602
                        }
603
                $res =& $DB->query($query);
604
                if (DB::isError($res)) {
605
                     die($res->getMessage());
606
                }
480 david 607
 
540 david 608
                $id_nom=$res->fetchrow(DB_FETCHMODE_ASSOC);
480 david 609
 
540 david 610
                // Recherche du nom associe
611
                $DB=$this->connectDB($this->config); // FIXME : gerer cache de connection
612
                $query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
613
                    "   auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
614
                    " , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
615
                    " , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
616
                    " , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
617
                    " , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, en_id_nom" .
618
                    " FROM eflore_nom, eflore_nom_rang, eflore_selection_nom a,  " .
619
                    "         eflore_naturaliste_intitule_abreviation AS auteur_bex ".
620
                    "   , eflore_naturaliste_intitule_abreviation AS auteur_b ".
621
                    "   , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
622
                    "   , eflore_naturaliste_intitule_abreviation AS auteur_m ".
623
                    " WHERE a.esn_id_nom= '".$id_nom['en_id_nom']. "'".
624
                    " AND a.esn_id_version_projet_taxon = 25 ".
625
                    " AND en_ce_rang = enrg_id_rang" .
626
                    " AND en_id_nom = a.esn_id_nom" .
627
                    " AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
628
                    " AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege  ".
629
                    " AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
630
                    " AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
631
                    " AND a.esn_id_version_projet_taxon=en_id_version_projet_nom ";
632
                $res =& $DB->query($query);
480 david 633
 
634
 
540 david 635
                if (DB::isError($res)) {
636
                    die($res->getMessage());
637
                }
445 david 638
 
540 david 639
                if ($res->numRows() > 0 ) {
640
                    $row =& $res->fetchrow(DB_FETCHMODE_ASSOC);
641
                    return array("nom_sel"=>$this->formaterNom($row),"en_id_nom"=>$id_nom['en_id_nom']);
642
                }
643
                else {
644
                    return array("nom_sel"=>$identifiant_espece);
645
                }
445 david 646
 
480 david 647
 
540 david 648
                }
649
            }
480 david 650
 
651
 
445 david 652
}
653
 
654
 
655
 
480 david 656
function traiterImage($images,$utilisateur) { // recherche id image de ce nom
657
 
658
	//echo "traitement  image";
659
        $DB=$this->connectDB($this->config,'cel_db');
660
 
661
	$liste_images = explode("/",$images) ;
662
 
663
	$row =array();
664
        foreach($liste_images as $image) {
665
 
666
		$query="SELECT * FROM cel_images WHERE ci_ce_utilisateur='".$DB->escapeSimple($utilisateur)."' AND ci_nom_original='".$DB->escapeSimple($image)."'";
667
 
668
	        $res  =& $DB->query($query);
669
		$row [] =& $res->fetchrow(DB_FETCHMODE_ASSOC);
670
 
671
	        if (DB::isError($res)) {
672
        	    die($res->getMessage());
673
	        }
674
 
675
	}
676
	return $row;
677
 
678
 
445 david 679
}
680
 
540 david 681
       function rechercherInformationsComplementaires($numNom) { // Num taxon, Num retenu ...
445 david 682
 
480 david 683
                $DB=$this->connectDB($this->config);
684
 
685
                $query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
540 david 686
                    "   auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
687
                    " , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
688
                    " , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
689
                    " , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
690
                    " , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, b.esn_id_taxon, b.esn_id_nom" .
691
                    " FROM eflore_nom, eflore_nom_rang," .
692
                    "     eflore_naturaliste_intitule_abreviation AS auteur_bex ".
693
                    "   , eflore_naturaliste_intitule_abreviation AS auteur_b ".
694
                    "   , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
695
                    "   , eflore_naturaliste_intitule_abreviation AS auteur_m ".
696
                    " ,eflore_selection_nom a, eflore_selection_nom b".
697
                    " WHERE a.esn_id_nom= ".$numNom.
698
                    " AND a.esn_id_version_projet_taxon = 25 ".
699
                    " AND a.esn_id_taxon=b.esn_id_taxon ".
700
                    " AND b.esn_ce_statut=3 ".
701
                    " AND a.esn_id_version_projet_taxon=b.esn_id_version_projet_taxon" .
702
                    " AND en_ce_rang = enrg_id_rang" .
703
                    " AND en_id_nom = b.esn_id_nom" .
704
                    " AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
705
                    " AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege  ".
706
                    " AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
707
                    " AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
708
                    " AND a.esn_id_version_projet_taxon=en_id_version_projet_nom ";
480 david 709
 
710
 
540 david 711
                $res =& $DB->query($query);
480 david 712
 
713
 
714
 
540 david 715
                if (DB::isError($res)) {
716
                    die($res->getMessage());
717
                }
480 david 718
 
540 david 719
                // Nom retenu, Num Nomenclatural nom retenu, Num Taxon,
480 david 720
 
721
                $value=array('Nom_Retenu'=>"",'Num_Nom_Retenu'=>"0",'Num_Taxon'=>"0",'Famille'=>"");
722
 
723
                while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
540 david 724
                    $fam=$this->rechercherFamille($row['esn_id_taxon'],$DB);
725
 
726
                    // Recherche Famille
727
                    while (($fam['en_ce_rang']!='fin') && ($fam['en_ce_rang'] !=120)) {
480 david 728
                        $fam=$this->rechercherFamille($fam['etr_id_taxon_2'],$DB);
540 david 729
                    }
730
                    if ($fam['en_ce_rang']==120) {
480 david 731
                        $famille=$fam['en_nom_supra_generique'];
540 david 732
                    }
733
                    else {
480 david 734
                        $famille="Famille inconnue";
540 david 735
                    }
736
 
737
                    $value=array('Nom_Retenu'=>$this->formaterNom($row),'Num_Nom_Retenu'=>$row['esn_id_nom'],'Num_Taxon'=>$row['esn_id_taxon'],'Famille'=>$famille);
480 david 738
                }
739
 
540 david 740
                return $value;
480 david 741
 
742
 
743
 
744
        }
745
 
449 david 746
function formaterNom($rawnom) {
480 david 747
 
748
 
449 david 749
                // Constitution du nom:
750
                $nom = '';
445 david 751
 
449 david 752
                if ($rawnom['en_nom_supra_generique'] != '') {
753
                    $nom .= $rawnom['en_nom_supra_generique'];
754
                } else if ($rawnom['en_epithete_infra_generique'] != '') {
755
                    $nom .= $rawnom['en_epithete_infra_generique'];
756
                } else {
757
                        if ($rawnom['en_nom_genre'] != '') {
758
                            $nom .=  $rawnom['en_nom_genre'];
759
                        }
760
                        if ($rawnom['en_epithete_espece']!= '') {
761
                            $nom .= ' '.$rawnom['en_epithete_espece'];
762
                        }
763
                        if ($rawnom['en_epithete_infra_specifique'] != '') {
764
                                if (!empty($rawnom['enrg_abreviation_rang'])) {
765
                                        $nom .= ' '.$rawnom['enrg_abreviation_rang'].'';
766
                                }
767
                                $nom .= ' '.$rawnom['en_epithete_infra_specifique'];
768
                        }
769
 
770
                }
480 david 771
 
772
                return $nom .$this->retournerAuteur($rawnom) ;
773
 
774
 }
775
 
776
 
777
function rechercherFamille($taxon,&$DB) {
778
 
540 david 779
    $row=array();
480 david 780
 
540 david 781
    $query="SELECT DISTINCT en_ce_rang, etr_id_taxon_2, en_id_nom, en_nom_supra_generique ".
480 david 782
        " FROM eflore_taxon_relation, eflore_selection_nom, eflore_nom ".
783
        " WHERE etr_id_taxon_1 = ".$taxon.
784
        " AND etr_id_version_projet_taxon_1 = 25 ".
785
        " AND etr_id_categorie_taxon = 3 ".
786
        " AND etr_id_valeur_taxon = 3 ".
787
        " AND esn_id_taxon =  etr_id_taxon_2 ".
788
        " AND esn_ce_statut = 3 ".
789
        " AND esn_id_version_projet_taxon = etr_id_version_projet_taxon_1 ".
790
        " AND en_id_nom = esn_id_nom ".
791
        " AND esn_id_version_projet_taxon=en_id_version_projet_nom  ";
540 david 792
    $res =& $DB->query($query);
480 david 793
 
540 david 794
    if (DB::isError($res)) {
795
        die($res->getMessage());
796
    }
480 david 797
 
540 david 798
    if ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
799
        return $row;
480 david 800
    }
801
    else {
802
        $row['en_ce_rang']='fin';
803
        return $row;
804
    }
805
 
445 david 806
}
807
 
480 david 808
 
449 david 809
function retournerAuteur($rawnom) {
445 david 810
 
540 david 811
    $auteurs = '';
812
    $auteur_basio = '';
813
    $auteur_modif = '';
814
    if (!empty($rawnom['abreviation_auteur_basio_ex']) && $rawnom['abreviation_auteur_basio_ex']!='-' )  {
815
        $auteur_basio .= $rawnom['abreviation_auteur_basio_ex'];
816
        if (!empty($rawnom['abreviation_auteur_basio']) && $rawnom['abreviation_auteur_basio']!='-') {
817
            $auteur_basio .= ' ex '.$rawnom['abreviation_auteur_basio'];
818
        }
819
    } else if (!empty($rawnom['abreviation_auteur_basio']) && $rawnom['abreviation_auteur_basio']!='-') {
820
        $auteur_basio .= $rawnom['abreviation_auteur_basio'];
821
    }
445 david 822
 
540 david 823
    if (!empty($rawnom['abreviation_auteur_modif_ex']) && $rawnom['abreviation_auteur_modif_ex']!='-') {
824
        $auteur_modif .= $rawnom['abreviation_auteur_modif_ex'];
825
        if (!empty($rawnom['abreviation_auteur_modif']) && $rawnom['abreviation_auteur_modif']!='-') {
826
            $auteur_modif .= ' ex '.$rawnom['abreviation_auteur_modif'];
827
        }
828
    } else if (!empty($rawnom['abreviation_auteur_modif']) && $rawnom['abreviation_auteur_modif']!='-')  {
829
        $auteur_modif .= $rawnom['abreviation_auteur_modif'];
830
    }
449 david 831
 
540 david 832
    if (!empty($auteur_modif)) {
833
        $auteurs = ' ('.$auteur_basio.') '.$auteur_modif;
834
    } elseif (!empty($auteur_basio)) {
835
        $auteurs = ' '.$auteur_basio;
836
    }
837
 
838
    return $auteurs ;
449 david 839
}
840
 
841
 
842
 
480 david 843
 
449 david 844
}
845
 
582 david 846
function init_byte_map(){
606 aurelien 847
    $byte_map = array();
582 david 848
    for($x=128;$x<256;++$x){
849
        $byte_map[chr($x)]=utf8_encode(chr($x));
850
    }
851
    $cp1252_map=array(
852
            "\x80"=>"\xE2\x82\xAC",    // EURO SIGN
853
            "\x82" => "\xE2\x80\x9A",  // SINGLE LOW-9 QUOTATION MARK
854
            "\x83" => "\xC6\x92",      // LATIN SMALL LETTER F WITH HOOK
855
            "\x84" => "\xE2\x80\x9E",  // DOUBLE LOW-9 QUOTATION MARK
856
            "\x85" => "\xE2\x80\xA6",  // HORIZONTAL ELLIPSIS
857
            "\x86" => "\xE2\x80\xA0",  // DAGGER
858
            "\x87" => "\xE2\x80\xA1",  // DOUBLE DAGGER
859
            "\x88" => "\xCB\x86",      // MODIFIER LETTER CIRCUMFLEX ACCENT
860
            "\x89" => "\xE2\x80\xB0",  // PER MILLE SIGN
861
            "\x8A" => "\xC5\xA0",      // LATIN CAPITAL LETTER S WITH CARON
862
            "\x8B" => "\xE2\x80\xB9",  // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
863
            "\x8C" => "\xC5\x92",      // LATIN CAPITAL LIGATURE OE
864
            "\x8E" => "\xC5\xBD",      // LATIN CAPITAL LETTER Z WITH CARON
865
            "\x91" => "\xE2\x80\x98",  // LEFT SINGLE QUOTATION MARK
866
            "\x92" => "\xE2\x80\x99",  // RIGHT SINGLE QUOTATION MARK
867
            "\x93" => "\xE2\x80\x9C",  // LEFT DOUBLE QUOTATION MARK
868
            "\x94" => "\xE2\x80\x9D",  // RIGHT DOUBLE QUOTATION MARK
869
            "\x95" => "\xE2\x80\xA2",  // BULLET
870
            "\x96" => "\xE2\x80\x93",  // EN DASH
871
            "\x97" => "\xE2\x80\x94",  // EM DASH
872
            "\x98" => "\xCB\x9C",      // SMALL TILDE
873
            "\x99" => "\xE2\x84\xA2",  // TRADE MARK SIGN
874
            "\x9A" => "\xC5\xA1",      // LATIN SMALL LETTER S WITH CARON
875
            "\x9B" => "\xE2\x80\xBA",  // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
876
            "\x9C" => "\xC5\x93",      // LATIN SMALL LIGATURE OE
877
            "\x9E" => "\xC5\xBE",      // LATIN SMALL LETTER Z WITH CARON
878
            "\x9F" => "\xC5\xB8"       // LATIN CAPITAL LETTER Y WITH DIAERESIS
879
                );
880
    foreach($cp1252_map as $k=>$v){
881
        $byte_map[$k]=$v;
882
    }
606 aurelien 883
 
884
    return $byte_map;
582 david 885
}
449 david 886
 
602 aurelien 887
function fix_latin($instr){
888
 
606 aurelien 889
    $byte_map = init_byte_map();
890
 
602 aurelien 891
    $ascii_char='[\x00-\x7F]';
892
    $cont_byte='[\x80-\xBF]';
893
    $utf8_2='[\xC0-\xDF]'.$cont_byte;
894
    $utf8_3='[\xE0-\xEF]'.$cont_byte.'{2}';
895
    $utf8_4='[\xF0-\xF7]'.$cont_byte.'{3}';
896
    $utf8_5='[\xF8-\xFB]'.$cont_byte.'{4}';
606 aurelien 897
 
602 aurelien 898
    $nibble_good_chars = "@^($ascii_char+|$utf8_2|$utf8_3|$utf8_4|$utf8_5)(.*)$@s";
601 aurelien 899
 
582 david 900
    if(mb_check_encoding($instr,'UTF-8'))return $instr; // no need for the rest if it's all valid UTF-8 already
901
    $outstr='';
902
    $char='';
903
    $rest='';
904
    while((strlen($instr))>0){
602 aurelien 905
        if(1==@preg_match($nibble_good_chars,$instr,$match)){
582 david 906
            $char=$match[1];
907
            $rest=$match[2];
908
            $outstr.=$char;
602 aurelien 909
        }elseif(1==@preg_match('@^(.)(.*)$@s',$instr,$match)){
582 david 910
            $char=$match[1];
911
            $rest=$match[2];
912
            $outstr.=$byte_map[$char];
913
        }
914
        $instr=$rest;
915
    }
916
    return $outstr;
917
}
918
 
919
 
540 david 920
function remove_accent($str)
921
{
922
  $a = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î',
923
             'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß',
924
             'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î',
925
             'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'Ā',
926
             'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ', 'ĉ', 'Ċ', 'ċ', 'Č', 'č', 'Ď', 'ď',
927
             'Đ', 'đ', 'Ē', 'ē', 'Ĕ', 'ĕ', 'Ė', 'ė', 'Ę', 'ę', 'Ě', 'ě', 'Ĝ', 'ĝ', 'Ğ',
928
             'ğ', 'Ġ', 'ġ', 'Ģ', 'ģ', 'Ĥ', 'ĥ', 'Ħ', 'ħ', 'Ĩ', 'ĩ', 'Ī', 'ī', 'Ĭ', 'ĭ',
929
             'Į', 'į', 'İ', 'ı', 'IJ', 'ij', 'Ĵ', 'ĵ', 'Ķ', 'ķ', 'Ĺ', 'ĺ', 'Ļ', 'ļ', 'Ľ',
930
             'ľ', 'Ŀ', 'ŀ', 'Ł', 'ł', 'Ń', 'ń', 'Ņ', 'ņ', 'Ň', 'ň', 'ʼn', 'Ō', 'ō', 'Ŏ',
931
             'ŏ', 'Ő', 'ő', 'Œ', 'œ', 'Ŕ', 'ŕ', 'Ŗ', 'ŗ', 'Ř', 'ř', 'Ś', 'ś', 'Ŝ', 'ŝ',
932
             'Ş', 'ş', 'Š', 'š', 'Ţ', 'ţ', 'Ť', 'ť', 'Ŧ', 'ŧ', 'Ũ', 'ũ', 'Ū', 'ū', 'Ŭ',
933
             'ŭ', 'Ů', 'ů', 'Ű', 'ű', 'Ų', 'ų', 'Ŵ', 'ŵ', 'Ŷ', 'ŷ', 'Ÿ', 'Ź', 'ź', 'Ż',
934
             'ż', 'Ž', 'ž', 'ſ', 'ƒ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ǎ', 'ǎ', 'Ǐ', 'ǐ', 'Ǒ', 'ǒ',
935
             'Ǔ', 'ǔ', 'Ǖ', 'ǖ', 'Ǘ', 'ǘ', 'Ǚ', 'ǚ', 'Ǜ', 'ǜ', 'Ǻ', 'ǻ', 'Ǽ', 'ǽ', 'Ǿ', 'ǿ');
936
 
937
  $b = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I',
938
             'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's',
939
             'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i',
940
             'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'a',
941
             'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd',
942
             'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g',
943
             'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i',
944
             'IJ', 'ij', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'l', 'l',
945
             'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R',
946
             'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't',
947
             'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y',
948
             'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I',
949
             'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o');
950
  return str_replace($a, $b, $str);
951
}
449 david 952
 
540 david 953
 
954
function cp1252_to_utf8($str) {
955
$cp1252_map = array ("\xc2\x80" => "\xe2\x82\xac",
956
"\xc2\x82" => "\xe2\x80\x9a",
957
"\xc2\x83" => "\xc6\x92",
958
"\xc2\x84" => "\xe2\x80\x9e",
959
"\xc2\x85" => "\xe2\x80\xa6",
960
"\xc2\x86" => "\xe2\x80\xa0",
961
"\xc2\x87" => "\xe2\x80\xa1",
962
"\xc2\x88" => "\xcb\x86",
963
"\xc2\x89" => "\xe2\x80\xb0",
964
"\xc2\x8a" => "\xc5\xa0",
965
"\xc2\x8b" => "\xe2\x80\xb9",
966
"\xc2\x8c" => "\xc5\x92",
967
"\xc2\x8e" => "\xc5\xbd",
968
"\xc2\x91" => "\xe2\x80\x98",
969
"\xc2\x92" => "\xe2\x80\x99",
970
"\xc2\x93" => "\xe2\x80\x9c",
971
"\xc2\x94" => "\xe2\x80\x9d",
972
"\xc2\x95" => "\xe2\x80\xa2",
973
"\xc2\x96" => "\xe2\x80\x93",
974
"\xc2\x97" => "\xe2\x80\x94",
975
 
976
"\xc2\x98" => "\xcb\x9c",
977
"\xc2\x99" => "\xe2\x84\xa2",
978
"\xc2\x9a" => "\xc5\xa1",
979
"\xc2\x9b" => "\xe2\x80\xba",
980
"\xc2\x9c" => "\xc5\x93",
981
"\xc2\x9e" => "\xc5\xbe",
982
"\xc2\x9f" => "\xc5\xb8"
983
);
984
return strtr ( utf8_encode ( $str ), $cp1252_map );
985
}
986
 
417 aurelien 987
/* +--Fin du code ---------------------------------------------------------------------------------------+
988
* $Log$
989
*
990
*
991
*/
992
 
993
 
994
?>