Subversion Repositories Applications.referentiel

Rev

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