Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
417 aurelien 1
<?php
2
// In : utf8
3
// Out : utf8
4
 
540 david 5
// TODO : doublons
483 david 6
 
1321 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).
1321 aurelien 17
**/
445 david 18
 
480 david 19
// Nom des colonnes
20
 
445 david 21
define('COMMUNE','commune'); // soit un nom de commune, soit un code INSEE (5 chiffres), ou "nom de commune (numero departement)"
22
define('LIEUDIT','lieu-dit'); // Texte libre
23
define('STATION','station'); // Texte libre
24
define('MILIEU','milieu'); // Texte libre
25
define('LATITUDE','latitude'); // En decimal systeme WGS84
26
define('LONGITUDE','longitude'); // En decimal systeme WGS84
27
define('NOTES','notes'); // Texte libre
28
define('DATEOBS','date'); // date au format jj/mm/aaaa
29
define('ESPECE','espece'); // texte libre, nom latin, ou code nomenclatural (format BDNFFnn999999)
30
define('IMAGE','image'); //  nom des fichiers images préalablement uploadés sur le CEL séparés par des "/"
540 david 31
define('DEPARTEMENT','departement'); //  Texte libre
760 aurelien 32
define('TRANSMETTRE','transmettre'); //  "1" ou "oui", toute autre valeur (y compris vide) sera consideree comme "non""
445 david 33
 
540 david 34
 
480 david 35
// Resultat de l'analyse d'une ligne
445 david 36
define('LIGNE_VIDE',1); //
37
define('LIGNE_NORMALE',2); //
38
define('LIGNE_IMAGE_SEULEMENT',3); //
39
 
1321 aurelien 40
 
41
//TODO: refactoriser entièrement cette classe
970 aurelien 42
class InventoryImportExcel extends Cel  {
445 david 43
 
1321 aurelien 44
	// Element constituant une observation
760 aurelien 45
	var $format_observation=array(COMMUNE ,LIEUDIT ,STATION , DEPARTEMENT, MILIEU ,LATITUDE ,LONGITUDE ,NOTES ,DATEOBS ,ESPECE ,TRANSMETTRE, IMAGE );
480 david 46
 
1321 aurelien 47
	// Encapsulation classe lecture fichier excel
417 aurelien 48
	var $extendExcelReader;
49
 
1321 aurelien 50
	// Dernier numero d'ordre utilise
51
	var $dernier_ordre = 1;
760 aurelien 52
 
1321 aurelien 53
	var $cpt_images_liees = 0;
540 david 54
 
1321 aurelien 55
	/**
56
	 Constructeur
57
	**/
417 aurelien 58
	function InventoryImportExcel($config) {
59
 
1321 aurelien 60
		parent::__construct($config);
417 aurelien 61
		// Pas d'heritage multiple en php :(
62
		$this->extendExcelReader = new ExcelReader();
63
		$this->extendExcelReader->initExcelReader();
64
	}
65
 
1321 aurelien 66
	/**
67
	 Sur post
68
	**/
445 david 69
	function createElement($pairs) {
417 aurelien 70
 
1322 aurelien 71
		if(!isset($pairs['utilisateur']) || trim($pairs['utilisateur']) == '') {
72
			echo '0'; exit;
73
		}
74
 
1147 aurelien 75
		if(!isset($_SESSION)) {session_start();}
540 david 76
        $this->controleUtilisateur($pairs['utilisateur']);
480 david 77
 
540 david 78
        foreach($_FILES as $file) { // C'est le plus simple
79
            $infos_fichier = $file ;
80
        }
417 aurelien 81
 
1321 aurelien 82
		// Chargement tableau en memoire
445 david 83
		$data = new Spreadsheet_Excel_Reader($infos_fichier['tmp_name'], false); // false : pour menager la memoire.
480 david 84
		$arr = array();
445 david 85
 
86
		$rowcount=$data->rowcount(0);
87
		$colcount=$data->colcount(0);
88
 
89
		if ($rowcount<=1) { // TODO : retour erreur
90
			print "Tableau vide";
91
			exit;
92
		}
93
 
1321 aurelien 94
		// Chargement tableau
540 david 95
        for($row=1;$row<=$rowcount;$row++)
96
            for($col=1;$col<=$colcount;$col++)
97
                $arr[$col][$row] = $data->val($row,$col,0); // Attention, inversion voulue
760 aurelien 98
 
1321 aurelien 99
		// 1 : Traitement intitules
445 david 100
		$line = array();
417 aurelien 101
 
1321 aurelien 102
		/* Les colonnes ne sont pas forcemment dans l'ordre  : on les extrait pour traitement futur  */
540 david 103
        for($col=1;$col<=$colcount;$col++) {
104
            $colonne=strtolower($arr[$col][1]);
105
            $colonne=trim($colonne);
106
            $colonne=cp1252_to_utf8($colonne);
107
            $colonne=remove_accent($colonne);
108
            switch ($colonne) {  // On ne garde que les colonnes que l'on souhaite traiter
109
                case COMMUNE:
110
                case LIEUDIT:
111
                case STATION:
112
                case MILIEU:
113
                case DEPARTEMENT:
114
                case LATITUDE:
115
                case LONGITUDE:
116
                case NOTES:
117
                case DATEOBS:
118
                case ESPECE:
760 aurelien 119
                case TRANSMETTRE:
540 david 120
                case IMAGE:
121
                    $selection=array_values($arr[$col]);
122
                    array_shift($selection); // On ne garde pas la premiere ligne, qui contient les intitules
123
                    $line[$colonne]=$selection;
124
                    break;
445 david 125
 
540 david 126
            }
127
        }
1081 aurelien 128
		// 1 : Traitement lignes
483 david 129
		$cpt_obs=0;
760 aurelien 130
		$cpt_img=0;
540 david 131
 
132
        /* Recherche dernier numero d'ordre utilise : pas de mise a jour concurente a priori */
1321 aurelien 133
        $requete = "SELECT MAX(ordre) AS ordre FROM cel_obs WHERE ce_utilisateur = ".$this->proteger($pairs['utilisateur'])." ";
134
		$resultat = $this->requeter($requete);
540 david 135
 
1321 aurelien 136
        if(is_array($resultat) && count($resultat) > 0) {
137
            $this->dernier_ordre = $resultat[0]['ordre']; // 1  par defaut
540 david 138
        }
139
 
480 david 140
		for ($i=0;$i<=$rowcount-1;$i++) {
540 david 141
			// On saute les eventuelles lignes vides du debut et les lignes contenant des information sur image uniquement
480 david 142
			while ((in_array($retour_analyse=$this->analyserLigne($line,$i),array(LIGNE_IMAGE_SEULEMENT, LIGNE_VIDE))) && ($i<=$rowcount)) {
143
				if  ($retour_analyse==LIGNE_IMAGE_SEULEMENT) {
1321 aurelien 144
					// image non rattachée à une observation
480 david 145
				}
146
				else {
1321 aurelien 147
					// ligne vide
480 david 148
				}
445 david 149
				$i++;
150
			}
480 david 151
			while (($this->analyserLigne($line,$i)==LIGNE_NORMALE) && ($i<=$rowcount)) {
1322 aurelien 152
				$id_obs = $this->traiterLigne($line,$i,$pairs['utilisateur']);
153
				if ($this->dernier_ordre > 0) {
483 david 154
					$cpt_obs++; // Compteur d'observations crees
155
				}
445 david 156
				$i++;
480 david 157
				// On saute les lignes vide ou on traite les lignes suivantes contenant des informations sur image seulement
158
				while ((in_array($retour_analyse=$this->analyserLigne($line,$i),array(LIGNE_IMAGE_SEULEMENT, LIGNE_VIDE))) && ($i<=$rowcount)) {
445 david 159
					if  ($retour_analyse==LIGNE_IMAGE_SEULEMENT) {
1322 aurelien 160
						$this->traiterLigneComplement($line,$i,$pairs['utilisateur'],$id_obs); // images supplementaires
445 david 161
					}
162
					else {
1321 aurelien 163
						// print "vide";
445 david 164
					}
165
					$i++;
166
				}
167
			}
168
		}
760 aurelien 169
		$message = '';
170
 
171
		if($this->cpt_images_liees > 0) {
172
			$message = $this->cpt_images_liees.' images liees pour ';
173
		}
174
 
175
		$message .= $cpt_obs;
176
		print $message;
417 aurelien 177
	}
178
 
1321 aurelien 179
	function analyserLigne($line,$i) {
760 aurelien 180
 
1321 aurelien 181
		$ligne_vide=true;
182
		$ligne_image_seulement=true;
183
		$ligne_normale=true;
184
 
185
		$ligne_identique_sauf_image = true;
186
 
187
		foreach ($this->format_observation as $colonne) {
760 aurelien 188
 
1321 aurelien 189
			if($i < 1) {
760 aurelien 190
				$ligne_identique_sauf_image = false;
1321 aurelien 191
			} else {
192
 
193
				if($colonne!= IMAGE && isset($line[$colonne]) && isset($line[$colonne][$i - 1]) && isset($line[$colonne][$i])
194
					&& $line[$colonne][$i - 1] != $line[$colonne][$i] && $line[$colonne][$i] != '') {
195
					$ligne_identique_sauf_image = false;
196
				}
197
			}
198
 
199
			if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
200
				if ($colonne!=IMAGE) {
201
					$ligne_image_seulement=false;
202
					$ligne_vide=false;
203
				}
445 david 204
				$ligne_vide=false;
205
			}
206
		}
1321 aurelien 207
 
208
		if ($ligne_vide) {
209
			return LIGNE_VIDE;
210
		}
445 david 211
		else {
1321 aurelien 212
			if ($ligne_image_seulement || $ligne_identique_sauf_image) {
213
				return LIGNE_IMAGE_SEULEMENT;
214
			}
215
			else {
216
				return LIGNE_NORMALE;
217
			}
445 david 218
		}
219
	}
417 aurelien 220
 
1321 aurelien 221
	function traiterLigne($line,$i,$utilisateur) {
222
		// Controle donnee et insertion
223
		$info_image=array();
224
		$info_transmettre = "0";
225
		$info_espece = array('en_id_nom' => '',
226
			'nom_sel' => '',
1322 aurelien 227
			'nom_sel_nn' => '',
1321 aurelien 228
			'nom_ret' => '',
229
			'nom_ret_nn' => '',
230
			'nt' => '',
231
			'famille' => ''
232
		);
1322 aurelien 233
		$info_commune = array('nom' => '', 'code' => '');
1321 aurelien 234
 
235
		foreach ($this->format_observation as $colonne) {
236
			if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
237
				switch ($colonne) {  // On ne garde que les colonnes que l'on souhaite traiter
238
					case COMMUNE:
239
						$info_commune = $this->traiterCommune($line[COMMUNE][$i]);
240
						break;
241
					case LIEUDIT:
242
						$info_lieudit = $this->traiterLieudit($line[LIEUDIT][$i]);
243
						break;
244
					case STATION:
245
						$info_station = $this->traiterStation($line[STATION][$i]);
246
						break;
247
					case MILIEU:
248
						$info_milieu = $this->traiterMilieu($line[MILIEU][$i]);
249
						break;
250
	                case DEPARTEMENT:
1322 aurelien 251
	                	$dpt = $this->traiterDepartement($line[DEPARTEMENT][$i]);
252
	                	if(is_numeric($dpt) && strlen($dpt == 5) && $info_commune['code'] == 'NULL') {
253
	                		$info_commune['code'] = $dpt;
254
	                	}
1321 aurelien 255
						break;
256
					case LATITUDE:
257
						$info_latitude = $this->traiterLatitude($line[LATITUDE][$i]);
258
						break;
259
					case LONGITUDE:
260
						$info_longitude = $this->traiterLongitude($line[LONGITUDE][$i]);
261
						break;
262
					case NOTES:
263
						$info_notes = $this->traiterNotes($line[NOTES][$i]);
264
						break;
265
					case DATEOBS:
266
						$info_dateobs = $this->traiterDateObs($line[DATEOBS][$i]);
267
						break;
268
					case TRANSMETTRE:
269
						$info_transmettre = $this->traiterTransmettre($line[TRANSMETTRE][$i]);
445 david 270
					break;
1321 aurelien 271
					case ESPECE:
272
						$chercheur_infos_taxon = new RechercheInfosTaxon($this->config);
273
						$resultat_recherche_espece = $chercheur_infos_taxon->rechercherInfosSurTexteCodeOuNumTax($line[ESPECE][$i]);
274
	                    if (isset($resultat_recherche_espece['en_id_nom']) && $resultat_recherche_espece['en_id_nom']!='') {
275
	                    	$info_espece['nom_sel'] = $resultat_recherche_espece['nom_sel'];
276
	                    	$info_espece['nom_sel_nn'] = $resultat_recherche_espece['en_id_nom'];
277
	                        $complement = $chercheur_infos_taxon->rechercherInformationsComplementairesSurNumNom($resultat_recherche_espece['en_id_nom']);
278
	                        $info_espece['nom_ret'] = $complement['Nom_Retenu'];
279
	                        $info_espece['nom_ret_nn'] = $complement['Num_Nom_Retenu'];
280
	                        $info_espece['nt'] = $complement['Num_Taxon'];
281
	                        $info_espece['famille'] = $complement['Famille'];
282
	                    } else {
283
	                    	$info_espece['nom_sel'] = $line[ESPECE][$i];
284
	                    }
285
	                    break;
286
					case IMAGE:
287
						$info_image=$this->traiterImage($line[IMAGE][$i],$utilisateur); // Image separee par des / +  utilisateur
288
						break;
289
				}
445 david 290
			}
1321 aurelien 291
			else {
292
			 	switch($colonne) {
293
					case COMMUNE:
294
						$info_commune['nom']="";
295
						break;
296
					case LIEUDIT:
297
						$info_lieudit="";
298
						break;
299
					case STATION:
300
						$info_station="";
301
						break;
302
					case MILIEU:
303
						$info_milieu="";
304
						break;
305
					case DEPARTEMENT:
306
			            if (!isset ($info_commune['code']) || $info_commune['code']=='') {
307
						    $info_commune['code']="";
308
	                    }
309
						break;
310
					case LATITUDE:
311
						$info_latitude = "";
312
						break;
313
					case LONGITUDE:
314
						$info_longitude = "";
315
						break;
316
					case NOTES:
317
						$info_notes='';
318
						break;
319
					case TRANSMETTRE:
320
						$info_transmettre = "0";
480 david 321
					break;
1321 aurelien 322
				}
480 david 323
			}
324
		}
760 aurelien 325
 
1321 aurelien 326
        $this->dernier_ordre++;
327
        list($jour,$mois,$annee) = isset($info_dateobs) ? explode("/",$info_dateobs) : array(null,null,null);
328
        $info_dateobs=$annee."-".$mois."-".$jour." 0:0:0";
329
        $requete  = "INSERT INTO cel_obs (".
330
	        "ce_utilisateur,ordre,".
331
	        "nom_sel,nom_sel_nn,nom_ret,nom_ret_nn,nt,famille,".
332
	        "zone_geo,ce_zone_geo,".
333
	        "date_observation,".
334
	        "lieudit,station, milieu, commentaire, transmission, ".
335
	        "date_creation,date_modification,latitude,longitude) ".
336
	        " VALUES(".$this->proteger($utilisateur).",".
337
	        $this->proteger($this->dernier_ordre).",".
338
	        $this->proteger($info_espece['nom_sel']).",".
339
	        $this->proteger($info_espece['nom_sel_nn']).",".
340
	        $this->proteger($info_espece['nom_ret']).",".
341
	        $this->proteger($info_espece['nom_ret_nn']).",".
342
	        $this->proteger($info_espece['nt']).",".
343
	        $this->proteger($info_espece['famille']).",".
344
	        $this->proteger($info_commune['nom']).",".
1322 aurelien 345
	        $this->proteger('INSEE-C:'.$info_commune['code']).",".
1321 aurelien 346
	        $this->proteger($info_dateobs).",".
347
	        $this->proteger($info_lieudit).",".
348
	        $this->proteger($info_station).",".
349
	        $this->proteger($info_milieu).",".
350
	        $this->proteger($info_notes).",".
351
	        $this->proteger($info_transmettre).",".
352
	        "now() , now(),".
353
	        $this->proteger($info_latitude).",".
354
	        $this->proteger($info_longitude).")";
760 aurelien 355
 
1321 aurelien 356
		$insertion = $this->executer($requete);
357
 
1322 aurelien 358
		$requete_id_obs = 'SELECT id_observation FROM cel_obs WHERE ordre = '.$this->proteger($this->dernier_ordre).' AND ce_utilisateur = '.$this->proteger($utilisateur);
359
		$resultat_id_obs = $this->requeter($requete_id_obs);
360
 
361
		$id_obs = $resultat_id_obs[0]['id_observation'];
362
 
1321 aurelien 363
		// creation lien image
364
		foreach ($info_image as $pic) {
1322 aurelien 365
 
366
			$requete_liaison = 'INSERT INTO cel_obs_images (id_image, id_utilisateur, id_observation ) VALUES ('.$this->proteger($pic['id_image']).','.$this->proteger($utilisateur).', '.$id_obs.') ON DUPLICATE KEY UPDATE id_image = id_image ';
1321 aurelien 367
			$liaison = $this->executer($requete_liaison);
368
            if ($liaison !== false) {
369
            	$this->cpt_images_liees++;
370
            } else {
371
            	return false;
540 david 372
            }
1321 aurelien 373
		}
374
 
1322 aurelien 375
		return $id_obs;
445 david 376
	}
377
 
1322 aurelien 378
	function traiterLigneComplement($line,$i,$utilisateur, $id_obs = null) {
1321 aurelien 379
 
380
		$info_image=$this->traiterImage($line[IMAGE][$i],$utilisateur); // Image separee par des / +  utilisateur
381
		// creation lien image
382
		foreach ($info_image as $pic) {
1322 aurelien 383
			$requete = 'INSERT INTO cel_obs_images (id_image, id_utilisateur, id_observation) VALUES ('.$this->proteger($pic['id_image']).','.$this->proteger($utilisateur).', '.$this->proteger($id_obs).') ON DUPLICATE KEY UPDATE id_image = id_image' ;
1321 aurelien 384
			$resultat_liaison = $this->executer($requete);
385
	    	if ($resultat_liaison !== false) {
386
	    		$this->cpt_images_liees++;
387
	    	} else {
388
	    		return false;
389
	    	}
390
		}
445 david 391
	}
392
 
1321 aurelien 393
	function traiterCommune($identifiant_commune) {
394
		// Recherche correspondance sur nom, si pas unique, correspondance dep. sinon code insee
395
	    $identifiant_commune=trim($identifiant_commune);
396
	    $identifiant_commune=utf8_encode($identifiant_commune); // FIXME : devrait deja etre en utf8 a ce niveau
1081 aurelien 397
 
1321 aurelien 398
		preg_match('/(.*) \(([0-9][0-9]*)\)/',$identifiant_commune,$elements);
399
 
400
		if (isset($elements[1])) { // commune + departement : montpellier (34)
401
			$nom_commune=$elements[1];
402
			$code_commune=$elements[2];
403
	 	    $requete="SELECT DISTINCT nom, code  FROM cel_zone_geo WHERE nom = ".$this->proteger($nom_commune)." AND code LIKE ".$this->proteger($code_commune.'%');
404
		}
405
		else { // Code insee seul
406
	        preg_match('/([0-9][0-9]*)|(2A[0-9][0-9]*)|(2B[0-9][0-9]*)/',$identifiant_commune,$elements);
407
	        if (isset($elements[1])) { // code insee  commune
408
	            $code_insee_commune=$elements[1];
409
	            $requete="SELECT DISTINCT nom, code  FROM cel_zones_geo WHERE code = ".$this->proteger($code_insee_commune);
410
	        }
411
	        else { // Commune seule (le departement sera recupere dans la colonne departement si elle est presente, on prend le risque ici de retourner une mauvaise
412
	               // Commune
413
	            preg_match('/(.*)/',$identifiant_commune,$elements);
414
	            if (isset($elements[1])) { // commune
415
	                $nom_commune=$elements[1];
416
	                $nom_commune=trim($nom_commune);
417
	                $nom_commune=utf8_decode($nom_commune);
418
	                $nom_commune=cp1252_to_utf8($nom_commune);
419
	                $nom_commune=remove_accent($nom_commune);
420
	                $nom_commune=preg_replace("/ /","%",$nom_commune);
421
	                $requete="SELECT DISTINCT nom, code  FROM cel_zones_geo WHERE nom like ".$this->proteger($nom_commune.'%');
422
	            }
423
	        }
424
		}
425
 
426
		$resultat_commune = $this->requeter($requete);
427
 
428
		// cas de la commune introuvable dans le référentiel
429
		if(!is_array($resultat_commune) || count($resultat_commune) == 0) {
430
			$resultat_commune['nom'] = fix_latin($identifiant_commune);
431
			$resultat_commune['code'] = 'NULL';
432
		} else {
433
			$resultat_commune = $resultat_commune[0];
434
		}
435
 
436
		return $resultat_commune;
1081 aurelien 437
	}
445 david 438
 
1321 aurelien 439
	function traiterLieudit($lieudit) {
440
		// texte libre
441
	    $lieudit=fix_latin($lieudit);
442
		return trim($lieudit);
443
	}
445 david 444
 
1321 aurelien 445
	function traiterStation($station) {
446
		// texte libre
447
	    $station=fix_latin($station);
448
		return trim($station);
449
	}
445 david 450
 
1321 aurelien 451
	function traiterMilieu($milieu) {
452
		// texte libre
453
	    $milieu=fix_latin($milieu);
454
		return trim($milieu);
455
	}
445 david 456
 
1321 aurelien 457
	function traiterDepartement($departement) {
458
		// texte libre
459
		if(is_numeric($departement) && strlen($departement) == 4) {
460
			$departement = "0"+$departement;
461
		}
760 aurelien 462
 
1321 aurelien 463
		if(is_numeric($departement) && $departement <= 9) {
464
			$departement = "0"+$departement;
465
		}
1322 aurelien 466
 
1321 aurelien 467
		return utf8_encode(trim($departement));
760 aurelien 468
	}
1081 aurelien 469
 
1321 aurelien 470
	function traiterLatitude($latitude) {
471
		//  verifier formal decimal + limite france ? TODO
472
		return trim($latitude);
1081 aurelien 473
	}
760 aurelien 474
 
1321 aurelien 475
	function traiterLongitude($longitude) {
476
		// verifier format decimal + limite france ? TODO
477
		return trim($longitude);
478
	}
760 aurelien 479
 
1321 aurelien 480
	function traiterNotes($notes) {
481
		// texte libre
482
	    $notes=remove_accent($notes);
483
		return utf8_encode(trim($notes));
760 aurelien 484
	}
485
 
1321 aurelien 486
	function traiterDateObs($dateobs) {
487
		// verifier jj/mm/aaaa sinon date vide TODO
488
		$date = trim($dateobs);
489
		if(!preg_match("#[0-9]{2}/[0-9]{2}/([0-9]{4}|[0-9]{2})#", $date)) {
490
			$date = '00/00/0000';
491
		}
492
		return $date;
493
	}
760 aurelien 494
 
1321 aurelien 495
	function traiterTransmettre($transmettre) {
496
		$transmission = '0';
497
		if (trim($transmettre) == "1" || trim($transmettre) == "oui") {
498
			$transmission = '1';
499
		}
500
		return $transmission;
501
	}
540 david 502
 
1321 aurelien 503
	function traiterImage($images,$utilisateur) { // recherche id image de ce nom
504
		$liste_images = explode("/",$images) ;
505
		$row =array();
506
	   	foreach($liste_images as $image) {
507
			$requete = "SELECT * FROM cel_images WHERE ce_utilisateur = ".$this->proteger($utilisateur)." AND nom_original= ".$this->proteger($image);
508
			$ligne = $this->requeter($requete);
509
		    if(is_array($ligne) && !empty($ligne)) {
510
		    	$row[] = $ligne[0];
511
		    }
449 david 512
		}
1321 aurelien 513
		return $row;
480 david 514
	}
445 david 515
}
516
 
582 david 517
function init_byte_map(){
606 aurelien 518
    $byte_map = array();
582 david 519
    for($x=128;$x<256;++$x){
520
        $byte_map[chr($x)]=utf8_encode(chr($x));
521
    }
522
    $cp1252_map=array(
523
            "\x80"=>"\xE2\x82\xAC",    // EURO SIGN
524
            "\x82" => "\xE2\x80\x9A",  // SINGLE LOW-9 QUOTATION MARK
525
            "\x83" => "\xC6\x92",      // LATIN SMALL LETTER F WITH HOOK
526
            "\x84" => "\xE2\x80\x9E",  // DOUBLE LOW-9 QUOTATION MARK
527
            "\x85" => "\xE2\x80\xA6",  // HORIZONTAL ELLIPSIS
528
            "\x86" => "\xE2\x80\xA0",  // DAGGER
529
            "\x87" => "\xE2\x80\xA1",  // DOUBLE DAGGER
530
            "\x88" => "\xCB\x86",      // MODIFIER LETTER CIRCUMFLEX ACCENT
531
            "\x89" => "\xE2\x80\xB0",  // PER MILLE SIGN
532
            "\x8A" => "\xC5\xA0",      // LATIN CAPITAL LETTER S WITH CARON
533
            "\x8B" => "\xE2\x80\xB9",  // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
534
            "\x8C" => "\xC5\x92",      // LATIN CAPITAL LIGATURE OE
535
            "\x8E" => "\xC5\xBD",      // LATIN CAPITAL LETTER Z WITH CARON
536
            "\x91" => "\xE2\x80\x98",  // LEFT SINGLE QUOTATION MARK
537
            "\x92" => "\xE2\x80\x99",  // RIGHT SINGLE QUOTATION MARK
538
            "\x93" => "\xE2\x80\x9C",  // LEFT DOUBLE QUOTATION MARK
539
            "\x94" => "\xE2\x80\x9D",  // RIGHT DOUBLE QUOTATION MARK
540
            "\x95" => "\xE2\x80\xA2",  // BULLET
541
            "\x96" => "\xE2\x80\x93",  // EN DASH
542
            "\x97" => "\xE2\x80\x94",  // EM DASH
543
            "\x98" => "\xCB\x9C",      // SMALL TILDE
544
            "\x99" => "\xE2\x84\xA2",  // TRADE MARK SIGN
545
            "\x9A" => "\xC5\xA1",      // LATIN SMALL LETTER S WITH CARON
546
            "\x9B" => "\xE2\x80\xBA",  // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
547
            "\x9C" => "\xC5\x93",      // LATIN SMALL LIGATURE OE
548
            "\x9E" => "\xC5\xBE",      // LATIN SMALL LETTER Z WITH CARON
549
            "\x9F" => "\xC5\xB8"       // LATIN CAPITAL LETTER Y WITH DIAERESIS
550
                );
551
    foreach($cp1252_map as $k=>$v){
552
        $byte_map[$k]=$v;
553
    }
606 aurelien 554
 
555
    return $byte_map;
582 david 556
}
449 david 557
 
602 aurelien 558
function fix_latin($instr){
559
 
606 aurelien 560
    $byte_map = init_byte_map();
561
 
602 aurelien 562
    $ascii_char='[\x00-\x7F]';
563
    $cont_byte='[\x80-\xBF]';
564
    $utf8_2='[\xC0-\xDF]'.$cont_byte;
565
    $utf8_3='[\xE0-\xEF]'.$cont_byte.'{2}';
566
    $utf8_4='[\xF0-\xF7]'.$cont_byte.'{3}';
567
    $utf8_5='[\xF8-\xFB]'.$cont_byte.'{4}';
606 aurelien 568
 
602 aurelien 569
    $nibble_good_chars = "@^($ascii_char+|$utf8_2|$utf8_3|$utf8_4|$utf8_5)(.*)$@s";
601 aurelien 570
 
582 david 571
    if(mb_check_encoding($instr,'UTF-8'))return $instr; // no need for the rest if it's all valid UTF-8 already
572
    $outstr='';
573
    $char='';
574
    $rest='';
575
    while((strlen($instr))>0){
602 aurelien 576
        if(1==@preg_match($nibble_good_chars,$instr,$match)){
582 david 577
            $char=$match[1];
578
            $rest=$match[2];
579
            $outstr.=$char;
602 aurelien 580
        }elseif(1==@preg_match('@^(.)(.*)$@s',$instr,$match)){
582 david 581
            $char=$match[1];
582
            $rest=$match[2];
583
            $outstr.=$byte_map[$char];
584
        }
585
        $instr=$rest;
586
    }
587
    return $outstr;
588
}
589
 
1321 aurelien 590
function remove_accent($str) {
540 david 591
  $a = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î',
592
             'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß',
593
             'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î',
594
             'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'Ā',
595
             'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ', 'ĉ', 'Ċ', 'ċ', 'Č', 'č', 'Ď', 'ď',
596
             'Đ', 'đ', 'Ē', 'ē', 'Ĕ', 'ĕ', 'Ė', 'ė', 'Ę', 'ę', 'Ě', 'ě', 'Ĝ', 'ĝ', 'Ğ',
597
             'ğ', 'Ġ', 'ġ', 'Ģ', 'ģ', 'Ĥ', 'ĥ', 'Ħ', 'ħ', 'Ĩ', 'ĩ', 'Ī', 'ī', 'Ĭ', 'ĭ',
598
             'Į', 'į', 'İ', 'ı', 'IJ', 'ij', 'Ĵ', 'ĵ', 'Ķ', 'ķ', 'Ĺ', 'ĺ', 'Ļ', 'ļ', 'Ľ',
599
             'ľ', 'Ŀ', 'ŀ', 'Ł', 'ł', 'Ń', 'ń', 'Ņ', 'ņ', 'Ň', 'ň', 'ʼn', 'Ō', 'ō', 'Ŏ',
600
             'ŏ', 'Ő', 'ő', 'Œ', 'œ', 'Ŕ', 'ŕ', 'Ŗ', 'ŗ', 'Ř', 'ř', 'Ś', 'ś', 'Ŝ', 'ŝ',
601
             'Ş', 'ş', 'Š', 'š', 'Ţ', 'ţ', 'Ť', 'ť', 'Ŧ', 'ŧ', 'Ũ', 'ũ', 'Ū', 'ū', 'Ŭ',
602
             'ŭ', 'Ů', 'ů', 'Ű', 'ű', 'Ų', 'ų', 'Ŵ', 'ŵ', 'Ŷ', 'ŷ', 'Ÿ', 'Ź', 'ź', 'Ż',
603
             'ż', 'Ž', 'ž', 'ſ', 'ƒ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ǎ', 'ǎ', 'Ǐ', 'ǐ', 'Ǒ', 'ǒ',
604
             'Ǔ', 'ǔ', 'Ǖ', 'ǖ', 'Ǘ', 'ǘ', 'Ǚ', 'ǚ', 'Ǜ', 'ǜ', 'Ǻ', 'ǻ', 'Ǽ', 'ǽ', 'Ǿ', 'ǿ');
605
 
606
  $b = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I',
607
             'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's',
608
             'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i',
609
             'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'a',
610
             'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd',
611
             'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g',
612
             'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i',
613
             'IJ', 'ij', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'l', 'l',
614
             'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R',
615
             'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't',
616
             'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y',
617
             'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I',
618
             'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o');
619
  return str_replace($a, $b, $str);
620
}
449 david 621
 
540 david 622
function cp1252_to_utf8($str) {
1321 aurelien 623
	$cp1252_map = array ("\xc2\x80" => "\xe2\x82\xac",
624
		"\xc2\x82" => "\xe2\x80\x9a",
625
		"\xc2\x83" => "\xc6\x92",
626
		"\xc2\x84" => "\xe2\x80\x9e",
627
		"\xc2\x85" => "\xe2\x80\xa6",
628
		"\xc2\x86" => "\xe2\x80\xa0",
629
		"\xc2\x87" => "\xe2\x80\xa1",
630
		"\xc2\x88" => "\xcb\x86",
631
		"\xc2\x89" => "\xe2\x80\xb0",
632
		"\xc2\x8a" => "\xc5\xa0",
633
		"\xc2\x8b" => "\xe2\x80\xb9",
634
		"\xc2\x8c" => "\xc5\x92",
635
		"\xc2\x8e" => "\xc5\xbd",
636
		"\xc2\x91" => "\xe2\x80\x98",
637
		"\xc2\x92" => "\xe2\x80\x99",
638
		"\xc2\x93" => "\xe2\x80\x9c",
639
		"\xc2\x94" => "\xe2\x80\x9d",
640
		"\xc2\x95" => "\xe2\x80\xa2",
641
		"\xc2\x96" => "\xe2\x80\x93",
642
		"\xc2\x97" => "\xe2\x80\x94",
643
 
644
		"\xc2\x98" => "\xcb\x9c",
645
		"\xc2\x99" => "\xe2\x84\xa2",
646
		"\xc2\x9a" => "\xc5\xa1",
647
		"\xc2\x9b" => "\xe2\x80\xba",
648
		"\xc2\x9c" => "\xc5\x93",
649
		"\xc2\x9e" => "\xc5\xbe",
650
		"\xc2\x9f" => "\xc5\xb8"
651
	);
652
	return strtr(utf8_encode($str), $cp1252_map);
540 david 653
}
1321 aurelien 654
?>