New file |
0,0 → 1,329 |
<?php |
class Index { |
|
const DOSSIER_V0 = '../../../donnees/coste/0.00/'; |
const DOSSIER_V2 = '../../../donnees/coste/2.00/'; |
|
private $conteneur = null; |
private $outils = null; |
private $messages = null; |
private $generateur = null; |
private $dossierBase = ''; |
private $spIndex = array(); |
private $supraSpIndex = array(); |
private $imgIndex = array(); |
private $indexFinal = array(); |
private $tableauParDefaut = array(); |
private $nbreTaxonInf = array(); |
private $enteteFinal = array( |
'num_nom', |
'num_nom_retenu', |
'num_tax_sup', |
'rang', |
'nom_sci', |
'nom_supra_generique', |
'genre', |
'epithete_infra_generique', |
'epithete_sp', |
'type_epithete', |
'epithete_infra_sp', |
'cultivar_groupe', |
'cultivar', |
'nom_commercial', |
'auteur', |
'annee', |
'biblio_origine', |
'notes', |
'nom_addendum', |
'nom_francais', |
'nom_coste', |
'auteur_coste', |
'biblio_coste', |
'num_nom_coste', |
'num_nom_retenu_coste', |
'num_tax_sup_coste', |
'synonymie_coste', |
'tome', |
'page', |
'nbre_taxons', |
'flore_bdtfx_nn', |
'flore_bdtfx_nt', |
'image', |
'image_auteur', |
'page_wiki_dsc', |
'page_wiki_cle', |
'nom_sci_html'); |
|
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(); |
$this->generateur = $conteneur->getGenerateurNomSciHtml(); |
$this->dossierBase = dirname(__FILE__).'/'; |
} |
|
public function fusionnerIndex() { |
$this->chargerIndexSp(); |
$this->chargerIndexSupraSp(); |
$this->initialiserTableauLigneIndexFinal(); |
$this->creerIndexFinal(); |
$this->insererCorrections(); |
$this->ajouterChampsDansIndexFinal(); |
$this->ajouteurAuteurImage(); |
$this->decomposerNomSci(); |
$this->ajouteurNomSciHtml(); |
$this->creerFichierCsvIndexFinal(); |
} |
|
private function chargerIndexSp() { |
$spIndexFichier = $this->dossierBase.self::DOSSIER_V0.'index_general_sp.tsv'; |
$index = $this->outils->transformerTxtTsvEnTableau($spIndexFichier); |
$index = $this->reindexerParNumNomCoste($index); |
foreach ($index as $numNomCoste => $infos) { |
$numTaxSup = ''; |
if ($infos['num_nom_coste'] == $infos['num_nom_retenu_coste']) { |
$numTaxSup = $infos['num_tax_sup_coste']; |
} else { |
$infosNomRetenu = $index[$infos['num_nom_retenu_coste']]; |
$numTaxSup = $infosNomRetenu['num_tax_sup_coste']; |
} |
$this->spIndex[$numTaxSup][] = $infos; |
} |
} |
|
private function reindexerParNumNomCoste($index) { |
$nouvelIndex = array(); |
foreach ($index as $infos) { |
$nouvelIndex[$infos['num_nom_coste']] = $infos; |
} |
return $nouvelIndex; |
} |
|
private function chargerIndexSupraSp() { |
$infraSpIndexFichier = $this->dossierBase.self::DOSSIER_V0.'index_general.tsv'; |
$this->supraSpIndex = $this->outils->transformerTxtTsvEnTableau($infraSpIndexFichier); |
foreach ($this->supraSpIndex as $cle => $infos) { |
$this->supraSpIndex[$cle]['num_nom_retenu_coste'] = $infos['num_nom_coste']; |
} |
} |
|
private function initialiserTableauLigneIndexFinal() { |
$this->tableauParDefaut = array(); |
foreach ($this->enteteFinal as $cle) { |
$this->tableauParDefaut[$cle] = ''; |
} |
} |
|
private function creerIndexFinal() { |
foreach ($this->supraSpIndex as $infos) { |
$this->ajouterDansIndexFinal($infos); |
if (preg_match('/^G[0-9]+$/', $infos['num_nom_coste'])) { |
foreach ($this->spIndex[$infos['num_nom_coste']] as $infosSp) { |
$this->ajouterDansIndexFinal($infosSp); |
} |
} |
} |
} |
|
private function ajouterDansIndexFinal($infos) { |
$infos = array_merge($this->tableauParDefaut, $infos); |
$infos['num_nom'] = (count($this->indexFinal) + 1); |
$this->indexFinal[$infos['num_nom_coste']] = $infos; |
} |
|
private function ajouterChampsDansIndexFinal() { |
$this->genererNbreTaxons(); |
foreach ($this->indexFinal as $nnc => $infos) { |
if ($infos['num_nom_coste'] == $infos['num_nom_retenu_coste']) { |
$infos['num_nom_retenu'] = $infos['num_nom']; |
if ($nnc != 'R') { |
$nomSuperieur = $this->indexFinal[$infos['num_tax_sup_coste']]; |
$infos['num_tax_sup'] = $nomSuperieur['num_nom']; |
} |
$nomRetenu = $infos; |
} else { |
$nomRetenu = $this->indexFinal[$infos['num_nom_retenu_coste']]; |
$infos['num_nom_retenu'] = $nomRetenu['num_nom']; |
$infos['page'] = $nomRetenu['page']; |
$infos['tome'] = $nomRetenu['tome']; |
} |
$infos['image'] = $this->obtenirNomFichierImg($nomRetenu); |
$infos['nbre_taxons'] = $this->obtenirNbreTaxon($infos); |
$nomRetenu['nbre_taxons'] = $infos['nbre_taxons']; |
$infos['page_wiki_dsc'] = $this->genererPageWikiDsc($nomRetenu); |
$infos['page_wiki_cle'] = $this->genererPageWikiCle($nomRetenu); |
|
$this->indexFinal[$nnc] = $infos; |
} |
} |
|
private function genererNbreTaxons() { |
foreach ($this->indexFinal as $infos) { |
if ($infos['num_tax_sup_coste'] != '') { |
if (isset($this->nbreTaxonInf[$infos['num_tax_sup_coste']])) { |
$this->nbreTaxonInf[$infos['num_tax_sup_coste']] += 1; |
} else { |
$this->nbreTaxonInf[$infos['num_tax_sup_coste']] = 1; |
} |
} |
} |
} |
|
private function genererPageWikiDsc($infos) { |
$prefixe = $this->genererPrefixePage($infos); |
if ($infos['rang'] == '180') { |
$nomSci = str_replace(' ', '', ucwords(strtolower($infos['nom_coste']))); |
} else { |
$nomSci = str_replace(' ', '', ucwords(strtolower($infos['nom_sci']))); |
} |
$pageWiki = $prefixe.$nomSci; |
return $pageWiki; |
} |
|
private function genererPageWikiCle($infos) { |
$pageWiki = ''; |
if ($infos['nbre_taxons'] > 1) { |
$prefixe = $this->genererPrefixePage($infos); |
if ($infos['rang'] == '20') { |
$pageWiki = $prefixe.'TabClaEtEmb'; |
} elseif ($infos['rang'] == '40' && ($infos['num_nom_coste'] == 'E2' || $infos['num_nom_coste'] == 'E3')) { |
$pageWiki = $prefixe.'TabFam'; |
} else if ($infos['rang'] == '80') { |
$pageWiki = $prefixe.'TabFam'; |
} else if ($infos['rang'] == '180') { |
$pageWiki = $prefixe.'TabGen'; |
} else if ($infos['rang'] == '220') { |
$pageWiki = $prefixe.'TabSp'; |
} |
} |
return $pageWiki; |
} |
|
private function genererPrefixePage($infos) { |
$prefixe = ''; |
$num = preg_replace('/^[a-z]*([0-9]+)(?:[.][0-9a-z]|)$/i', '$1', $infos['num_nom_coste']); |
if (preg_match('/^([0-9]+)[.][0-9a-z]$/i', $infos['num_nom_coste'], $match)) { |
$num = sprintf('%04s', $match[1]); |
} else if ($infos['rang'] == 20 ) { |
$num = ''; |
} else if ($infos['rang'] < 80 ) { |
$num = sprintf('%02s', $num); |
} else if ($infos['rang'] < 290 ) { |
$num = sprintf('%03s', $num); |
} else { |
$num = sprintf('%04s', $num); |
} |
$rangsTxt = array('20' => 'Reg', '40' => 'Emb', '80' => 'Cla', '180' => 'Fam', '220' => 'Gen', '290' => 'Esp', '340' => 'Var'); |
$rang = $rangsTxt[$infos['rang']]; |
|
$prefixe = $rang.$num; |
return $prefixe; |
} |
|
private function obtenirNbreTaxon($infos) { |
$nbre = ''; |
if (isset($this->nbreTaxonInf[$infos['num_nom_coste']])) { |
$nbre = $this->nbreTaxonInf[$infos['num_nom_coste']]; |
} |
return $nbre; |
} |
|
private function obtenirNomFichierImg($infos) { |
$img = ''; |
if ($infos['rang'] == '290') { |
$prefixe = preg_replace('/[.][a-z]$/', '', $infos['num_nom_retenu']); |
$img = $prefixe.'.png'; |
} |
return $img; |
} |
|
private function ajouteurAuteurImage() { |
$this->chargerAuteurImg(); |
foreach ($this->indexFinal as $nnc => $infos) { |
$infos['image_auteur'] = $this->imgIndex[$infos['image']]; |
$this->indexFinal[$nnc] = $infos; |
} |
} |
|
private function chargerAuteurImg() { |
$imgIndexFichier = $this->dossierBase.self::DOSSIER_V0.'coste_images_auteur_correspondance_bdnff.tsv'; |
$index = $this->outils->transformerTxtTsvEnTableau($imgIndexFichier); |
foreach ($index as $infos) { |
$id = $infos['id_image']; |
$this->imgIndex[$id] = $infos['auteur']; |
} |
} |
|
private function decomposerNomSci() { |
$majuscule = "[ÆŒA-Z]"; |
$epithete = "[æœïa-z-]+"; |
foreach ($this->indexFinal as $nnc => $infos) { |
$id = $infos['num_nom_coste']; |
$nomSci = $infos['nom_sci']; |
$rang = $infos['rang']; |
if ($rang < 220) { |
$infos['nom_supra_generique'] = $nomSci; |
} else if ($rang == 220) { |
$infos['genre'] = $nomSci; |
} else if ($rang == 290) { |
if (preg_match("/^($majuscule$epithete) ($epithete)$/", $nomSci, $match)) { |
$infos['genre'] = $match[1]; |
$infos['epithete_sp'] = $match[2]; |
} else { |
$this->messages->traiterErreur("Le nom $nomSci ($id) de rang $rang n'est pas standard."); |
} |
} else if ($rang == 340) { |
if (preg_match("/^($majuscule$epithete) ($epithete) (var[.]) ($epithete)$/", $nomSci, $match)) { |
$infos['genre'] = $match[1]; |
$infos['epithete_sp'] = $match[2]; |
$infos['type_epithete'] = $match[3]; |
$infos['epithete_infra_sp'] = $match[4]; |
} else { |
$this->messages->traiterErreur("Le nom $nomSci ($id) de rang $rang n'est pas standard."); |
} |
} |
|
$this->indexFinal[$nnc] = $infos; |
$this->messages->afficherAvancement("Décomposition des noms scientifiques en cours"); |
} |
echo "\n"; |
} |
|
private function ajouteurNomSciHtml() { |
foreach ($this->indexFinal as $nnc => $infos) { |
$this->indexFinal[$nnc]['nom_sci_html'] = $this->generateur->genererNomSciHtml($infos); |
$this->messages->afficherAvancement("Création des noms scientifiques HTML en cours"); |
} |
echo "\n"; |
} |
|
private function insererCorrections() { |
$correctionsFichier = $this->dossierBase.self::DOSSIER_V2.'coste_v2_00_corrections.tsv'; |
$corrections = $this->outils->transformerTxtTsvEnTableau($correctionsFichier); |
foreach ($corrections as $infos) { |
$nnc = $infos['num_nom_coste']; |
$infosACorriger = isset($this->indexFinal[$nnc]) ? $this->indexFinal[$nnc] : array(); |
foreach ($corrections as $champ => $valeur) { |
$infosACorriger[$champ] = $valeur; |
} |
$this->indexFinal[$nnc] = $infosACorriger; |
} |
} |
|
private function creerFichierCsvIndexFinal() { |
$lignes = array(); |
array_unshift($this->indexFinal, $this->enteteFinal); |
foreach ($this->indexFinal as $infos) { |
$lignes[] = implode("\t", $infos); |
} |
|
$txt = ''; |
$txt = implode("\n", $lignes); |
|
$fichierTsvIndexFinal = $this->dossierBase.self::DOSSIER_V2.'coste_v2_00.tsv'; |
file_put_contents($fichierTsvIndexFinal, $txt); |
} |
} |
?> |