* @author Jean-Pascal MILCENT * @author Aurelien PERONNET * @license GPL v3 * @license CECILL v2 * @copyright 1999-2014 Tela Botanica */ class DecoupageNomLatin extends Decoupage { private $expression_principale = array(); private $expression_complement = array(); public function __construct() { parent::__construct(); // Genre et nom supragénérique $this->expression_principale[1] = "/^((?:$this->hyb |)$this->Gen)(?:( $this->Inf)|)$/u"; // Sp $this->expression_principale[2] = "/^((?:$this->hyb |)$this->Gen) ((?:($this->hyb) |$this->Dou|)(?:$this->Epi|$this->Dou))(?:((?:,| $this->Ran) $this->Inf)| agg\.|)$/u"; // Rang infragénérique et supraspécifique $this->expression_principale[3] = '/^('.$this->Gen.') ('.$this->Ran.') ('.$this->Gen.'|.'.$this->Epi.')(?:(, '.$this->Inf.')|)$/u'; // Hybride interspécifique $this->expression_principale[4] = "/^((?:$this->Gen) $this->Epi (?:($this->Ran) $this->Epi )?x $this->Epi(?: ($this->Ran) $this->Epi)?)$/u"; // Aggrégat $this->expression_principale[5] = "/^($this->Gen) ($this->Epi) (agg\.)(?:( $this->Inf)|)$/u";// // Epithète infra-spécifique $this->expression_complement[1] = "/^ ($this->Ran) ((?:($this->hyb) |$this->Dou|)(?:$this->Epi|$this->Dou))(?:((?:,| $this->Ran) $this->Inf)|)$/Uu"; // Cultivar $this->expression_complement[5] = "/^ ($this->Ran_ht) ((?:(?:$this->Epi_cv) ?)+)$/u"; } public function decouper($nom_latin) { $aso_nom_decompo = array('nom_genre' => '', 'nom_sp' => '', 'auteur_sp' => '', 'nom_complement' => '', 'type_infrasp' => '', 'nom_infrasp' => '', 'num_nomenc' => '', 'num_taxo' => '', 'rang_taxonomique' => '', 'nom_courant' => '', 'nom_superieur' => '', 'agg' => ''); $aso_nom_decompo['nom_complet'] = $nom_latin; while ($nom_latin != '') { $morceau = array(); if (preg_match($this->expression_principale[4], $nom_latin, $morceau)) {// Formule d'hybridation // Nous tentons de déterminer le rang de l'hybride if (isset($morceau[2]) && isset($morceau[3]) && $morceau[2] == $morceau[3]) { $aso_nom_decompo['rang_taxonomique'] = $this->attribuerCodeRang('n-'.$morceau[2]); } else { $aso_nom_decompo['rang_taxonomique'] = 260;// Hybride instersp. } $aso_nom_decompo['mark_hybride_interspecifique'] = 'x'; $aso_nom_decompo['formule_hybridation'] = $morceau[0]; $nom_latin = ''; } else if (preg_match($this->expression_principale[5], $nom_latin, $morceau)) {// agg. $aso_nom_decompo['rang_taxonomique'] = 240;// agg. $aso_nom_decompo['nom_genre'] = $morceau[1]; $aso_nom_decompo['nom_sp'] = $morceau[2]; $aso_nom_decompo['agg'] = $morceau[3]; $nom_latin = $morceau[4]; $aso_nom_decompo['nom_superieur'] = $morceau[1]; $aso_nom_decompo['nom_courant'] = $morceau[2]; } else if (preg_match($this->expression_principale[2], $nom_latin, $morceau)) {// Nom d'sp. // Nous regardons si nous avons à faire à un hybride if (preg_match('/^'.$this->hyb.'$/', $morceau[3])) { $aso_nom_decompo['rang_taxonomique'] = 260;// hybride intersp. $aso_nom_decompo['mark_hybride_interspecifique'] = strtolower($morceau[3]); } else if (preg_match('/^'.$this->Epi_nn_hy.'$/', $morceau[2])) { $aso_nom_decompo['rang_taxonomique'] = 260;// hybride intersp. $aso_nom_decompo['mark_hybride_interspecifique'] = 'x'; } else { $aso_nom_decompo['rang_taxonomique'] = 250;// sp. } // Nous atribuons le genre $aso_nom_decompo['nom_genre'] = $morceau[1]; // Nous regardons si nous avons à faire à une phrase non nommé (ex : sp.1, spp., nsp.) if (preg_match('/^'.$this->Epi_nn.'$/', $morceau[2])) { $aso_nom_decompo['phrase_nom_non_nomme'] = $morceau[2];// hybride intersp. $aso_nom_decompo['nom_sp'] = ''; } else { $aso_nom_decompo['nom_sp'] = $morceau[2]; } $nom_latin = $morceau[4]; $aso_nom_decompo['nom_superieur'] = $morceau[1]; $aso_nom_decompo['nom_courant'] = $morceau[2]; } else if (preg_match($this->expression_principale[3], $nom_latin, $morceau)) {// Nom infragénérique et supraspécifique $aso_nom_decompo['nom_genre'] = $morceau[1]; $aso_nom_decompo['rang_taxonomique'] = $this->attribuerCodeRang($morceau[2]); // Nous regardons si nous avons à faire à un groupe if (preg_match('/^'.$this->Ran_ig_gr.'$/', $morceau[2])) { $aso_nom_decompo['nom_sp'] = $morceau[3]; } else { $aso_nom_decompo['nom_infra_genre'] = $morceau[3]; } $nom_latin = $morceau[4]; $aso_nom_decompo['nom_superieur'] = $morceau[1]; $aso_nom_decompo['nom_courant'] = $morceau[3]; } else if (preg_match($this->expression_principale[1], $nom_latin, $morceau)) {// Nom de genre et supragénérique $aso_nom_decompo['rang_taxonomique'] = $this->verifierTerminaisonLatine($nom_latin); $aso_nom_decompo['nom_suprasp'] = $morceau[1]; $nom_latin = $morceau[2]; $aso_nom_decompo['nom_superieur'] = null; $aso_nom_decompo['nom_courant'] = $morceau[1]; } else if (preg_match($this->expression_complement[5], $nom_latin, $morceau)) {// Cultivar $aso_nom_decompo['rang_cultivar'] = $this->attribuerCodeRang($morceau[1]); // Nous vérifions si nous avons à faire à un cultivar d'hybride if ($aso_nom_decompo['mark_hybride_interspecifique'] == 'x' && $aso_nom_decompo['rang_cultivar'] == 460) { $aso_nom_decompo['rang_cultivar'] = 470; } $aso_nom_decompo['cultivar'] = $morceau[2]; $nom_latin = ''; } else if (preg_match($this->expression_complement[1], $nom_latin, $morceau)) {// Nom infrasp. if (preg_match('/^'.$this->hyb.'$/', $morceau[3])) { $aso_nom_decompo['mark_hybride_interspecifique'] = strtolower($morceau[3]); } $aso_nom_decompo['rang_taxonomique'] = $this->attribuerCodeRang($morceau[1]); $aso_nom_decompo['type_infrasp'] = $morceau[1]; $aso_nom_decompo['nom_infrasp'] = $morceau[2]; $nom_latin = $morceau[4]; $aso_nom_decompo['nom_superieur'] = $aso_nom_decompo['nom_courant']; $aso_nom_decompo['nom_courant'] = $morceau[2]; } else {// Erreurs $aso_nom_decompo['erreur_mark'] = 'erreur'; $aso_nom_decompo['erreur_notes'] = $nom_latin; $nom_latin = ''; } } return $aso_nom_decompo; } public function verifierTerminaisonLatine($nom_latin) { if (preg_match('/^Plantae$/', $nom_latin)) {// Règne return 10; } else if (preg_match('/phyta$/', $nom_latin)) {// Embranchement ou Division return 30; } else if (preg_match('/phytina$/', $nom_latin)) {// Sous-Embranchement ou Sous-Division return 40; } if (preg_match('/opsida$/', $nom_latin)) {// Classe return 70; } else if (preg_match('/idae$/', $nom_latin)) {// Sous-Classe return 80; } else if (preg_match('/ales$/', $nom_latin)) {// Ordre return 100; } else if (preg_match('/ineae$/', $nom_latin)) {// Sous-Ordre return 110; } else if (preg_match('/aceae$/', $nom_latin)) {// Famille return 120; } else if (preg_match('/oideae$/', $nom_latin)) {// Sous-Famille return 130; } else if (preg_match('/eae$/', $nom_latin)) {// Tribu return 140; } else if (preg_match('/inae$/', $nom_latin)) {// Sous-Tribu return 150; } else if (preg_match('/^[A-Z]/', $nom_latin)) {// Genre return 160; } else { return 1; } } static function fournirTableauAbreviationRang($type = 'tout') { $rang_supra_sp = array('subgen.', 'subg.', 'sect.');// l'abréviation du rang est suivi par un nom supra spécifique commençant par une majuscule $rang_supra_gr = array('gr.');// l'abréviation du rang est suivi par un nom ne commençant pas par une majuscule $rang_supra_agg = array('agg.');// le nom latin est terminé par l'abréviation du rang $rang_infra_sp = array('subsp.', 'n-subsp.', '[subsp.]', '[n-subsp.]', 'var.', 'nvar.', '[var.]', 'prol.', 'proles', 'n-proles.', 'f.', 'fa', 'fa.', 'forma', 'subvar.', 'convar.', 'cv.', 'Cv.', 'n-f.', 'n-fa', 'n-fa.', 'subf.', 'subfa', 'subfa.'); if ($type == 'supra') { return $rang_supra_sp; } else if ($type == 'supra-gr') { return $rang_supra_gr; } else if ($type == 'supra-agg') { return $rang_supra_agg; } else if ($type == 'infra') { return $rang_infra_sp; } else if ($type == 'tout') { return array_merge($rang_supra_sp, $rang_supra_gr, $rang_supra_agg, $rang_infra_sp); } } static function actualiserCodeRang($code_rang) { $aso_rang = array('1' => '10', // Règne '3' => '20', // Sous-Règne '5' => '30', // Phylum '7' => '40', // Sub-Phylum '9' => '50', // division '15' => '60', // sous-division '20' => '70', // classe '25' => '80', // sous-classe '30' => '100', // ordre '35' => '110', // sous-ordre '40' => '120', // famille '45' => '130', // sous-famille '50' => '140', // tribu '55' => '150', // sous-tribu '60' => '160', // genre '62' => '170', // genre hybride (nouveau compatibilité flore Réunion) '65' => '180', // sous-genre '65' => '190', // section '75' => '200', // sous-section '80' => '210', // série '85' => '220', // sous-série '90' => '230', // groupe '95' => '240', // aggrégat '100' => '250', // espèce '102' => '260', // espèce hybride intragénérique '104' => '260', // espèce hybride intergénérique '110' => '280', // sous-espèce '112' => '300', // sous-espèce hybride : hybride entre deux sous-espèces d'une espèce non hybride ; exemple : Polypodium vulgare L. nsubsp. mantoniae (Rothm.) Schidlay (Polypodium vulgare L. subsp. vulgare x Polypodium vulgare L. subsp. prionodes (Aschers.) Rothm.). '113' => '310', // sous-espèce hybride : sous-espèce d'espèce hybride sans spécification du rang parental (subspecies) (voir ICBN, art. H.12.1). '114' => '300', // sous-espèce hybride : sous-espèce hybride d'espèce hybride (nothosubspecies) (voir ICBN, art. H.12.1) ; exemple : Mentha x piperita L. nsubsp. piperita (Mentha aquatica L. x Mentha spicata L. subsp. glabrata (Lej. et Court.) Lebeau). '115' => '300', // sous-espèce hybride '120' => '1', // infra2 '122' => '330', // prole, race : peu employé souvent issu de nom ancien (antérieur au code). '124' => '340', // prole, race hybride : peu employé souvent issu de nom ancien (antérieur au code). '132' => '350', // convarietas : si on le conscidère comme un rang intermédiaire entre la sous-espèce et la variété. Voir aussi n°200. '130' => '1', // infra3 : niveau infra-spécifique de troisième niveau, sans plus de précision. '140' => '360', // variété '142' => '380', // variété : hybride entre deux variétés d'une espèce non hybride. '143' => '390', // variété : variété d'espèce hybride sans spécification du rang parental (varietas) (voir ICBN, art. H.12.1); exemple : Populus x canadensis Moench var. marilandica (Poir.) Rehder. '144' => '380', // variété : variété hybride d'espèce hybride (nothovarietas) ; exemple : Salix x sepulcralis Simonk. nvar. chrysocoma (Dode) Meikle. '145' => '380', // variété hybride '150' => '410', // sous-variété '160' => '420', // forme '162' => '430', // forme : hybride entre deux formes d'une espèce non hybride. '163' => '430', // forme : forme d'espèce hybride sans spécification du rang parental (forma) (voir ICBN, art. H.12.1); exemple : Mentha x piperita L. f. hirsuta Sole. '164' => '430', // forme : forme hybride d'espèce hybride (nothoforma). '170' => '440', // sous-forme '200' => '450', // groupe de cultivar '210' => '460', // cultivar '220' => '470', // cultivar d'hybride '0' => '480' // clade ); return $aso_rang[$code_rang]; } public function attribuerCodeInfra($str_abreviation_type_infra) { $aso_code_infra = array('type' => '', 'code' => 0, 'rang' => 2 ); switch ($str_abreviation_type_infra) { case 'subgen.' : case 'subg.' : $aso_code_infra['rang'] = 180; break; case 'sect.' : $aso_code_infra['rang'] = 190; break; case 'gr.' : $aso_code_infra['rang'] = 230; break; case 'subsp.' : $aso_code_infra['type'] = 'infra1'; $aso_code_infra['code'] = 1; $aso_code_infra['rang'] = 280; break; case 'n-subsp.' : $aso_code_infra['type'] = 'infra1'; $aso_code_infra['code'] = 2; $aso_code_infra['rang'] = 300; break; case '[subsp.]' : $aso_code_infra['type'] = 'infra1'; $aso_code_infra['code'] = 3; $aso_code_infra['rang'] = 290; break; case '[n-subsp.]' : $aso_code_infra['type'] = 'infra1'; $aso_code_infra['code'] = 4; $aso_code_infra['rang'] = 310; break; case 'var.' : $aso_code_infra['type'] = 'infra2'; $aso_code_infra['code'] = 1; $aso_code_infra['rang'] = 360; break; case '[var.]' : $aso_code_infra['type'] = 'infra2'; $aso_code_infra['code'] = 2; $aso_code_infra['rang'] = 370; break; case 'n-var.' : $aso_code_infra['type'] = 'infra2'; $aso_code_infra['code'] = 3; $aso_code_infra['rang'] = 380; break; case 'nvar.' : $aso_code_infra['type'] = 'infra2'; $aso_code_infra['code'] = 3; $aso_code_infra['rang'] = 384; break; case '[n-var.]' : $aso_code_infra['type'] = 'infra2'; $aso_code_infra['code'] = 5; $aso_code_infra['rang'] = 390; break; case 'prol.' : case 'proles' : $aso_code_infra['type'] = 'infra3'; $aso_code_infra['code'] = 2; $aso_code_infra['rang'] = 330; break; case 'n-proles' : case 'n-proles.' : $aso_code_infra['type'] = 'infra3'; $aso_code_infra['code'] = 1; $aso_code_infra['rang'] = 340; break; case 'f.': case 'fa': case 'fa.': case 'forma': $aso_code_infra['type'] = 'infra3'; $aso_code_infra['code'] = 3; $aso_code_infra['rang'] = 420; break; case 'subvar.' : $aso_code_infra['type'] = 'infra3'; $aso_code_infra['code'] = 4; $aso_code_infra['rang'] = 410; break; case 'convar.' : $aso_code_infra['type'] = 'infra3'; $aso_code_infra['code'] = 5; $aso_code_infra['rang'] = 350; break; case 'cv.': case 'Cv.': $aso_code_infra['type'] = 'infra3'; $aso_code_infra['code'] = 6; $aso_code_infra['rang'] = 460; break; case 'n-f.': case 'n-fa': case 'n-fa.': $aso_code_infra['type'] = 'infra3'; $aso_code_infra['code'] = 7; $aso_code_infra['rang'] = 430; break; case 'subf.': case 'subfa': case 'subfa.': $aso_code_infra['type'] = 'infra3'; $aso_code_infra['code'] = 8; $aso_code_infra['rang'] = 440; break; default: $aso_code_infra['erreur_mark'] = 'erreur'; $aso_code_infra['erreur_notes'] = $str_abreviation_type_infra; $aso_code_infra['rang'] = 2; } return $aso_code_infra; } public function attribuerCodeRang($str_abreviation_type_infra) { $aso_code_infra = $this->attribuerCodeInfra($str_abreviation_type_infra); return $aso_code_infra['rang']; } }