Subversion Repositories Applications.referentiel

Rev

Rev 186 | Rev 190 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
20 jpm 1
<?php
2
// Encodage : UTF-8
3
// +-------------------------------------------------------------------------------------------------------------------+
4
/**
5
* Tests de référentiels de nomenclature et taxonomie
6
*
7
* Description : classe permettant de tester les référentiels selon le manuel technique
8
* Utilisation : php script.php tests -p bdnff -a tout
9
*
10
//Auteur original :
11
* @author       Jean-Pascal MILCENT <jpm@tela-botanica.org>
12
* @copyright	Tela-Botanica 1999-2010
13
* @link			http://www.tela-botanica.org/wikini/RTaxMethodo/wakka.php?wiki=MaNuel
14
* @licence		GPL v3 & CeCILL v2
15
* @version		$Id$
16
*/
17
// +-------------------------------------------------------------------------------------------------------------------+
38 jpm 18
// TODO : supprimer l'utilisation du paramêtres 'p' et chercher les infos depuis la bdd
20 jpm 19
class Tests extends ScriptCommande {
20
 
42 jpm 21
	const SCRIPT_NOM = 'tests';
22
 
20 jpm 23
	private $projet = null;
30 jpm 24
	private $traitement = null;
20 jpm 25
 
26
	private $manuel = null;
171 jpm 27
	private $tests = null;
167 jpm 28
	private $colonnes = null;
29
	private $analyses = null;
64 jpm 30
	private $noms = null;
20 jpm 31
 
30 jpm 32
	private $resultatDao = null;
33
	private $traitementDao = null;
34
	private $tableStructureDao = null;
35
	private $referentielDao = null;
36
 
20 jpm 37
	public function executer() {
150 jpm 38
		$this->manuel = parse_ini_file(Config::get('chemin_appli').DS.'..'.DS.'configurations'.DS.'referentiel_v4.1.ini');
176 jpm 39
		$this->definirConstantes();
171 jpm 40
		$this->tests = parse_ini_file($this->getModuleChemin().DS.'configurations'.DS.'tests.ini', true);
20 jpm 41
 
30 jpm 42
		$this->resultatDao = new ResultatDao();
43
		$this->traitementDao = new TraitementDao();
97 jpm 44
		Debug::printr('Dans le script test');
30 jpm 45
		// Récupération du dernier traitement demandé
142 delphine 46
		$this->traitement = $this->traitementDao->getDernierTraitement('tout', self::SCRIPT_NOM);
42 jpm 47
		if (isset($this->traitement)) {
142 delphine 48
			$this->projet = $this->traitement['referentiel_code']; // Récupération du nom de projet
38 jpm 49
			Debug::printr($this->traitement);
50
			// Écriture de la date de début du traitement
51
			Debug::printr('Debute:'.$this->traitementDao->debuterTraitement($this->traitement['id_traitement']));
52
 
53
			// Nettoyage des traitements obsolètes
42 jpm 54
			$traitements_obsoletes = $this->traitementDao->getTraitementsObsoletes($this->projet, self::SCRIPT_NOM);
55
			if (isset($traitements_obsoletes)) {
56
				Debug::printr('Supp. obsoletes:'.$this->traitementDao->supprimer($traitements_obsoletes));
57
			}
38 jpm 58
 
165 delphine 59
			$this->tableStructureDao = new TableStructureDao();
60
			$this->referentielDao = new ReferentielDao();
61
 
38 jpm 62
			// Lancement du test demandé
63
			$cmd = $this->getParam('a');
64
	    	switch ($cmd) {
65
				case 'tout' :
66
					Debug::printr('Départ lancement test:');
165 delphine 67
					$this->recupererDonnees();
177 jpm 68
					$this->lancerTestsAuto();
38 jpm 69
					break;
165 delphine 70
				case 'test11' :
71
					$this->recupererDonnees();
72
					Debug::printr('Départ lancement test 11 :');
73
					$this->testerClassificationRang();
74
					break;
38 jpm 75
				default :
76
					$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
77
			}
78
			// Écriture de la date de fin du traitement
79
			Debug::printr('Termine:'.$this->traitementDao->terminerTraitement($this->traitement['id_traitement']));
97 jpm 80
		} else {
142 delphine 81
			Debug::printr("Aucun dernier traitement trouvé pour le script '".self::SCRIPT_NOM."' !");
20 jpm 82
		}
83
    }
165 delphine 84
 
176 jpm 85
    /**
86
     * Cette méthode définie des constantes qui peuvent ensuite être utilisée dans les fichier ini.
87
     * Surtout utile pour le fichier tests.ini
88
     */
89
    private function definirConstantes() {
90
    	define('RANG_GENRE', $this->manuel['rang_genre']);
91
    	define('RANG_SP', $this->manuel['rang_sp']);
188 delphine 92
    	date_default_timezone_set('Europe/Berlin');
93
    	define('ANNEE_EN_COURS', date('Y'));
94
    	define('ANNEE_MINIMUM', 1753);
176 jpm 95
    }
96
 
165 delphine 97
    public function recupererDonnees() {
20 jpm 98
		// Récupération des données à tester
167 jpm 99
		$this->colonnes = $this->tableStructureDao->getColonnes($this->projet);
100
		$this->analyses = $this->tableStructureDao->getAnalyse($this->projet);
64 jpm 101
		$this->noms = $this->referentielDao->getTout($this->projet);
102
		Debug::printr('Nbre noms :'.count($this->noms));
165 delphine 103
    }
104
 
175 jpm 105
    public function lancerTestsAuto() {
106
		$resultats = array();
107
 
108
		// Lancement des tests unitaires
177 jpm 109
		Debug::printr('Lancement des tests unitaires');
183 jpm 110
		$tests_numeros = array_keys($this->tests);
111
		Debug::printr($tests_numeros);
112
    	foreach ($tests_numeros as $numero) {
175 jpm 113
			$info = $this->getInfosTest($numero);
114
 
115
    		if ($numero < 5) {
116
    			// Tests spéciaux vérifiant la structure de la table
117
    			$resultats[] = $this->lancerTestUnitaire($info);
118
    		} else if ($numero >= 5 && $this->verifierResultats($resultats)) {
119
				// Si la structure est bonne nous lançons les autres tests
177 jpm 120
				$this->lancerTestUnitaire($info);
175 jpm 121
    		}
122
		}
123
    }
183 jpm 124
 
125
    private function getInfosTest($numero) {
126
		$info = $this->tests[$numero];
127
		$info['methode'] = 'tester'.implode('', explode(' ', ucwords($info['abr'])));
128
		$info['numero'] = $numero;
129
		$info['nom'] = '#'.$numero.' - '.$info['nom'];
130
		$info['resultat'] = false;
131
		return $info;
132
	}
175 jpm 133
 
134
    public function lancerTestUnitaire($info) {
177 jpm 135
		Debug::printr($info['numero'].'::'.$info['methode']);
136
    	$methodeDeTest = $info['methode'];
137
    	$erreurs = $this->$methodeDeTest();
175 jpm 138
 
139
    	// Analyse des résultats
140
    	if (isset($erreurs['special'])) {
141
    		$info = $erreurs;
142
    	} else {
176 jpm 143
    		if (count($erreurs) > 0) {
175 jpm 144
				$info['message']['entete'] = explode(',', $info['entete']);
183 jpm 145
				if (isset($info['title'])) {
146
					$info['message']['title'] = explode(';', $info['title']);
147
				}
175 jpm 148
				$info['message']['lignes'] = $erreurs;
176 jpm 149
				unset($erreurs);
175 jpm 150
			} else {
151
				$info['resultat'] = true;
152
			}
153
    	}
154
 
155
		$this->traiterResultatTest($info);
156
 
157
		if ($info['numero'] < 5) {
158
			return ($info['resultat'] ? '1' : '0');
159
		}
160
    }
64 jpm 161
 
162
	private function verifierResultats($resultats) {
163
		$ok = true;
164
		foreach ($resultats as $resultat) {
165
			if ($resultat == '0') {
166
				$ok = false;
167
				break;
168
			}
169
		}
170
		return $ok;
171
	}
20 jpm 172
 
30 jpm 173
	private function traiterResultatTest($info) {
174
		if (isset($info['message'])) {
175
			if (is_array($info['message'])) {
183 jpm 176
				$erreurs_nbre = count($info['message']['lignes']);
177
				$erreurs_max = 1000;
178
				if ($erreurs_nbre > $erreurs_max) {
179
					$info['message']['lignes'] = array_slice($info['message']['lignes'], 0, $erreurs_max);
180
					$info['erreur'] = "$erreurs_nbre erreurs ont été détectées seules les $erreurs_max premières sont affichées";
181
				}
31 jpm 182
				$info['message'] = $this->getVue('tests/squelettes/message_table', $info);
183
			} else {
184
				$info['message'] = $this->getVue('tests/squelettes/message_p', $info);
30 jpm 185
			}
186
		}
183 jpm 187
		Debug::printr($this->resultatDao->ajouter($this->traitement['id_traitement'], $info));
64 jpm 188
		$info = null;
30 jpm 189
	}
190
 
191
	//+--------------------------------------------------------------------------------------------------------------+//
20 jpm 192
	// TESTS
193
 
171 jpm 194
	/**
195
	 * Test #01
196
	 */
175 jpm 197
	private function testerNombreDeChamps() {
171 jpm 198
		$info = $this->getInfosTest(1);
175 jpm 199
		$info['special'] = true;
20 jpm 200
 
175 jpm 201
		$nbre_colonnes = count($this->colonnes);
171 jpm 202
		$info['message'] = $nbre_colonnes;
203
		if ($nbre_colonnes >= 35) {
204
			$info['resultat'] = true;
205
		}
175 jpm 206
 
207
		return $info;
171 jpm 208
	}
209
 
210
	/**
211
	 * Test #02
212
	 */
175 jpm 213
	private function testerNomDesChamps() {
171 jpm 214
		$info = $this->getInfosTest(2);
175 jpm 215
		$info['special'] = true;
171 jpm 216
 
217
		$champs_attendus = explode(',', $this->manuel['champs']);
218
		$champs_presents = array();
175 jpm 219
		foreach ($this->colonnes as $colonne) {
171 jpm 220
			$champs_presents[$colonne['Field']] = $colonne;
221
		}
222
 
223
		$ok = true;
224
		$champs_manquant = array();
225
		foreach ($champs_attendus as $champ_attendu) {
226
			if (!isset($champs_presents[$champ_attendu])) {
227
				$champs_manquant[] = $champ_attendu;
228
				$ok = false;
229
			}
230
		}
175 jpm 231
 
171 jpm 232
		$info['resultat'] = $ok;
233
		if (!$ok) {
234
			$info['message'] = sprintf($info['message'], implode(', ', $champs_manquant));
235
		}
236
 
175 jpm 237
		return $info;
171 jpm 238
	}
239
 
240
	/**
241
	 * Test #03
242
	 */
175 jpm 243
	private function testerTypeDesChamps() {
171 jpm 244
		$champs_attendus = explode(',', $this->manuel['champs_type']);
245
		$champs_presents = array();
175 jpm 246
		foreach ($this->colonnes as $colonne) {
171 jpm 247
			$champs_presents[$colonne['Field']] = $colonne['Type'];
248
		}
249
 
250
		// Recercherche des erreurs
251
		$champs_erreur = array();
252
		foreach ($champs_attendus as $champ_attendu) {
253
			list($champ_attendu_nom, $champ_attendu_type_taille) = explode('=', trim($champ_attendu));
254
			list($champ_attendu_type, $champ_attendu_taille) = explode('|', trim($champ_attendu_type_taille));
255
 
256
			if (isset($champs_presents[$champ_attendu_nom])) {
257
				$champs_present_type = $champs_presents[$champ_attendu_nom];
258
 
259
				if (($champ_attendu_type == 'VARCHAR' && strstr($champs_present_type, 'varchar') === false)
260
					|| ($champ_attendu_type == 'TEXT' && strstr($champs_present_type, 'text') === false)
261
					|| ($champ_attendu_type == 'INT' && strstr($champs_present_type, 'int') === false)
262
					|| ($champ_attendu_type == 'BOOL' && preg_match('/(?:bool|boolean|tinyint\(1\))/i', $champs_present_type) === false)) {
175 jpm 263
					$champs_erreur[] = array($champ_attendu, $champ_attendu_type, $champs_present_type);
171 jpm 264
				}
265
			}
266
		}
175 jpm 267
		return $champs_erreur;
171 jpm 268
	}
269
 
270
	/**
271
	 * Test #04
272
	 */
175 jpm 273
	private function testerNumNomClePrimaire() {
171 jpm 274
		$info = $this->getInfosTest(4);
175 jpm 275
		$info['special'] = true;
171 jpm 276
 
175 jpm 277
		foreach ($this->colonnes as $colonne) {
171 jpm 278
			if ($colonne['Field'] == 'num_nom' && $colonne['Key'] == 'PRI') {
279
				$info['resultat'] = true;
280
			}
281
		}
175 jpm 282
		return $info;
171 jpm 283
	}
284
 
285
 
286
	/**
287
	 * Test #05
288
	 */
175 jpm 289
	private function testerTailleDesChamps() {
171 jpm 290
		$tailles_champs_maxi = array();
175 jpm 291
		foreach ($this->colonnes as $colonne) {
171 jpm 292
			if (preg_match('/^varchar\(([0-9]+)\)$/', $colonne['Type'], $match)) {
293
				$tailles_champs_maxi[$colonne['Field']] = $match[1];
294
			}
295
		}
296
 
297
		$tailles_trouvees = array();
175 jpm 298
		foreach ($this->analyses as $analyse) {
171 jpm 299
			if (preg_match('/\.([^.]+)$/', $analyse['Field_name'], $match)) {
300
				$tailles_trouvees[$match[1]] = $analyse['Max_length'];
301
			}
302
		}
303
 
304
		$champs_erreur = array();
305
		$champs_attendus = explode(',', $this->manuel['champs']);
306
		foreach ($champs_attendus as $champ_attendu) {
307
			if (isset($tailles_champs_maxi[$champ_attendu]) && isset($tailles_trouvees[$champ_attendu])) {
308
				if ($tailles_champs_maxi[$champ_attendu] == $tailles_trouvees[$champ_attendu]) {
175 jpm 309
					$champs_erreur[] = array($champ_attendu, $tailles_champs_maxi[$champ_attendu], $tailles_trouvees[$champ_attendu]);
171 jpm 310
				}
311
			}
312
		}
175 jpm 313
		return $champs_erreur;
171 jpm 314
	}
315
 
316
	/**
317
	 * Test #06
318
	 */
319
	private function testerNumNomSuperieurAZero() {
20 jpm 320
		$noms_erreur = array();
64 jpm 321
		foreach ($this->noms as &$nom) {
171 jpm 322
			if ($nom['num_nom'] <= 0) {
175 jpm 323
				$noms_erreur[] = array($nom['num_nom']);
20 jpm 324
			}
325
		}
175 jpm 326
		return $noms_erreur;
20 jpm 327
	}
328
 
171 jpm 329
	/**
330
	 * Test #07
331
	 */
332
	private function testerNumNomRetenuSuperieurAZero() {
20 jpm 333
		$noms_erreur = array();
64 jpm 334
		foreach ($this->noms as &$nom) {
171 jpm 335
			if ($nom['num_nom_retenu'] != '' && $nom['num_nom_retenu'] <= 0) {
175 jpm 336
				$noms_erreur[] = array($nom['num_nom'], $nom['num_nom_retenu']);
20 jpm 337
			}
338
		}
176 jpm 339
		return $noms_erreur;
20 jpm 340
	}
341
 
171 jpm 342
	/**
343
	 * Test #08
344
	 */
345
	private function testerNumTaxSupEgalZeroUnique() {
20 jpm 346
		$noms_erreur = array();
64 jpm 347
		foreach ($this->noms as &$nom) {
171 jpm 348
			if (preg_match('/^0$/', $nom['num_tax_sup'])) {
175 jpm 349
				$noms_erreur[] = array($nom['num_nom'], $nom['num_tax_sup']);
20 jpm 350
			}
351
		}
176 jpm 352
		// Ce test est spécial car le nombre de noms en erreurs doit être supérieur à 1 et non à 0 pour être KO.
353
		if (count($noms_erreur) == 1) {
177 jpm 354
			$noms_erreur = array();
20 jpm 355
		}
176 jpm 356
		return $noms_erreur;
20 jpm 357
	}
358
 
171 jpm 359
	/**
360
	 * Test #09
361
	 */
362
	private function testerTaxSupPourTaxon() {
20 jpm 363
		$noms_erreur = array();
64 jpm 364
		foreach ($this->noms as &$nom) {
171 jpm 365
			if ($nom['num_nom_retenu'] != $nom['num_nom'] && $nom['num_tax_sup'] != '') {
183 jpm 366
				$noms_erreur[] = array($nom['num_nom'], $nom['num_tax_sup'], $nom['exclure_taxref']);
20 jpm 367
			}
368
		}
176 jpm 369
		return $noms_erreur;
20 jpm 370
	}
371
 
171 jpm 372
	/**
373
	 * Test #10
374
	 */
375
	private function testerExitenceTaxonSuperieur() {
20 jpm 376
		$noms_erreur = array();
64 jpm 377
		foreach ($this->noms as &$nom) {
171 jpm 378
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
379
				if ($nom['num_tax_sup'] != 0 && !isset($this->noms[$nom['num_tax_sup']])) {
183 jpm 380
					$noms_erreur[] = array($nom['num_nom'], $nom['num_tax_sup'], $nom['exclure_taxref']);
171 jpm 381
				}
20 jpm 382
			}
383
		}
176 jpm 384
		return $noms_erreur;
20 jpm 385
	}
386
 
171 jpm 387
	/**
388
	 * Test #11
389
	 */
390
	private function testerClassificationRang() {
20 jpm 391
		$noms_erreur = array();
64 jpm 392
		foreach ($this->noms as &$nom) {
171 jpm 393
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
394
				if (isset($this->noms[$nom['num_tax_sup']])) {
395
					$nom_sup = $this->noms[$nom['num_tax_sup']];
396
					if ($nom_sup['rang'] >= $nom['rang']) {
397
						// Prise en compte de l'exception des clades
398
						if (! ($nom_sup['rang'] == 70 && $nom['rang'] == 70)) {
183 jpm 399
							$noms_erreur[] = array($nom['num_nom'], $nom['rang'], $nom_sup['num_nom'], $nom_sup['rang'], $nom['exclure_taxref']);
171 jpm 400
						}
401
					}
20 jpm 402
				}
403
			}
404
		}
176 jpm 405
		return $noms_erreur;
20 jpm 406
	}
407
 
171 jpm 408
	/**
409
	 * Test #12
410
	 */
411
	private function testerClassification() {
20 jpm 412
		$noms_erreur = array();
171 jpm 413
		$this->noms_ok = array();
64 jpm 414
		foreach ($this->noms as &$nom) {
171 jpm 415
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
416
				if (isset($this->noms_ok[$nom['num_tax_sup']])) {
417
					$this->noms_ok[$nom['num_nom']] = true;
418
				} else {
419
					$this->detection_boucle_infini = array();
420
					$classif_ok = $this->remonterClassif($nom);
421
					unset($this->detection_boucle_infini);
422
 
175 jpm 423
					if ($classif_ok === true) {
424
						$this->noms_ok[$nom['num_nom']] = $classif_ok;
171 jpm 425
					} else {
183 jpm 426
						$noms_erreur[] = array($nom['num_nom'], $classif_ok, $nom['exclure_taxref']);
171 jpm 427
					}
20 jpm 428
				}
429
			}
430
		}
171 jpm 431
		unset($this->noms_ok);
176 jpm 432
		return $noms_erreur;
20 jpm 433
	}
434
 
171 jpm 435
	private function remonterClassif(&$nom) {
436
		$this->detection_boucle_infini[$nom['num_nom']] = true;
437
		if (preg_match('/^[0-9]*$/', $nom['num_tax_sup'])) {
438
			if (isset($this->noms_ok[$nom['num_tax_sup']])) {
439
				$this->noms_ok[$nom['num_nom']] = true;
440
				return true;
441
			} else if (!isset($this->noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] == '0') {
442
				$this->noms_ok[$nom['num_nom']] = true;
443
				return true;
444
			} else if (!isset($this->noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] != '0') {
175 jpm 445
				return 'Hiérarchie avec le taxon #'.$nom['num_nom'].' ayant un taxon superieur #'.$nom['num_tax_sup'].' inexistant';
171 jpm 446
			} else if (isset($this->detection_boucle_infini[$nom['num_tax_sup']])) {
175 jpm 447
				return 'Boucle infinie pour le taxon #'.$nom['num_tax_sup'];
171 jpm 448
			} else {
449
				$retour = $this->remonterClassif($this->noms[$nom['num_tax_sup']]);
450
				if ($retour === true) {
451
					$this->noms_ok[$nom['num_tax_sup']] = true;
452
				}
453
				return $retour;
454
			}
455
		} else {
175 jpm 456
			return 'Valeur num_tax_sup incorrecte : '.$nom['num_tax_sup'];
171 jpm 457
		}
458
	}
459
 
460
	/**
461
	 * Test #13
462
	 */
463
	private function testerRang() {
464
		$rangs = array_flip(explode(',', $this->manuel['rangs']));
465
 
20 jpm 466
		// Réalisation du test
467
		$noms_erreur = array();
64 jpm 468
		foreach ($this->noms as &$nom) {
171 jpm 469
			if (!isset($rangs[$nom['rang']])) {
183 jpm 470
				$noms_erreur[] = array($nom['num_nom'], $nom['rang'], $nom['exclure_taxref']);
20 jpm 471
			}
472
		}
176 jpm 473
		return $noms_erreur;
20 jpm 474
	}
475
 
171 jpm 476
	/**
477
	 * Test #14
478
	 */
479
	private function testerNomCompletSupraGenerique() {
20 jpm 480
		$noms_erreur = array();
64 jpm 481
		foreach ($this->noms as &$nom) {
171 jpm 482
			if ($nom['rang'] < $this->manuel['rang_genre']) {
483
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
484
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['nom_supra_generique']);
485
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
486
				if ($nom['nom_sci'] != $nom_sci_ideal) {
487
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
183 jpm 488
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal, $nom['exclure_taxref']);
20 jpm 489
				}
490
			}
491
		}
176 jpm 492
		return $noms_erreur;
20 jpm 493
	}
494
 
171 jpm 495
	/**
496
	 * Test #15
497
	 */
498
	private function testerNomCompletGenre() {
20 jpm 499
		$noms_erreur = array();
171 jpm 500
		foreach ($this->noms as &$nom) {
501
			if ($nom['rang'] == $this->manuel['rang_genre']) {
502
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
503
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
504
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
505
				if ($nom['nom_sci'] != $nom_sci_ideal) {
506
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
183 jpm 507
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal, $nom['exclure_taxref']);
20 jpm 508
				}
509
			}
510
		}
176 jpm 511
		return $noms_erreur;
20 jpm 512
	}
513
 
171 jpm 514
	/**
515
	 * Test #16
516
	 */
517
	private function testerNomCompletInfraGenre() {
20 jpm 518
		$noms_erreur = array();
64 jpm 519
		foreach ($this->noms as &$nom) {
171 jpm 520
			if ($nom['rang'] > $this->manuel['rang_genre'] && $nom['rang'] < $this->manuel['rang_sp']) {
521
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
522
				$nom_sci_ideal = '';
523
				if ($nom['type_epithete'] == 'agg.') {
524
					$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
525
					$nom_sci_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
526
					$nom_sci_ideal .= ' '.$nom['type_epithete'];
527
				} else {
528
					$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
529
					$nom_sci_ideal .= ' '.$nom['type_epithete'];
530
					$nom_sci_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
20 jpm 531
				}
171 jpm 532
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
533
				if ($nom['nom_sci'] != $nom_sci_ideal) {
534
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
183 jpm 535
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal, $nom['exclure_taxref']);
171 jpm 536
				}
20 jpm 537
			}
538
		}
176 jpm 539
		return $noms_erreur;
20 jpm 540
	}
541
 
171 jpm 542
	/**
543
	 * Test #17
544
	 */
545
	private function testerNomCompletEspece() {
20 jpm 546
		$noms_erreur = array();
64 jpm 547
		foreach ($this->noms as &$nom) {
171 jpm 548
			if ($nom['rang'] == $this->manuel['rang_sp']) {
549
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
550
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
551
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_sp']);
552
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
553
				if ($nom['nom_sci'] != $nom_sci_ideal) {
554
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
183 jpm 555
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal, $nom['exclure_taxref']);
20 jpm 556
				}
557
			}
558
		}
176 jpm 559
		return $noms_erreur;
20 jpm 560
	}
561
 
171 jpm 562
	/**
563
	 * Test #18
564
	 */
565
	private function testerNomCompletInfraSpecifique() {
158 delphine 566
		$noms_erreur = array();
567
		foreach ($this->noms as &$nom) {
171 jpm 568
			if ($nom['rang'] > $this->manuel['rang_sp']) {
569
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
570
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
571
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_sp']);
572
				$nom_sci_ideal .= ' '.strtolower($nom['type_epithete']);
573
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_infra_sp']);
574
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
575
				if ($nom['nom_sci'] != $nom_sci_ideal) {
576
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
183 jpm 577
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal, $nom['exclure_taxref']);
171 jpm 578
				}
158 delphine 579
			}
580
		}
176 jpm 581
		return $noms_erreur;
158 delphine 582
	}
583
 
171 jpm 584
	/**
585
	 * Test #19
586
	 */
587
	private function testerNomSupraGeneriqueEspaces() {
20 jpm 588
		$noms_erreur = array();
64 jpm 589
		foreach ($this->noms as &$nom) {
171 jpm 590
			if ($nom['nom_supra_generique'] != '') {
591
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s+$)/', $nom['nom_supra_generique'])) {
592
					$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
183 jpm 593
					$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite, $nom['exclure_taxref']);
20 jpm 594
				}
595
			}
596
		}
176 jpm 597
		return $noms_erreur;
20 jpm 598
	}
599
 
171 jpm 600
	/**
601
	 * Test #20
602
	 */
603
	private function testerNomSupraGeneriqueSyntaxe() {
20 jpm 604
		$noms_erreur = array();
64 jpm 605
		foreach ($this->noms as &$nom) {
171 jpm 606
			if ($nom['nom_supra_generique'] != '') {
607
				if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+$/', $nom['nom_supra_generique'])) {
608
					$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
183 jpm 609
					$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite, $nom['exclure_taxref']);
20 jpm 610
				}
611
			}
612
		}
177 jpm 613
		return $noms_erreur;
20 jpm 614
	}
615
 
171 jpm 616
	/**
617
	 * Test #21
618
	 */
619
	private function testerNomSupraGeneriqueRang() {
20 jpm 620
		$noms_erreur = array();
64 jpm 621
		foreach ($this->noms as &$nom) {
171 jpm 622
			if ($nom['nom_supra_generique'] != '') {
623
				if ($nom['rang'] >= $this->manuel['rang_genre']) {
183 jpm 624
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang'], $nom['exclure_taxref']);
20 jpm 625
				}
626
			}
627
		}
177 jpm 628
		return $noms_erreur;
20 jpm 629
	}
630
 
171 jpm 631
	/**
632
	 * Test #22
633
	 */
634
	private function testerGenreEspaces() {
20 jpm 635
		$noms_erreur = array();
64 jpm 636
		foreach ($this->noms as &$nom) {
171 jpm 637
			if ($nom['genre'] != '') {
638
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['genre'])) {
639
					$nom_traite = $this->repererEspace($nom['genre']);
183 jpm 640
					$noms_erreur[] = array($nom['num_nom'], $nom_traite, $nom['exclure_taxref']);
20 jpm 641
				}
642
			}
643
		}
177 jpm 644
		return $noms_erreur;
20 jpm 645
	}
646
 
171 jpm 647
	/**
648
	 * Test #23
649
	 */
650
	private function testerGenreSyntaxe() {
20 jpm 651
		$noms_erreur = array();
64 jpm 652
		foreach ($this->noms as &$nom) {
171 jpm 653
			if ($nom['genre'] != '') {
654
				$mots = explode(' ', $nom['genre']);
655
				foreach ($mots as $mot) {
656
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteGenre($mot))) {
657
						$nom_traite = $this->repererEspace($nom['genre']);
183 jpm 658
						$noms_erreur[] = array($nom['num_nom'], $nom_traite, $nom['exclure_taxref']);
171 jpm 659
					}
20 jpm 660
				}
661
			}
662
		}
177 jpm 663
		return $noms_erreur;
20 jpm 664
	}
665
 
171 jpm 666
	/**
667
	 * Test #24
668
	 */
669
	private function testerGenreRang() {
20 jpm 670
		$noms_erreur = array();
64 jpm 671
		foreach ($this->noms as &$nom) {
171 jpm 672
			if ($nom['genre'] != '') {
673
				if ($nom['rang'] < $this->manuel['rang_genre']) {
183 jpm 674
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang'], $nom['exclure_taxref']);
20 jpm 675
				}
676
			}
677
		}
177 jpm 678
		return $noms_erreur;
20 jpm 679
	}
680
 
171 jpm 681
	/**
682
	 * Test #25
683
	 */
684
	private function testerEpitheteInfraGeneriqueSyntaxe() {
20 jpm 685
		$noms_erreur = array();
64 jpm 686
		foreach ($this->noms as &$nom) {
171 jpm 687
			if ($nom['epithete_infra_generique'] != '') {
688
				if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+/', $nom['epithete_infra_generique'])) {
689
					$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
183 jpm 690
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']);
20 jpm 691
				}
692
			}
693
		}
177 jpm 694
		return $noms_erreur;
20 jpm 695
	}
696
 
171 jpm 697
	/**
698
	 * Test #26
699
	 */
700
	private function testerEpitheteInfraGeneriqueRang() {
20 jpm 701
		$noms_erreur = array();
64 jpm 702
		foreach ($this->noms as &$nom) {
171 jpm 703
			if ($nom['epithete_infra_generique'] != '') {
704
				if ($nom['rang'] <= $this->manuel['rang_genre'] || $nom['rang'] >= $this->manuel['rang_sp']) {
183 jpm 705
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang'], $nom['exclure_taxref']);
20 jpm 706
				}
707
			}
708
		}
177 jpm 709
		return $noms_erreur;
20 jpm 710
	}
711
 
171 jpm 712
	/**
713
	 * Test #27
714
	 */
715
	private function testerEpitheteInfraGeneriqueEspaces() {
20 jpm 716
		$noms_erreur = array();
64 jpm 717
		foreach ($this->noms as &$nom) {
171 jpm 718
			if ($nom['epithete_infra_generique'] != '') {
719
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_generique'])) {
720
					$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
183 jpm 721
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']);
20 jpm 722
				}
723
			}
724
		}
177 jpm 725
		return $noms_erreur;
20 jpm 726
	}
727
 
171 jpm 728
	/**
729
	 * Test #28
730
	 */
731
	private function testerEpitheteSpEspaces() {
20 jpm 732
		$noms_erreur = array();
64 jpm 733
		foreach ($this->noms as &$nom) {
171 jpm 734
			if ($nom['epithete_sp'] != '') {
735
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_sp'])) {
736
					$epithete_traite = $this->repererEspace($nom['epithete_sp']);
183 jpm 737
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']);
20 jpm 738
				}
739
			}
740
		}
177 jpm 741
		return $noms_erreur;
20 jpm 742
	}
743
 
171 jpm 744
	/**
745
	 * Test #29
746
	 */
747
	private function testerEpitheteSpSyntaxe() {
20 jpm 748
		$noms_erreur = array();
64 jpm 749
		foreach ($this->noms as &$nom) {
171 jpm 750
			if ($nom['epithete_sp'] != '') {
751
				$mots = explode(' ', $nom['epithete_sp']);
752
				foreach ($mots as $mot) {
753
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteSp($mot))) {
754
						$epithete_traite = $this->repererEspace($nom['epithete_sp']);
183 jpm 755
						$noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']);
171 jpm 756
					}
757
				}
20 jpm 758
			}
759
		}
177 jpm 760
		return $noms_erreur;
20 jpm 761
	}
762
 
171 jpm 763
	/**
764
	 * Test #30
765
	 */
766
	private function testerEpitheteSpRang() {
20 jpm 767
		$noms_erreur = array();
64 jpm 768
		foreach ($this->noms as &$nom) {
171 jpm 769
			if ($nom['epithete_sp'] != '') {
770
				if ($nom['rang'] < $this->manuel['rang_sp']) {
183 jpm 771
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang'], $nom['exclure_taxref']);
20 jpm 772
				}
773
			}
774
		}
177 jpm 775
		return $noms_erreur;
20 jpm 776
	}
777
 
171 jpm 778
	/**
779
	 * Test #31
780
	 */
781
	private function testerTypeEpitheteEspaces() {
20 jpm 782
		$noms_erreur = array();
64 jpm 783
		foreach ($this->noms as &$nom) {
171 jpm 784
			if ($nom['type_epithete'] != '') {
785
				if (preg_match('/\s+/', $nom['type_epithete'])) {
786
					$valeur_traitee = $this->repererEspace($nom['epithete_sp']);
183 jpm 787
					$noms_erreur[] = array($nom['num_nom'], $valeur_traitee, $nom['exclure_taxref']);
20 jpm 788
				}
789
			}
790
		}
177 jpm 791
		return $noms_erreur;
20 jpm 792
	}
793
 
171 jpm 794
	/**
795
	 * Test #32
796
	 */
797
	private function testerTypeEpitheteSyntaxe() {
20 jpm 798
		$noms_erreur = array();
64 jpm 799
		foreach ($this->noms as &$nom) {
171 jpm 800
			if ($nom['type_epithete'] != '') {
801
				if (!$this->verifierTypeEpithete($nom['type_epithete'])) {
183 jpm 802
					$noms_erreur[] = array($nom['num_nom'],  $nom['type_epithete'], $nom['exclure_taxref']);
20 jpm 803
				}
804
			}
805
		}
177 jpm 806
		return $noms_erreur;
20 jpm 807
	}
808
 
171 jpm 809
	/**
810
	 * Test #33
811
	 */
812
	private function testerTypeEpitheteHybridite() {
20 jpm 813
		$noms_erreur = array();
64 jpm 814
		foreach ($this->noms as &$nom) {
171 jpm 815
			if ($nom['type_epithete'] != '') {
816
				if (preg_match('/^(?:n-|notho-)/', $nom['type_epithete'])) {
183 jpm 817
					$noms_erreur[] = array($nom['num_nom'], $nom['type_epithete'], $nom['exclure_taxref']);
20 jpm 818
				}
819
			}
820
		}
177 jpm 821
		return $noms_erreur;
20 jpm 822
	}
823
 
171 jpm 824
	/**
825
	 * Test #34
826
	 */
64 jpm 827
	private function testerEpitheteInfraSpEspaces() {
20 jpm 828
		$noms_erreur = array();
64 jpm 829
		foreach ($this->noms as &$nom) {
20 jpm 830
			if ($nom['epithete_infra_sp'] != '') {
831
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_sp'])) {
832
					$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
183 jpm 833
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']);
20 jpm 834
				}
835
			}
836
		}
177 jpm 837
		return $noms_erreur;
20 jpm 838
	}
839
 
171 jpm 840
	/**
841
	 * Test #35
842
	 */
64 jpm 843
	private function testerEpitheteInfraSpSyntaxe() {
20 jpm 844
		$noms_erreur = array();
64 jpm 845
		foreach ($this->noms as &$nom) {
20 jpm 846
			if ($nom['epithete_infra_sp'] != '') {
847
				$mots = explode(' ', $nom['epithete_infra_sp']);
848
				foreach ($mots as $mot) {
849
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierTypeEpithete($mot)|| $this->verifierEpitheteSp($mot))) {
850
						$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
183 jpm 851
						$noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']);
20 jpm 852
					}
853
				}
854
			}
855
		}
177 jpm 856
		return $noms_erreur;
20 jpm 857
	}
858
 
171 jpm 859
	/**
860
	 * Test #36
861
	 */
64 jpm 862
	private function testerEpitheteInfraSpRang() {
20 jpm 863
		$noms_erreur = array();
64 jpm 864
		foreach ($this->noms as &$nom) {
20 jpm 865
			if ($nom['epithete_infra_sp'] != '') {
866
				if ($nom['rang'] < $this->manuel['rang_sp']) {
183 jpm 867
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang'], $nom['exclure_taxref']);
20 jpm 868
				}
869
			}
870
		}
177 jpm 871
		return $noms_erreur;
20 jpm 872
	}
873
 
173 jpm 874
	/**
875
	 * Test #37
876
	 */
877
	private function testerGroupeCultivarSyntaxe() {
20 jpm 878
		$noms_erreur = array();
64 jpm 879
		foreach ($this->noms as &$nom) {
173 jpm 880
			if ($nom['cultivar_groupe'] != '') {
881
				if (!$this->verifierEpitheteGroupeCultivar($nom['cultivar_groupe'])) {
882
					$epithete_traite = $this->repererEspace($nom['cultivar_groupe']);
183 jpm 883
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']);
20 jpm 884
				}
885
			}
886
		}
177 jpm 887
		return $noms_erreur;
20 jpm 888
	}
889
 
173 jpm 890
	/**
891
	 * Test #38
892
	 */
893
	private function testerGroupeCultivarRang() {
20 jpm 894
		$noms_erreur = array();
64 jpm 895
		foreach ($this->noms as &$nom) {
173 jpm 896
			if ($nom['cultivar_groupe'] != '') {
897
				if ($nom['rang'] < $this->manuel['rang_genre']) {
183 jpm 898
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang'], $nom['exclure_taxref']);
20 jpm 899
				}
900
			}
901
		}
177 jpm 902
		return $noms_erreur;
20 jpm 903
	}
904
 
173 jpm 905
	/**
906
	 * Test #39
907
	 */
908
	private function testerCultivarSyntaxe() {
20 jpm 909
		$noms_erreur = array();
64 jpm 910
		foreach ($this->noms as &$nom) {
173 jpm 911
			if ($nom['cultivar'] != '') {
912
				if (!$this->verifierEpitheteCultivar($nom['cultivar'])) {
913
					$epithete_traite = $this->repererEspace($nom['cultivar']);
183 jpm 914
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']);
20 jpm 915
				}
916
			}
917
		}
177 jpm 918
		return $noms_erreur;
20 jpm 919
	}
920
 
173 jpm 921
	/**
922
	 * Test #40
923
	 */
924
	private function testerCultivarRang() {
20 jpm 925
		$noms_erreur = array();
64 jpm 926
		foreach ($this->noms as &$nom) {
173 jpm 927
			if ($nom['cultivar'] != '') {
928
				if ($nom['rang'] < $this->manuel['rang_genre']) {
183 jpm 929
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang'], $nom['exclure_taxref']);
171 jpm 930
				}
20 jpm 931
			}
932
		}
177 jpm 933
		return $noms_erreur;
20 jpm 934
	}
935
 
173 jpm 936
	/**
937
	 * Test #41
938
	 */
939
	private function testerNomCommercialSyntaxe() {
20 jpm 940
		$noms_erreur = array();
64 jpm 941
		foreach ($this->noms as &$nom) {
173 jpm 942
			if ($nom['nom_commercial'] != '') {
943
				if (!$this->verifierNomCommercial($nom['nom_commercial'])) {
944
					$epithete_traite = $this->repererEspace($nom['nom_commercial']);
183 jpm 945
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']);
171 jpm 946
				}
20 jpm 947
			}
948
		}
177 jpm 949
		return $noms_erreur;
20 jpm 950
	}
951
 
173 jpm 952
	/**
953
	 * Test #42
954
	 */
955
	private function testerNomCommercialPresenceCultivar() {
20 jpm 956
		$noms_erreur = array();
64 jpm 957
		foreach ($this->noms as &$nom) {
173 jpm 958
			if ((isset($nom['nom_commercial']) && $nom['nom_commercial'] != '') && ($nom['cultivar'] == '' && $nom['cultivar_groupe'] == '')) {
183 jpm 959
				$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['exclure_taxref']);
20 jpm 960
			}
961
		}
177 jpm 962
		return $noms_erreur;
20 jpm 963
	}
964
 
173 jpm 965
	/**
966
	 * Test #43
967
	 */
968
	private function testerAuteurSyntaxe() {
20 jpm 969
		$noms_erreur = array();
64 jpm 970
		foreach ($this->noms as &$nom) {
173 jpm 971
			if ($nom['auteur'] != '') {
972
				if (!$this->verifierAuteur($nom['auteur'])) {
973
					$intitule_traite = $this->repererEspace($nom['auteur']);
183 jpm 974
					$noms_erreur[] = array($nom['num_nom'], $intitule_traite, $nom['exclure_taxref']);
171 jpm 975
				}
20 jpm 976
			}
977
		}
177 jpm 978
		return $noms_erreur;
20 jpm 979
	}
980
 
173 jpm 981
	/**
982
	 * Test #44
983
	 */
984
	private function testerAnneeSyntaxe() {
20 jpm 985
		$noms_erreur = array();
64 jpm 986
		foreach ($this->noms as &$nom) {
173 jpm 987
			if ($nom['annee'] != '') {
988
				if (!$this->verifierAnnee($nom['annee'])) {
183 jpm 989
					$noms_erreur[] = array($nom['num_nom'], $nom['annee'], $nom['exclure_taxref']);
171 jpm 990
				}
20 jpm 991
			}
992
		}
177 jpm 993
		return $noms_erreur;
20 jpm 994
	}
995
 
173 jpm 996
	/**
997
	 * Test #45
998
	 */
999
	private function testerBiblioOrigineSyntaxe() {
20 jpm 1000
		$noms_erreur = array();
64 jpm 1001
		foreach ($this->noms as &$nom) {
173 jpm 1002
			if ($nom['biblio_origine'] != '') {
1003
				if (!$this->verifierBiblioOrigine($nom['biblio_origine'])) {
1004
					$biblio_traite = $this->repererEspace($nom['biblio_origine']);
183 jpm 1005
					$noms_erreur[] = array($nom['num_nom'], $biblio_traite, $nom['exclure_taxref']);
20 jpm 1006
				}
1007
			}
1008
		}
177 jpm 1009
		return $noms_erreur;
20 jpm 1010
	}
1011
 
173 jpm 1012
	/**
1013
	 * Test #46
1014
	 */
1015
	private function testerHomonymieSyntaxe() {
20 jpm 1016
		$noms_erreur = array();
173 jpm 1017
		foreach ($this->noms as &$nom) {
1018
			if ($nom['homonyme'] != '') {
1019
				if (!$this->verifierBooleen($nom['homonyme'])) {
183 jpm 1020
					$noms_erreur[] = array($nom['num_nom'], $nom['homonyme'], $nom['exclure_taxref']);
161 jpm 1021
				}
20 jpm 1022
			}
1023
		}
177 jpm 1024
		return $noms_erreur;
20 jpm 1025
	}
1026
 
173 jpm 1027
	/**
1028
	 * Test #47
1029
	 */
1030
	private function testerHomonymieExistence() {
1031
		$noms_homonymie = $this->classerNomsParNomComplet();
1032
 
20 jpm 1033
		$noms_erreur = array();
64 jpm 1034
		foreach ($this->noms as &$nom) {
173 jpm 1035
			if ($nom['homonyme'] != '0' && $nom['homonyme'] != '') {
1036
				if ($noms_homonymie[$nom['nom_sci']] <= 1) {
183 jpm 1037
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['exclure_taxref']);
171 jpm 1038
				}
20 jpm 1039
			}
1040
		}
173 jpm 1041
		$noms_homonymie = null;
177 jpm 1042
		return $noms_erreur;
20 jpm 1043
	}
1044
 
173 jpm 1045
	/**
1046
	 * Test #48
1047
	 */
1048
	private function testerBasionymeSyntaxe() {
20 jpm 1049
		$noms_erreur = array();
64 jpm 1050
		foreach ($this->noms as &$nom) {
173 jpm 1051
			if ($nom['basionyme'] != '') {
1052
				if (!$this->verifierNombre($nom['basionyme'])) {
183 jpm 1053
					$noms_erreur[] = array($nom['num_nom'], $nom['basionyme'], $nom['exclure_taxref']);
20 jpm 1054
				}
1055
			}
1056
		}
177 jpm 1057
		return $noms_erreur;
20 jpm 1058
	}
173 jpm 1059
 
1060
	/**
1061
	 * Test #49
1062
	 */
1063
	private function testerBasionymeExistence() {
20 jpm 1064
		$noms_erreur = array();
64 jpm 1065
		foreach ($this->noms as &$nom) {
173 jpm 1066
			if ($nom['basionyme'] != '') {
1067
				if (!isset($this->noms[$nom['basionyme']])) {
183 jpm 1068
					$noms_erreur[] = array($nom['num_nom'], $nom['basionyme'], $nom['exclure_taxref']);
173 jpm 1069
				}
20 jpm 1070
			}
1071
		}
177 jpm 1072
		return $noms_erreur;
20 jpm 1073
	}
1074
 
173 jpm 1075
	/**
1076
	 * Test #50
1077
	 */
1078
	private function testerSynonymeProparteSyntaxe() {
20 jpm 1079
		$noms_erreur = array();
64 jpm 1080
		foreach ($this->noms as &$nom) {
171 jpm 1081
			if ($nom['synonyme_proparte'] != '') {
173 jpm 1082
				if (!$this->verifierNombreSuite($nom['synonyme_proparte'])) {
183 jpm 1083
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_proparte'], $nom['exclure_taxref']);
20 jpm 1084
				}
1085
			}
1086
		}
177 jpm 1087
		return $noms_erreur;
20 jpm 1088
	}
1089
 
173 jpm 1090
	/**
1091
	 * Test #51
1092
	 */
1093
	private function testerSynonymeProparteExistence() {
20 jpm 1094
		$noms_erreur = array();
64 jpm 1095
		foreach ($this->noms as &$nom) {
171 jpm 1096
			if ($nom['synonyme_proparte'] != '') {
173 jpm 1097
				$num_nom_a_verifier = explode(',', $nom['synonyme_proparte']);
1098
				$num_nom_en_erreur = array();
1099
				foreach ($num_nom_a_verifier as $num_nom) {
1100
					if (!isset($this->noms[$num_nom])) {
1101
						$num_nom_en_erreur[] = $num_nom;
1102
					}
20 jpm 1103
				}
173 jpm 1104
				if (count($nbre_en_erreur) > 0) {
183 jpm 1105
					$noms_erreur[] = array($nom['num_nom'], implode(',', $num_nom_en_erreur), $nom['exclure_taxref']);
173 jpm 1106
				}
20 jpm 1107
			}
1108
		}
177 jpm 1109
		return $noms_erreur;
20 jpm 1110
	}
1111
 
173 jpm 1112
	/**
1113
	 * Test #52
1114
	 */
1115
	private function testerSynonymeDouteuxSyntaxe() {
20 jpm 1116
		$noms_erreur = array();
64 jpm 1117
		foreach ($this->noms as &$nom) {
173 jpm 1118
			if ($nom['synonyme_douteux'] != '') {
1119
				if (!$this->verifierBooleen($nom['synonyme_douteux'])) {
183 jpm 1120
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_douteux'], $nom['exclure_taxref']);
20 jpm 1121
				}
1122
			}
1123
		}
177 jpm 1124
		return $noms_erreur;
20 jpm 1125
	}
1126
 
173 jpm 1127
	/**
1128
	 * Test #53
1129
	 */
1130
	private function testerSynonymeDouteuxNumNomRetenu() {
20 jpm 1131
		$noms_erreur = array();
64 jpm 1132
		foreach ($this->noms as &$nom) {
186 delphine 1133
			if ($nom['synonyme_douteux'] == 1 && !$this->verifierNombre($nom['num_nom_retenu'])) {
1134
				$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_douteux'], $nom['exclure_taxref']);
20 jpm 1135
			}
1136
		}
177 jpm 1137
		return $noms_erreur;
20 jpm 1138
	}
1139
 
171 jpm 1140
	/**
173 jpm 1141
	 * Test #54
171 jpm 1142
	 */
173 jpm 1143
	private function testerSynonymeMalAppliqueSyntaxe() {
20 jpm 1144
		$noms_erreur = array();
64 jpm 1145
		foreach ($this->noms as &$nom) {
173 jpm 1146
			if ($nom['synonyme_mal_applique'] != '') {
1147
				if (!$this->verifierBooleen($nom['synonyme_mal_applique'])) {
183 jpm 1148
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_mal_applique'], $nom['exclure_taxref']);
20 jpm 1149
				}
1150
			}
1151
		}
177 jpm 1152
		return $noms_erreur;
20 jpm 1153
	}
1154
 
171 jpm 1155
	/**
173 jpm 1156
	 * Test #55
171 jpm 1157
	 */
173 jpm 1158
	private function testerSynonymeOrthographiqueSyntaxe() {
20 jpm 1159
		$noms_erreur = array();
173 jpm 1160
		foreach ($this->noms as $nom) {
1161
			if ($nom['synonyme_orthographique'] != '') {
1162
				if (!$this->verifierNombre($nom['synonyme_orthographique'])) {
183 jpm 1163
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_orthographique'], $nom['exclure_taxref']);
20 jpm 1164
				}
1165
			}
1166
		}
177 jpm 1167
		return $noms_erreur;
20 jpm 1168
	}
1169
 
171 jpm 1170
	/**
173 jpm 1171
	 * Test #56
171 jpm 1172
	 */
173 jpm 1173
	private function testerSynonymeOrthographiqueExistence() {
20 jpm 1174
		$noms_erreur = array();
64 jpm 1175
		foreach ($this->noms as &$nom) {
173 jpm 1176
			if ($nom['synonyme_orthographique'] != '') {
1177
				if (!isset($this->noms[$nom['synonyme_orthographique']])) {
183 jpm 1178
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_orthographique'], $nom['exclure_taxref']);
20 jpm 1179
				}
1180
			}
1181
		}
177 jpm 1182
		return $noms_erreur;
20 jpm 1183
	}
1184
 
171 jpm 1185
	/**
173 jpm 1186
	 * Test #57
171 jpm 1187
	 */
173 jpm 1188
	private function testerHybrideParent01Syntaxe() {
20 jpm 1189
		$noms_erreur = array();
64 jpm 1190
		foreach ($this->noms as &$nom) {
173 jpm 1191
			if ($nom['hybride_parent_01'] != '') {
1192
				if (!$this->verifierNombre($nom['hybride_parent_01'])) {
183 jpm 1193
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_01']), $nom['exclure_taxref']);
20 jpm 1194
				}
1195
			}
1196
		}
177 jpm 1197
		return $noms_erreur;
20 jpm 1198
	}
1199
 
171 jpm 1200
	/**
173 jpm 1201
	 * Test #58
171 jpm 1202
	 */
173 jpm 1203
	private function testerHybrideParent01Existence() {
20 jpm 1204
		$noms_erreur = array();
64 jpm 1205
		foreach ($this->noms as &$nom) {
173 jpm 1206
			if ($nom['hybride_parent_01'] != '' && $nom['hybride_parent_01'] != '0') {
1207
				if (!isset($this->noms[$nom['hybride_parent_01']])) {
183 jpm 1208
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_01']), $nom['exclure_taxref']);
20 jpm 1209
				}
1210
			}
1211
		}
177 jpm 1212
		return $noms_erreur;
20 jpm 1213
	}
171 jpm 1214
 
1215
	/**
173 jpm 1216
	 * Test #59
171 jpm 1217
	 */
173 jpm 1218
	private function testerHybrideParent02Syntaxe() {
20 jpm 1219
		$noms_erreur = array();
64 jpm 1220
		foreach ($this->noms as &$nom) {
173 jpm 1221
			if ($nom['hybride_parent_02'] != '') {
1222
				if (!$this->verifierNombre($nom['hybride_parent_02'])) {
183 jpm 1223
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_02']), $nom['exclure_taxref']);
173 jpm 1224
				}
20 jpm 1225
			}
1226
		}
177 jpm 1227
		return $noms_erreur;
20 jpm 1228
	}
1229
 
171 jpm 1230
	/**
173 jpm 1231
	 * Test #60
171 jpm 1232
	 */
173 jpm 1233
	private function testerHybrideParent02Existence() {
20 jpm 1234
		$noms_erreur = array();
64 jpm 1235
		foreach ($this->noms as &$nom) {
173 jpm 1236
			if ($nom['hybride_parent_02'] != '') {
1237
				if (!isset($this->noms[$nom['hybride_parent_02']]) && $nom['hybride_parent_02'] != '0') {
183 jpm 1238
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_02']), $nom['exclure_taxref']);
20 jpm 1239
				}
1240
			}
1241
		}
177 jpm 1242
		return $noms_erreur;
20 jpm 1243
	}
1244
 
171 jpm 1245
	/**
173 jpm 1246
	 * Test #61
171 jpm 1247
	 */
173 jpm 1248
	private function testerPresenceSyntaxe() {
20 jpm 1249
		$noms_erreur = array();
64 jpm 1250
		foreach ($this->noms as &$nom) {
173 jpm 1251
			if ($nom['presence'] != '') {
1252
				if (!$this->verifierPresence($nom['presence'])) {
183 jpm 1253
					$noms_erreur[] = array($nom['num_nom'], $nom['presence'], $nom['exclure_taxref']);
20 jpm 1254
				}
1255
			}
1256
		}
177 jpm 1257
		return $noms_erreur;
20 jpm 1258
	}
1259
 
171 jpm 1260
	/**
173 jpm 1261
	 * Test #62
171 jpm 1262
	 */
173 jpm 1263
	private function testerStatutOrigineSyntaxe() {
20 jpm 1264
		$noms_erreur = array();
64 jpm 1265
		foreach ($this->noms as &$nom) {
173 jpm 1266
			if ($nom['statut_origine'] != '') {
1267
				if (!$this->verifierStatutOrigine($nom['statut_origine'])) {
183 jpm 1268
					$noms_erreur[] = array($nom['num_nom'], $nom['statut_origine'], $nom['exclure_taxref']);
20 jpm 1269
				}
1270
			}
1271
		}
177 jpm 1272
		return $noms_erreur;
20 jpm 1273
	}
1274
 
171 jpm 1275
	/**
173 jpm 1276
	 * Test #63
171 jpm 1277
	 */
173 jpm 1278
	private function testerStatutIntroductionSyntaxe() {
20 jpm 1279
		$noms_erreur = array();
64 jpm 1280
		foreach ($this->noms as &$nom) {
173 jpm 1281
			if ($nom['statut_introduction'] != '') {
1282
				if (!$this->verifierStatutIntroduction($nom['statut_introduction'])) {
183 jpm 1283
					$noms_erreur[] = array($nom['num_nom'], $nom['statut_introduction'], $nom['exclure_taxref']);
20 jpm 1284
				}
1285
			}
1286
		}
177 jpm 1287
		return $noms_erreur;
20 jpm 1288
	}
1289
 
171 jpm 1290
	/**
173 jpm 1291
	 * Test #64
171 jpm 1292
	 */
173 jpm 1293
	private function testerStatutCultureSyntaxe() {
20 jpm 1294
		$noms_erreur = array();
64 jpm 1295
		foreach ($this->noms as &$nom) {
173 jpm 1296
			if ($nom['statut_culture'] != '') {
1297
				if (!$this->verifierStatutCulture($nom['statut_culture'])) {
183 jpm 1298
					$noms_erreur[] = array($nom['num_nom'], $nom['statut_culture'], $nom['exclure_taxref']);
20 jpm 1299
				}
1300
			}
1301
		}
177 jpm 1302
		return $noms_erreur;
20 jpm 1303
	}
1304
 
171 jpm 1305
	/**
1306
	 * Test #65
1307
	 */
146 delphine 1308
	private function testerExclureTaxRefSyntaxe() {
1309
		$noms_erreur = array();
1310
		foreach ($this->noms as &$nom) {
1311
			if ($nom['exclure_taxref'] != '' && $nom['exclure_taxref'] != null) {
183 jpm 1312
				if (!preg_match('/^(?:0|1|9)$/', $nom['exclure_taxref'])) {
146 delphine 1313
					$noms_erreur[] = array($nom['num_nom'], $nom['exclure_taxref']);
1314
				}
1315
			}
1316
		}
177 jpm 1317
		return $noms_erreur;
146 delphine 1318
	}
171 jpm 1319
 
1320
 
1321
 
20 jpm 1322
	//+--------------------------------------------------------------------------------------------------------------+//
1323
	// MÉTHODES COMMUNES aux TESTS
1324
 
64 jpm 1325
	private function verifierPresence(&$valeur) {
20 jpm 1326
		$codes = $this->manuel['codes_presence'];
1327
		$ok = $this->verifierStatuts($valeur, $codes);
1328
		return $ok;
1329
	}
1330
 
64 jpm 1331
	private function verifierStatutOrigine(&$valeur) {
20 jpm 1332
		$codes = $this->manuel['codes_statuts_origine'];
1333
		$ok = $this->verifierStatuts($valeur, $codes);
1334
		return $ok;
1335
	}
1336
 
64 jpm 1337
	private function verifierStatutIntroduction(&$valeur) {
20 jpm 1338
		$codes = $this->manuel['codes_statuts_introduction'];
1339
		$ok = $this->verifierStatuts($valeur, $codes);
1340
		return $ok;
1341
	}
1342
 
64 jpm 1343
	private function verifierStatutCulture(&$valeur) {
20 jpm 1344
		$codes = $this->manuel['codes_statuts_culture'];
1345
		$ok = $this->verifierStatuts($valeur, $codes);
1346
		return $ok;
1347
	}
1348
 
64 jpm 1349
	private function verifierStatuts(&$valeur, &$codes) {
20 jpm 1350
		$ok = true;
1351
		if (!preg_match("/^(?:|-|[$codes](?:-[A-Z])?)$/", $valeur)) {
1352
			$ok = false;
1353
		}
1354
		return $ok;
1355
	}
1356
 
64 jpm 1357
	private function verifierBooleen(&$valeur) {
20 jpm 1358
		$ok = true;
1359
		if (!preg_match('/^1$/', $valeur)) {
1360
			$ok = false;
1361
		}
1362
		return $ok;
1363
	}
1364
 
64 jpm 1365
	private function verifierNombre(&$valeur) {
20 jpm 1366
		$ok = true;
1367
		if (!preg_match('/^[0-9]+$/', $valeur)) {
1368
			$ok = false;
1369
		}
1370
		return $ok;
1371
	}
1372
 
64 jpm 1373
	private function verifierNombreSuite(&$valeur) {
20 jpm 1374
		$ok = true;
1375
		if (!preg_match('/^(?:[0-9]+,)*[0-9]+$/', $valeur)) {
1376
			$ok = false;
1377
		}
1378
		return $ok;
1379
	}
1380
 
64 jpm 1381
	private function verifierTypeEpithete(&$type) {
20 jpm 1382
		$ok = false;
1383
		$rejetes = $this->manuel['type_epithete_rejetes'];
1384
		if (preg_replace("/^(?:$rejetes)$/", '', $type) == '') {
1385
			$ok = false;
1386
		} else if (preg_match('/^[a-z][-a-z]*[.]?$/', $type)) {
1387
			$ok = true;
1388
		}
1389
		return $ok;
1390
	}
1391
 
64 jpm 1392
	private function verifierBiblioOrigine(&$intitule) {
20 jpm 1393
		$ok = true;
1394
		if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $intitule)) {
1395
			$ok = false;// Contient des espaces en trop
1396
		} else if (!preg_match('/^(?:in [^;]+[;]|)[^,]+?(?:[,][^:]+|)(?:[:].+|)$/', $intitule)) {
1397
			$ok = false;
1398
		} else if (preg_match('/(?:(?:^|[,:])\s*(?:[:,]|$))/', $intitule)) {
1399
			$ok = false;// Contient une mauvaise suite de caractères
1400
		}
1401
		return $ok;
1402
	}
1403
 
64 jpm 1404
	private function verifierAnnee(&$annee) {
20 jpm 1405
		$ok = true;
1406
		if (!preg_match('/^[0-9]{4}$/', $annee)) {
1407
			$ok = false;
188 delphine 1408
		} else if ($annee < ANNEE_MINIMUM) {
20 jpm 1409
			$ok = false;
188 delphine 1410
		} else if ($annee > ANNEE_EN_COURS) {
186 delphine 1411
			$ok = false;
20 jpm 1412
		}
1413
		return $ok;
1414
	}
1415
 
64 jpm 1416
	private function verifierAuteur(&$intitule) {
20 jpm 1417
		$ok = true;
1418
		$acceptes = $this->manuel['auteur_acceptes'];
1419
		if (!preg_match("/^(?:$acceptes)$/", $intitule)) {
1420
			if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $intitule)) {
1421
				$ok = false;// Contient des espaces en trop
1422
			} else {
1423
				$mots_rejetes = $this->manuel['auteur_mots_rejetes'];
1424
				$mots = explode(' ', $intitule);
1425
				foreach ($mots as $position => $mot) {
1426
					if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
1427
						$ok = false;// Mot rejeté
184 jpm 1428
					} else if (preg_match("/^(?:(?:\p{L}|[.'\(\),-])+|[&])$/u", $mot)) {
20 jpm 1429
						continue;// Mot de l'intitulé auteur
1430
					} else {
1431
						$ok = false;
1432
					}
1433
				}
1434
			}
1435
		}
1436
		return $ok;
1437
	}
1438
 
64 jpm 1439
	private function verifierNomCommercial(&$epithete) {
20 jpm 1440
		$ok = false;
1441
		if (preg_match("/^[[:upper:][:punct:][:digit:][:space:]]+$/", $epithete)) {
1442
			$ok = true;
1443
		}
1444
		return $ok;
1445
	}
1446
 
64 jpm 1447
	private function verifierEpitheteCultivar(&$epithete) {
20 jpm 1448
		$ok = true;
1449
		$acceptes = $this->manuel['cultivar_acceptes'];
1450
		if (!preg_match("/^(?:$acceptes)$/", $epithete)) {
1451
			if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $epithete)) {
1452
				$ok = false;// Contient des espaces en trop
1453
			} else {
1454
				$mots_rejetes = $this->manuel['cultivar_mots_rejetes'];
1455
				$mots_mineurs = $this->manuel['mots_mineurs'];
1456
				$mots = explode(' ', $epithete);
1457
				foreach ($mots as $position => $mot) {
1458
					if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
1459
						$ok = false;// Mot rejeté
1460
					} else if ($position > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot)) {
1461
						continue;// Mot mineur en minuscule qui n'est pas en 1ère position
1462
					} else {
1463
						$mots_tiret = explode('-', $mot);
1464
						foreach ($mots_tiret as $position_tiret => $mot_tiret) {
1465
							if ($position_tiret > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot_tiret)) {
1466
								continue;// Mot-tiret mineur en minuscule qui n'est pas en 1ère position
1467
							} else if (preg_match('/^[[:upper:]][[:lower:]]+$/', $mot_tiret)) {
1468
								continue;//Mot (ou 'mot-tiret') avec lettre initiale majuscule
1469
							} else if ($position_tiret == count($mots_tiret) && preg_match('/^[:upper:][:lower:]+[:punct:]?$/', $mot_tiret)) {
1470
								continue;//Dernier mot (ou 'mot-tiret') avec lettre initiale majuscule, suivi d'un éventuel signe de ponctuation
1471
							} else {
1472
								$ok = false;
1473
							}
1474
						}
1475
					}
1476
				}
1477
			}
1478
		}
1479
		return $ok;
1480
	}
1481
 
64 jpm 1482
	private function verifierEpitheteGroupeCultivar(&$epithete) {
20 jpm 1483
		$ok = true;
1484
		$acceptes = $this->manuel['cultivar_gp_acceptes'];
1485
		if (!preg_match("/^(?:$acceptes)$/", $epithete)) {
1486
			if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $epithete)) {
1487
				$ok = false;// Contient des espaces en trop
1488
			} else {
1489
				$mots_acceptes = $this->manuel['cultivar_gp_mots_acceptes'];
1490
				$mots_rejetes = $this->manuel['cultivar_gp_mots_rejetes'];
1491
				$mots_mineurs = $this->manuel['mots_mineurs'];
1492
				$mots = explode(' ', $epithete);
1493
				foreach ($mots as $position => $mot) {
1494
					if (preg_match("/^(?:$mots_acceptes)$/i", $mot)) {
1495
						continue;// Mot accepté
1496
					} else if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
1497
						$ok = false;// Mot rejeté
1498
					} else if ($position > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot)) {
1499
						continue;// Mot mineur en minuscule qui n'est pas en 1ère position
1500
					} else {
1501
						$mots_tiret = explode('-', $mot);
1502
						foreach ($mots_tiret as $position_tiret => $mot_tiret) {
1503
							if ($position_tiret > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot_tiret)) {
1504
								continue;// Mot-tiret mineur en minuscule qui n'est pas en 1ère position dans le mot
1505
							} else if (preg_match('/^[[:upper:]][[:lower:]]+$/', $mot_tiret)) {
1506
								continue;// Mot (ou 'mot-tiret') avec lettre initiale majuscule
1507
							} else if ($position_tiret == count($mots_tiret) && preg_match('/^[:upper:][:lower:]+[:punct:]?$/', $mot_tiret)) {
1508
								continue;// Dernier mot (ou 'mot-tiret') avec lettre initiale majuscule, suivi d'un éventuel signe de ponctuation
1509
							} else {
1510
								$ok = false;
1511
							}
1512
						}
1513
					}
1514
				}
1515
			}
1516
		}
1517
		return $ok;
1518
	}
1519
 
64 jpm 1520
	private function verifierEpitheteSp(&$epithete) {
20 jpm 1521
		$ok = false;
183 jpm 1522
		if (preg_match('/^[a-zäëḧïöẗüẅẍÿ][-a-zäëḧïöẗüẅẍÿ]+$/', $epithete)) {
20 jpm 1523
			$ok = true;
1524
		} else if (preg_match('/^sp\.(?:[A-Z]|[1-9][0-9]*)$/', $epithete)) {
1525
			$ok = true;
1526
		}
1527
		return $ok;
1528
	}
1529
 
64 jpm 1530
	private function verifierEpitheteGenre(&$epithete) {
20 jpm 1531
		$ok = false;
183 jpm 1532
		if (preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ](?:[-a-zäëḧïöẗüẅẍÿ]+|[a-zäëḧïöẗüẅẍÿ]+-[A-ZÄËḦÏÖÜẄẌŸ][a-zäëḧïöẗüẅẍÿ]+)$/', $epithete)) {
20 jpm 1533
			$ok = true;
1534
		}
1535
		return $ok;
1536
	}
1537
 
64 jpm 1538
	private function formaterStyleNomGenre(&$genre) {
20 jpm 1539
		$genre_fmt = '';
1540
		if (preg_match('/^\s*([x+])\s+(.+)$/i', $genre, $match)) {
1541
			$genre_fmt = strtolower($match[1]).' '.ucfirst(strtolower($match[2]));
1542
		} else {
1543
			$genre_fmt = ucfirst(strtolower($genre));
1544
		}
1545
		return $genre_fmt;
1546
	}
1547
 
149 jpm 1548
	private function repererEspace($nom_sci) {
1549
		$nom_sci = str_replace(' ', '<span class="espace">&nbsp;</span>', $nom_sci);
1550
		return $nom_sci;
20 jpm 1551
	}
1552
 
64 jpm 1553
	private function construireSuffixeNomPltCultivee(&$nom) {
20 jpm 1554
		$suffixe = array();
1555
		$suffixe[] = $this->construireNomCultivarGroupe($nom);
1556
		$suffixe[] = $this->construireNomCommercial($nom);
1557
		$suffixe[] = $this->construireNomCultivar($nom);
1558
		$suffixe = array_filter($suffixe);
1559
		return implode(' ', $suffixe);
1560
	}
1561
 
64 jpm 1562
	private function construireNomCultivarGroupe(&$nom) {
20 jpm 1563
		$nom_groupe_cultivar = '';
1564
		if ($nom['cultivar_groupe'] != '') {
1565
			if (preg_match('/ gx$/', $nom['cultivar_groupe'])) {
1566
				$nom_groupe_cultivar =  '('.$nom['cultivar_groupe'].')';
1567
			} else {
1568
				$nom_groupe_cultivar =  '('.$nom['cultivar_groupe'].' Gp)';
1569
			}
1570
		}
1571
		return $nom_groupe_cultivar;
1572
	}
1573
 
64 jpm 1574
	private function construireNomCommercial(&$nom) {
20 jpm 1575
		$nom_commercial = '';
1576
		if ($nom['nom_commercial'] != '') {
1577
			$nom_commercial =  strtoupper($nom['nom_commercial']);
1578
		}
1579
		return $nom_commercial;
1580
	}
1581
 
64 jpm 1582
	private function construireNomCultivar(&$nom) {
20 jpm 1583
		$nom_cultivar = '';
1584
		if ($nom['cultivar'] != '') {
1585
			$nom_cultivar =  "'".$nom['cultivar']."'";
1586
		}
1587
		return $nom_cultivar;
1588
	}
1589
 
64 jpm 1590
	private function classerNomsParNomComplet() {
20 jpm 1591
		$noms_classes = array();
64 jpm 1592
		foreach ($this->noms as &$nom) {
149 jpm 1593
			if (!isset($noms_classes[$nom['nom_sci']])) {
1594
				$noms_classes[$nom['nom_sci']] = 1;
20 jpm 1595
			} else {
149 jpm 1596
				$noms_classes[$nom['nom_sci']]++;
20 jpm 1597
			}
1598
		}
1599
		return $noms_classes;
1600
	}
1601
}
1602
?>