Rev 494 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?phpclass 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);}}?>