Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 493 | Rev 880 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

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