Subversion Repositories eFlore/Applications.cel

Rev

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