25,11 → 25,12 |
'auteur' => '', |
'nom_addendum' => '', |
'annee' => '', |
'biblio_coste' => '', |
'biblio_origine' => '', |
'rang' => 290, |
'nom_francais' => '', |
'nom_coste' => '', |
'auteur_coste' => '', |
'biblio_coste' => '', |
'num_nom_coste' => '', |
'num_nom_retenu_coste' => '', |
'num_tax_sup_coste' => '', |
40,6 → 41,8 |
'bdnff_nt' => ''); |
|
public function __construct(Conteneur $conteneur) { |
mb_internal_encoding('UTF-8'); |
setlocale(LC_ALL, 'fr_FR.UTF-8'); |
$this->conteneur = $conteneur; |
$this->outils = $conteneur->getOutils(); |
$this->messages = $conteneur->getMessages(); |
81,6 → 84,11 |
$txtCorrespondance = $this->creerFichierCsvCorrespondance(); |
file_put_contents($fichierTxt, $txtCorrespondance); |
|
ksort($this->auteurs); |
foreach ($this->auteurs as $auteur => $nbre) { |
$this->ajouterLogAuteur("$auteur\t$nbre"); |
} |
|
$this->ecrireLogs(); |
} |
|
178,8 → 186,8 |
$infos['nom_francais'] = isset($match[4]) && isset($match[5]) ? $match[4].$match[5] : $infos['nom_francais']; |
if (strpos($infos['auteur_coste'], '(' ) !== false) { |
if (preg_match('/^([^(]*)\(([^)]+)\)(?:[.]?| ; ((?:(?! – ).)+))$/', $infos['auteur_coste'], $match)) { |
$infos['auteur_coste'] = trim($match[1]); |
$infos['auteur'] = $this->traiterAuteur($infos['auteur_coste']); |
$infos['auteur_coste'] = $this->traiterAuteur(trim($match[1])); |
$infos['auteur'] = $this->normaliserAuteur($infos['auteur_coste']); |
$parentheseContenu = trim($match[2]); |
if (preg_match('/^[0-9]+$/', $parentheseContenu)) { |
$infos['annee'] = $parentheseContenu; |
202,10 → 210,10 |
} |
} |
|
private function traiterAuteur($auteurCoste) { |
private function normaliserAuteur($auteurCoste) { |
$auteur = ''; |
if ($auteurCoste != '') { |
$auteur = str_replace('et', '&', $auteurCoste); |
$auteur = str_replace(' et ', ' & ', $auteurCoste); |
} |
return $auteur; |
} |
213,7 → 221,8 |
private function traiterSynonymie($infos) { |
$synoCoste = $infos['synonymie_coste']; |
$synoCoste = preg_replace('/^et /', '', $synoCoste); |
$synoCoste = preg_replace('/ et ([A-Z]{2,}|[A-Z][.] [A-Z]{2,})/', ' ; $1', $synoCoste); |
$synoCoste = preg_replace('/^(([A-Z][.]|[A-Z]{3,}) [A-Z]{3,}(?:(?! et ).+)) et ([A-Z]{3,}) ((?![A-Z]{3,}).+)$/', '$1 ; $2 $3 $4', $synoCoste); |
$synoCoste = preg_replace('/ et ((?:[A-Z][.]|[A-Z]{3,}) [A-Z]{3,})/', ' ; $1', $synoCoste); |
$synoCoste = preg_replace('/, ((?:(?!non |part[.]|an |G[.] G[.]|part[.]|centr[.])[^,]+))/', ' ;$1', $synoCoste); |
|
$synonymes = explode(';', $synoCoste); |
220,12 → 229,22 |
|
foreach ($synonymes as $num => $syno) { |
$synoTraite = $this->traiterNomSyno($syno); |
$complementNom = $this->obtenirComplementNom($synoTraite); |
$auteurCoste = $this->obtenirAuteur($synoTraite); |
$auteur = $this->normaliserAuteur($auteurCoste); |
$this->ajouterAuteur($auteur); |
$biblioCoste = $this->obtenirBiblio($complementNom); |
|
$infosSyno = $this->infosCorrespondanceBase; |
$infosSyno['nom_sci'] = $this->obtenirNomSci($synoTraite, $infos, $synonymes, $num); |
$infosSyno['auteur'] = $auteur; |
$infosSyno['biblio_origine'] = $biblioCoste; |
$infosSyno['nom_addendum'] = $this->obtenirNomAddendum($syno); |
|
$infosSyno['rang'] = $this->obtenirRangSyno($syno); |
$infosSyno['nom_sci'] = $this->obtenirNomSci($synoTraite, $infos, $synonymes, $num); |
$infosSyno['nom_coste'] = $synoTraite; |
$infosSyno['auteur'] = $this->obtenirAuteur($synoTraite); |
$infosSyno['nom_addendum'] = $this->obtenirNomAddendum($syno); |
$infosSyno['auteur_coste'] = $auteurCoste; |
$infosSyno['biblio_coste'] = $biblioCoste; |
$infosSyno['num_nom_coste'] = $infos['num_nom_coste'].'.'.($num + 1); |
$infosSyno['num_nom_retenu_coste'] = $infos['num_nom_coste']; |
$this->ajouterLogSyno(implode("\t", $infosSyno)); |
232,25 → 251,66 |
$this->correspondance[] = $infosSyno; |
} |
} |
|
private function traiterNomSyno($syno) { |
$syno = $this->nettoyerEspacesNomSyno($syno); |
$syno = preg_replace('/^(?:avec|(?:compr|incl)[.]) /', '', $syno); |
return $syno; |
} |
|
private function obtenirAuteur($syno) { |
$auteur = ''; |
$nomSciRE = '(?:[^ ]+ [^ ]+ var. [^ ]+|[^ ]+ [^ ]+)'; |
if (preg_match("/^$nomSciRE ((?!(?:auct.+|, non.+|p[.] p[.])$).+)$/", $syno, $match)) { |
$auteur = $match[1]; |
$auteur = preg_replace('/(?: p[.] p[.]|, non .+|(?: Sp[.])? ed[.] [1-2])$/', '', $auteur); |
$this->ajouterAuteur($auteur); |
private function nettoyerEspacesNomSyno($syno) { |
$syno = trim($syno); |
$syno = trim($syno, ' '); |
return $syno; |
} |
|
private function obtenirComplementNom($syno) { |
$complementNom = ''; |
if (preg_match('/^(?:[^ ]+ [^ ]+ (?:var|V)[.] [^ ]+|[^ ]+ [^ ]+) (.+)$/', $syno, $match)) { |
$complementNom = $match[1]; |
} |
return $complementNom; |
} |
|
private function obtenirBiblio($complementNom) { |
$biblioCoste = ''; |
if (preg_match("/ (p[.] [0-9]{1,}|in .+||Fl[.] fr[.]|(?: Sp[.])? ed[.] [1-2])$/", $complementNom, $match)) { |
$biblioCoste = $match[1]; |
} |
return $biblioCoste; |
} |
|
private function obtenirAuteur($complementNom) { |
$auteurCoste = ''; |
if (preg_match("/^((?!(?:auct.+|(?:, )?(?:non|an) .+|p[.] p[.])$).+)$/", $complementNom, $match)) { |
$auteurCoste = $this->traiterAuteur($match[1]); |
} else { |
$message = "Impossible de récupérer l'auteur pour le synonyme ($syno)."; |
$message = "Impossible de récupérer l'auteur pour le complément de nom ($complementNom)."; |
$this->ajouterLogProbleme($message); |
} |
return $auteur; |
return $auteurCoste; |
} |
|
private function traiterAuteur($auteurCoste) { |
$auteur = ''; |
if ($auteurCoste != '') { |
$remplacementTxt = array(' p. p.', ' saltem part.', 'Fl. fr.'); |
$auteurCoste = str_replace($remplacementTxt, '', $auteurCoste); |
$remplacementsRegExp = array( |
' [0-9]{4}', |
' auct.+', |
',? part[.]', |
' p[.] [0-9]{1,}', |
' in .+|,? (?:non|an) .+', |
'(?: Sp[.])? ed[.] [1-2]'); |
$auteur = preg_replace('/(?:'.implode('|', $remplacementsRegExp).')$/', '', $auteurCoste); |
} |
return $auteur; |
} |
|
private function ajouterAuteur($auteur) { |
if (!isset($this->auteurs[$auteur])) { |
$this->auteurs[$auteur] = 1; |
$this->ajouterLogAuteur($auteur); |
} else { |
$this->auteurs[$auteur]++; |
} |
257,6 → 317,7 |
} |
|
private function obtenirNomAddendum($syno) { |
$syno = $this->nettoyerEspacesNomSyno($syno); |
$nomAddendum = array(); |
if (preg_match('/^((?:compr|incl)[.]) /', $syno, $match)) { |
$nomAddendum[] = '['.$match[1].']'; |
263,12 → 324,14 |
} |
if (preg_match('/ (auct[.] .+)$/', $syno, $match)) { |
$nomAddendum[] = '['.$match[1].']'; |
} else if (preg_match('/, (non .+)$/', $syno, $match)) { |
} else if (preg_match('/,? ((?:non|an) .+)$/', $syno, $match)) { |
$nomAddendum[] = '['.$match[1].']'; |
} else if (preg_match('/ (p[.] p[.])$/', $syno, $match)) { |
$nomAddendum[] = '['.$match[1].']'; |
} else if (preg_match('/ (saltem part[.])$/', $syno, $match)) { |
$nomAddendum[] = '['.$match[1].']'; |
} else if (preg_match('/,? (part[.])$/', $syno, $match)) { |
$nomAddendum[] = '['.$match[1].']'; |
} |
|
$nomAddendum = implode(' ; ', $nomAddendum); |
275,14 → 338,6 |
return $nomAddendum; |
} |
|
private function obtenirSynoPrecedent($synonymes, $num) { |
$synoPrecedent = ''; |
if (isset($synonymes[($num - 1 )])) { |
$synoPrecedent = $this->traiterNomSyno($synonymes[($num - 1 )]); |
} |
return $synoPrecedent; |
} |
|
private function remplacerAbreviationGenre($syno, $infos, $synonymes, $num) { |
$nomSci = $syno; |
|
325,17 → 380,27 |
return $synoPrecedent; |
} |
|
private function obtenirSynoPrecedent($synonymes, $num) { |
$synoPrecedent = ''; |
if (isset($synonymes[($num - 1 )])) { |
$synoPrecedent = $this->traiterNomSyno($synonymes[($num - 1 )]); |
} |
return $synoPrecedent; |
} |
|
|
private function obtenirNomSci($syno, $infos, $synonymes, $num) { |
$nomSci = $this->remplacerAbreviationGenre($syno, $infos, $synonymes, $num); |
|
if (preg_match('/^([^ ]+) ([^ ]+) var. ([^ ]+)/', $nomSci, $match)) { |
$genre = ucfirst(strtolower($match[1])); |
$sp = strtolower($match[2]); |
$infrasp = strtolower($match[3]); |
if (preg_match('/^([^ ]+) ([^ ]+) (?:(?:var|V)[.] ([^ ]+)|(STELATUM) )/', $nomSci, $match)) { |
$genre = $this->normaliserGenre($match[1]); |
$sp = $this->normaliserEpithete($match[2]); |
$infrasp = isset($match[4]) ? $match[4] : $match[3]; |
$infrasp = $this->normaliserEpithete($infrasp); |
$nomSci = "$genre $sp var. $infrasp"; |
} else if (preg_match('/^([^ ]+) ([^ ]+)(?: |$)/', $nomSci, $match)) { |
$genre = ucfirst(strtolower($match[1])); |
$sp = strtolower($match[2]); |
$genre = $this->normaliserGenre($match[1]); |
$sp = $this->normaliserEpithete($match[2]); |
$nomSci = "$genre $sp"; |
} else { |
$message = "Le synonyme ($nomSci) du nom {$infos['num_nom_coste']} a une structure étrange."; |
344,6 → 409,18 |
return $nomSci; |
} |
|
private function normaliserGenre($genre) { |
$genre = mb_convert_case(mb_strtolower($genre), MB_CASE_TITLE); |
$genre = str_replace('Æ', 'æ', $genre); |
return $genre; |
} |
|
private function normaliserEpithete($sp) { |
$sp = mb_strtolower($sp); |
$sp = str_replace('Æ', 'æ', $sp); |
return $sp; |
} |
|
private function obtenirRangSyno($syno) { |
$rang = 290; |
if (strpos($syno, ' var. ')) { |
352,13 → 429,6 |
return $rang; |
} |
|
private function traiterNomSyno($syno) { |
$syno = trim($syno); |
$syno = trim($syno, ' '); |
$syno = preg_replace('/^(?:compr|incl)[.] /', '', $syno); |
return $syno; |
} |
|
private function creerFichierCsvCorrespondance() { |
$lignes[] = implode("\t", array_keys($this->infosCorrespondanceBase)); |
foreach ($this->correspondance as $infos) { |