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); } } ?>