Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 436 | Rev 459 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 436 Rev 437
Line 23... Line 23...
23
	private $infosCorrespondanceBase = array(
23
	private $infosCorrespondanceBase = array(
24
		'nom_sci' => '',
24
		'nom_sci' => '',
25
		'auteur' => '',
25
		'auteur' => '',
26
		'nom_addendum' => '',
26
		'nom_addendum' => '',
27
		'annee' => '',
27
		'annee' => '',
28
		'biblio_coste' => '',
28
		'biblio_origine' => '',
29
		'rang' => 290,
29
		'rang' => 290,
30
		'nom_francais' => '',
30
		'nom_francais' => '',
31
		'nom_coste' => '',
31
		'nom_coste' => '',
32
		'auteur_coste' => '',
32
		'auteur_coste' => '',
-
 
33
		'biblio_coste' => '',
33
		'num_nom_coste' => '',
34
		'num_nom_coste' => '',
34
		'num_nom_retenu_coste' => '',
35
		'num_nom_retenu_coste' => '',
35
		'num_tax_sup_coste' => '',
36
		'num_tax_sup_coste' => '',
36
		'tome' => '',
37
		'tome' => '',
37
		'page' => '',
38
		'page' => '',
38
		'synonymie_coste' => '',
39
		'synonymie_coste' => '',
39
		'bdnff_nn' => '',
40
		'bdnff_nn' => '',
40
		'bdnff_nt' => '');
41
		'bdnff_nt' => '');
Line 41... Line 42...
41
 
42
 
-
 
43
	public function __construct(Conteneur $conteneur) {
-
 
44
		mb_internal_encoding('UTF-8');
42
	public function __construct(Conteneur $conteneur) {
45
		setlocale(LC_ALL, 'fr_FR.UTF-8');
43
		$this->conteneur = $conteneur;
46
		$this->conteneur = $conteneur;
44
		$this->outils = $conteneur->getOutils();
47
		$this->outils = $conteneur->getOutils();
45
		$this->messages = $conteneur->getMessages();
48
		$this->messages = $conteneur->getMessages();
46
		$this->dossierBase = dirname(__FILE__).'/';
49
		$this->dossierBase = dirname(__FILE__).'/';
Line 79... Line 82...
79
 
82
 
80
		$fichierTxt = $this->dossierBase.self::DOSSIER_V0.'index_general_sp.tsv';
83
		$fichierTxt = $this->dossierBase.self::DOSSIER_V0.'index_general_sp.tsv';
81
		$txtCorrespondance = $this->creerFichierCsvCorrespondance();
84
		$txtCorrespondance = $this->creerFichierCsvCorrespondance();
Line -... Line 85...
-
 
85
		file_put_contents($fichierTxt, $txtCorrespondance);
-
 
86
 
-
 
87
		ksort($this->auteurs);
-
 
88
		foreach ($this->auteurs as $auteur => $nbre) {
-
 
89
			$this->ajouterLogAuteur("$auteur\t$nbre");
82
		file_put_contents($fichierTxt, $txtCorrespondance);
90
		}
83
 
91
 
Line 84... Line 92...
84
		$this->ecrireLogs();
92
		$this->ecrireLogs();
85
	}
93
	}
Line 176... Line 184...
176
			$infos['auteur_coste'] = trim($match[2]);
184
			$infos['auteur_coste'] = trim($match[2]);
177
			$infos['nom_francais'] = isset($match[3]) ? $match[3] : '';
185
			$infos['nom_francais'] = isset($match[3]) ? $match[3] : '';
178
			$infos['nom_francais'] = isset($match[4]) && isset($match[5]) ? $match[4].$match[5] : $infos['nom_francais'];
186
			$infos['nom_francais'] = isset($match[4]) && isset($match[5]) ? $match[4].$match[5] : $infos['nom_francais'];
179
			if (strpos($infos['auteur_coste'], '(' ) !== false) {
187
			if (strpos($infos['auteur_coste'], '(' ) !== false) {
180
				if (preg_match('/^([^(]*)\(([^)]+)\)(?:[.]?| ; ((?:(?! – ).)+))$/', $infos['auteur_coste'], $match)) {
188
				if (preg_match('/^([^(]*)\(([^)]+)\)(?:[.]?| ; ((?:(?! – ).)+))$/', $infos['auteur_coste'], $match)) {
181
					$infos['auteur_coste'] = trim($match[1]);
189
					$infos['auteur_coste'] = $this->traiterAuteur(trim($match[1]));
182
					$infos['auteur'] = $this->traiterAuteur($infos['auteur_coste']);
190
					$infos['auteur'] = $this->normaliserAuteur($infos['auteur_coste']);
183
					$parentheseContenu = trim($match[2]);
191
					$parentheseContenu = trim($match[2]);
184
					if (preg_match('/^[0-9]+$/', $parentheseContenu)) {
192
					if (preg_match('/^[0-9]+$/', $parentheseContenu)) {
185
						$infos['annee'] = $parentheseContenu;
193
						$infos['annee'] = $parentheseContenu;
186
					} else {
194
					} else {
187
						$infos['synonymie_coste'] = $parentheseContenu;
195
						$infos['synonymie_coste'] = $parentheseContenu;
Line 200... Line 208...
200
		if ($infos['synonymie_coste'] != '') {
208
		if ($infos['synonymie_coste'] != '') {
201
			$this->traiterSynonymie($infos);
209
			$this->traiterSynonymie($infos);
202
		}
210
		}
203
	}
211
	}
Line 204... Line 212...
204
 
212
 
205
	private function traiterAuteur($auteurCoste) {
213
	private function normaliserAuteur($auteurCoste) {
206
		$auteur = '';
214
		$auteur = '';
207
		if ($auteurCoste != '') {
215
		if ($auteurCoste != '') {
208
			$auteur = str_replace('et', '&', $auteurCoste);
216
			$auteur = str_replace(' et ', ' & ', $auteurCoste);
209
		}
217
		}
210
		return $auteur;
218
		return $auteur;
Line 211... Line 219...
211
	}
219
	}
212
 
220
 
213
	private function traiterSynonymie($infos) {
221
	private function traiterSynonymie($infos) {
-
 
222
		$synoCoste = $infos['synonymie_coste'];
214
		$synoCoste = $infos['synonymie_coste'];
223
		$synoCoste = preg_replace('/^et /', '', $synoCoste);
215
		$synoCoste = preg_replace('/^et /', '', $synoCoste);
224
		$synoCoste = preg_replace('/^(([A-Z][.]|[A-Z]{3,}) [A-Z]{3,}(?:(?! et ).+)) et ([A-Z]{3,}) ((?![A-Z]{3,}).+)$/', '$1 ; $2 $3 $4', $synoCoste);
Line 216... Line 225...
216
		$synoCoste = preg_replace('/ et ([A-Z]{2,}|[A-Z][.] [A-Z]{2,})/', ' ; $1', $synoCoste);
225
		$synoCoste = preg_replace('/ et ((?:[A-Z][.]|[A-Z]{3,}) [A-Z]{3,})/', ' ; $1', $synoCoste);
Line 217... Line 226...
217
		$synoCoste = preg_replace('/, ((?:(?!non |part[.]|an |G[.] G[.]|part[.]|centr[.])[^,]+))/', ' ;$1', $synoCoste);
226
		$synoCoste = preg_replace('/, ((?:(?!non |part[.]|an |G[.] G[.]|part[.]|centr[.])[^,]+))/', ' ;$1', $synoCoste);
218
 
227
 
-
 
228
		$synonymes = explode(';', $synoCoste);
-
 
229
 
-
 
230
		foreach ($synonymes as $num => $syno) {
-
 
231
			$synoTraite = $this->traiterNomSyno($syno);
-
 
232
			$complementNom = $this->obtenirComplementNom($synoTraite);
-
 
233
			$auteurCoste = $this->obtenirAuteur($synoTraite);
219
		$synonymes = explode(';', $synoCoste);
234
			$auteur = $this->normaliserAuteur($auteurCoste);
220
 
-
 
221
		foreach ($synonymes as $num => $syno) {
235
			$this->ajouterAuteur($auteur);
222
			$synoTraite = $this->traiterNomSyno($syno);
236
			$biblioCoste = $this->obtenirBiblio($complementNom);
223
			$infosSyno = $this->infosCorrespondanceBase;
237
 
224
			$infosSyno['rang'] = $this->obtenirRangSyno($syno);
238
			$infosSyno = $this->infosCorrespondanceBase;
-
 
239
			$infosSyno['nom_sci'] = $this->obtenirNomSci($synoTraite, $infos, $synonymes, $num);
-
 
240
			$infosSyno['auteur'] = $auteur;
-
 
241
			$infosSyno['biblio_origine'] = $biblioCoste;
-
 
242
			$infosSyno['nom_addendum'] =  $this->obtenirNomAddendum($syno);
-
 
243
 
225
			$infosSyno['nom_sci'] = $this->obtenirNomSci($synoTraite, $infos, $synonymes, $num);
244
			$infosSyno['rang'] = $this->obtenirRangSyno($syno);
226
			$infosSyno['nom_coste'] = $synoTraite;
245
			$infosSyno['nom_coste'] = $synoTraite;
227
			$infosSyno['auteur'] =  $this->obtenirAuteur($synoTraite);
246
			$infosSyno['auteur_coste'] = $auteurCoste;
228
			$infosSyno['nom_addendum'] =  $this->obtenirNomAddendum($syno);
247
			$infosSyno['biblio_coste'] =  $biblioCoste;
229
			$infosSyno['num_nom_coste'] = $infos['num_nom_coste'].'.'.($num + 1);
248
			$infosSyno['num_nom_coste'] = $infos['num_nom_coste'].'.'.($num + 1);
230
			$infosSyno['num_nom_retenu_coste'] = $infos['num_nom_coste'];
249
			$infosSyno['num_nom_retenu_coste'] = $infos['num_nom_coste'];
-
 
250
			$this->ajouterLogSyno(implode("\t", $infosSyno));
-
 
251
			$this->correspondance[] = $infosSyno;
-
 
252
		}
-
 
253
	}
-
 
254
 
-
 
255
	private function traiterNomSyno($syno) {
Line -... Line 256...
-
 
256
		$syno = $this->nettoyerEspacesNomSyno($syno);
-
 
257
		$syno = preg_replace('/^(?:avec|(?:compr|incl)[.]) /', '', $syno);
-
 
258
		return $syno;
-
 
259
	}
-
 
260
 
-
 
261
	private function nettoyerEspacesNomSyno($syno) {
231
			$this->ajouterLogSyno(implode("\t", $infosSyno));
262
		$syno = trim($syno);
232
			$this->correspondance[] = $infosSyno;
263
		$syno = trim($syno, ' ');
233
		}
264
		return $syno;
-
 
265
	}
-
 
266
 
-
 
267
	private function obtenirComplementNom($syno) {
-
 
268
		$complementNom = '';
-
 
269
		if (preg_match('/^(?:[^ ]+ [^ ]+ (?:var|V)[.] [^ ]+|[^ ]+ [^ ]+) (.+)$/', $syno, $match)) {
-
 
270
			$complementNom = $match[1];
-
 
271
		}
234
	}
272
		return $complementNom;
235
 
273
	}
-
 
274
 
-
 
275
	private function obtenirBiblio($complementNom) {
-
 
276
		$biblioCoste = '';
-
 
277
		if (preg_match("/ (p[.] [0-9]{1,}|in .+||Fl[.] fr[.]|(?: Sp[.])? ed[.] [1-2])$/", $complementNom, $match)) {
-
 
278
			$biblioCoste = $match[1];
-
 
279
		}
236
	private function obtenirAuteur($syno) {
280
		return $biblioCoste;
237
		$auteur = '';
281
	}
238
		$nomSciRE = '(?:[^ ]+ [^ ]+ var. [^ ]+|[^ ]+ [^ ]+)';
282
 
239
		if (preg_match("/^$nomSciRE ((?!(?:auct.+|, non.+|p[.] p[.])$).+)$/", $syno, $match)) {
283
	private function obtenirAuteur($complementNom) {
240
			$auteur = $match[1];
284
		$auteurCoste = '';
241
			$auteur = preg_replace('/(?: p[.] p[.]|, non .+|(?: Sp[.])? ed[.] [1-2])$/', '', $auteur);
285
		if (preg_match("/^((?!(?:auct.+|(?:, )?(?:non|an) .+|p[.] p[.])$).+)$/", $complementNom, $match)) {
-
 
286
			$auteurCoste = $this->traiterAuteur($match[1]);
-
 
287
		} else {
-
 
288
			$message = "Impossible de récupérer l'auteur pour le complément de nom ($complementNom).";
-
 
289
			$this->ajouterLogProbleme($message);
-
 
290
		}
-
 
291
		return $auteurCoste;
-
 
292
	}
-
 
293
 
-
 
294
	private function traiterAuteur($auteurCoste) {
-
 
295
		$auteur = '';
-
 
296
		if ($auteurCoste != '') {
-
 
297
			$remplacementTxt = array(' p. p.', ' saltem part.', 'Fl. fr.');
-
 
298
			$auteurCoste = str_replace($remplacementTxt, '', $auteurCoste);
-
 
299
			$remplacementsRegExp = array(
-
 
300
				' [0-9]{4}',
-
 
301
				' auct.+',
-
 
302
				',? part[.]',
242
			$this->ajouterAuteur($auteur);
303
				' p[.] [0-9]{1,}',
243
		} else {
304
				' in .+|,? (?:non|an) .+',
Line 244... Line 305...
244
			$message = "Impossible de récupérer l'auteur pour le synonyme ($syno).";
305
				'(?: Sp[.])? ed[.] [1-2]');
245
			$this->ajouterLogProbleme($message);
306
			$auteur = preg_replace('/(?:'.implode('|', $remplacementsRegExp).')$/', '', $auteurCoste);
246
		}
307
		}
247
		return $auteur;
-
 
248
	}
308
		return $auteur;
249
 
309
	}
250
	private function ajouterAuteur($auteur) {
310
 
251
		if (!isset($this->auteurs[$auteur])) {
311
	private function ajouterAuteur($auteur) {
Line 252... Line 312...
252
			$this->auteurs[$auteur] = 1;
312
		if (!isset($this->auteurs[$auteur])) {
-
 
313
			$this->auteurs[$auteur] = 1;
253
			$this->ajouterLogAuteur($auteur);
314
		} else {
254
		} else {
315
			$this->auteurs[$auteur]++;
255
			$this->auteurs[$auteur]++;
316
		}
256
		}
317
	}
257
	}
318
 
258
 
319
	private function obtenirNomAddendum($syno) {
259
	private function obtenirNomAddendum($syno) {
320
		$syno = $this->nettoyerEspacesNomSyno($syno);
260
		$nomAddendum = array();
321
		$nomAddendum = array();
261
		if (preg_match('/^((?:compr|incl)[.]) /', $syno, $match)) {
322
		if (preg_match('/^((?:compr|incl)[.]) /', $syno, $match)) {
262
			$nomAddendum[] = '['.$match[1].']';
323
			$nomAddendum[] = '['.$match[1].']';
263
		}
324
		}
264
		if (preg_match('/ (auct[.] .+)$/', $syno, $match)) {
325
		if (preg_match('/ (auct[.] .+)$/', $syno, $match)) {
-
 
326
			$nomAddendum[] = '['.$match[1].']';
-
 
327
		} else if (preg_match('/,? ((?:non|an) .+)$/', $syno, $match)) {
265
			$nomAddendum[] = '['.$match[1].']';
328
			$nomAddendum[] = '['.$match[1].']';
Line 266... Line 329...
266
		} else if (preg_match('/, (non .+)$/', $syno, $match)) {
329
		} else if (preg_match('/ (p[.] p[.])$/', $syno, $match)) {
267
			$nomAddendum[] = '['.$match[1].']';
330
			$nomAddendum[] = '['.$match[1].']';
268
		} else if (preg_match('/ (p[.] p[.])$/', $syno, $match)) {
331
		} else if (preg_match('/ (saltem part[.])$/', $syno, $match)) {
Line 269... Line -...
269
			$nomAddendum[] = '['.$match[1].']';
-
 
270
		} else if (preg_match('/ (saltem part[.])$/', $syno, $match)) {
-
 
271
			$nomAddendum[] = '['.$match[1].']';
-
 
272
		}
-
 
273
 
-
 
274
		$nomAddendum = implode(' ; ', $nomAddendum);
-
 
275
		return $nomAddendum;
-
 
276
	}
-
 
277
 
332
			$nomAddendum[] = '['.$match[1].']';
278
	private function obtenirSynoPrecedent($synonymes, $num) {
333
		} else if (preg_match('/,? (part[.])$/', $syno, $match)) {
Line 279... Line 334...
279
		$synoPrecedent = '';
334
			$nomAddendum[] = '['.$match[1].']';
280
		if (isset($synonymes[($num - 1 )])) {
335
		}
Line 323... Line 378...
323
			}
378
			}
324
		}
379
		}
325
		return $synoPrecedent;
380
		return $synoPrecedent;
326
	}
381
	}
Line -... Line 382...
-
 
382
 
-
 
383
	private function obtenirSynoPrecedent($synonymes, $num) {
-
 
384
		$synoPrecedent = '';
-
 
385
		if (isset($synonymes[($num - 1 )])) {
-
 
386
			$synoPrecedent = $this->traiterNomSyno($synonymes[($num - 1 )]);
-
 
387
		}
-
 
388
		return $synoPrecedent;
-
 
389
	}
-
 
390
 
327
 
391
 
328
	private function obtenirNomSci($syno, $infos, $synonymes, $num) {
392
	private function obtenirNomSci($syno, $infos, $synonymes, $num) {
Line 329... Line 393...
329
		$nomSci = $this->remplacerAbreviationGenre($syno, $infos, $synonymes, $num);
393
		$nomSci = $this->remplacerAbreviationGenre($syno, $infos, $synonymes, $num);
330
 
394
 
331
		if (preg_match('/^([^ ]+) ([^ ]+) var. ([^ ]+)/', $nomSci, $match)) {
395
		if (preg_match('/^([^ ]+) ([^ ]+) (?:(?:var|V)[.] ([^ ]+)|(STELATUM) )/', $nomSci, $match)) {
332
			$genre = ucfirst(strtolower($match[1]));
396
			$genre = $this->normaliserGenre($match[1]);
-
 
397
			$sp = $this->normaliserEpithete($match[2]);
333
			$sp = strtolower($match[2]);
398
			$infrasp = isset($match[4]) ? $match[4] : $match[3];
334
			$infrasp = strtolower($match[3]);
399
			$infrasp = $this->normaliserEpithete($infrasp);
335
			$nomSci = "$genre $sp var. $infrasp";
400
			$nomSci = "$genre $sp var. $infrasp";
336
		} else if (preg_match('/^([^ ]+) ([^ ]+)(?: |$)/', $nomSci, $match)) {
401
		} else if (preg_match('/^([^ ]+) ([^ ]+)(?: |$)/', $nomSci, $match)) {
337
			$genre = ucfirst(strtolower($match[1]));
402
			$genre = $this->normaliserGenre($match[1]);
338
			$sp = strtolower($match[2]);
403
			$sp = $this->normaliserEpithete($match[2]);
339
			$nomSci = "$genre $sp";
404
			$nomSci = "$genre $sp";
340
		} else {
405
		} else {
341
			$message = "Le synonyme ($nomSci) du nom {$infos['num_nom_coste']} a une structure étrange.";
406
			$message = "Le synonyme ($nomSci) du nom {$infos['num_nom_coste']} a une structure étrange.";
342
			$this->ajouterLogProbleme($message);
407
			$this->ajouterLogProbleme($message);
343
		}
408
		}
Line -... Line 409...
-
 
409
		return $nomSci;
-
 
410
	}
-
 
411
 
-
 
412
	private function normaliserGenre($genre) {
-
 
413
		$genre = mb_convert_case(mb_strtolower($genre), MB_CASE_TITLE);
-
 
414
		$genre = str_replace('Æ', 'æ', $genre);
-
 
415
		return $genre;
-
 
416
	}
-
 
417
 
-
 
418
	private function normaliserEpithete($sp) {
-
 
419
		$sp = mb_strtolower($sp);
-
 
420
		$sp = str_replace('Æ', 'æ', $sp);
344
		return $nomSci;
421
		return $sp;
345
	}
422
	}
346
 
423
 
347
	private function obtenirRangSyno($syno) {
424
	private function obtenirRangSyno($syno) {
348
		$rang = 290;
425
		$rang = 290;
349
		if (strpos($syno, ' var. ')) {
426
		if (strpos($syno, ' var. ')) {
350
			$rang = 340;
427
			$rang = 340;
Line 351... Line -...
351
		}
-
 
352
		return $rang;
-
 
353
	}
-
 
354
 
-
 
355
	private function traiterNomSyno($syno) {
-
 
356
		$syno = trim($syno);
-
 
357
		$syno = trim($syno, ' ');
-
 
358
		$syno = preg_replace('/^(?:compr|incl)[.] /', '', $syno);
428
		}
359
		return $syno;
429
		return $rang;
360
	}
430
	}
361
 
431
 
362
	private function creerFichierCsvCorrespondance() {
432
	private function creerFichierCsvCorrespondance() {