Rev 876 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/*fork temporaire de cel/jrest/lib/RechercheInfosTaxonBeta.php[php-5.4 & co]*/require_once('/home/raphael/cel/jrest/lib/Cel.php');// require_once('/home/raphael/cel/jrest/lib/RechercheInfosTaxonBeta.php');require_once('/home/raphael/cel/jrest/lib/NameParser.php');class RechercheInfosTaxonBeta {static function getSpaceNoAfter($nom_saisi, $pattern, $offset) {if( ($q = strpos($nom_saisi, $pattern, max(0, $offset))) ) {// position du premier espace après $pattern,// ou position de fin de $pattern autrementif(! ($r = strpos($nom_saisi, ' ', $offset + strlen($pattern))) )return $offset + strlen($pattern);return $r;}return FALSE;}static function supprimerAuteurBis($nom_saisi, &$auteur = null) {$strip_pos = 600;$before = 600;$after = 0;// temp var$p = $q = NULL;if(strpos($nom_saisi, ' ') === FALSE) return FALSE; // pas d'espace, pas de nom d'auteur// si "(", break après "Gp)" si présent, sinon, avant "("if( ($p = strpos($nom_saisi, ' Gp)')) ) {$after = $p + 4;goto sendAuthor;}// si ".":if( ($p = strpos($nom_saisi, '.')) ) {// " f. "/* SELECT nom_sci, LOCATE(' ', SUBSTRING_INDEX(nom_sci, ' f. ', -1)) AS space_posFROM tb_eflore.bdtfx_v1_02 WHERE nom_sci LIKE '% f. %' HAVING space_pos > 0; */// f. suivi de 1 mot sauf, "Rosa pomifera f. x longicruris" (2)/*if( ($q = strpos($nom_saisi, ' f. ', $p - 2)) ) {$after = max($after, strpos($nom_saisi, ' ', $q + 4)); // premier espace après ' f. '}*/$after = max($after, self::getSpaceNoAfter($nom_saisi, ' f. ', $p - 2));// " var. "// var. n'est pas un repère vraiment adéquat, on sait juste qu'il fait partie du nom sci// $after = min($strip_pos, strpos($nom_saisi, ' var. '));$after = max($after, self::getSpaceNoAfter($nom_saisi, ' var. ', $p - 4));// " subsp. "// après subsp.: le plus souvent un ' x ', donc pas vraiment de règle (1 ou 2 mots)$after = max($after, self::getSpaceNoAfter($nom_saisi, ' subsp. ', $p - 6));// AUTEUR "."// autrement, avant un "." dans la partie auteur, il peut y avoir entre 1 et 7 mots à gauche// grep -o '^[^.]*\.' liste-auteur.txt|while read f; do grep -o ' '<<<"$f"|wc -l; done|sort -n|tail -1if(!$after) { // si le "." rencontré n'est pas l'un du "nom_sci", c'est de "auteur"$before = min($before, $p);}}if( ($p = strpos($nom_saisi, ' x ')) ) {$after = max($after, strpos($nom_saisi, ' x ', $p + 3));}// " (L.)" et " L."if( ($p = strpos($nom_saisi, ' (L.)')) ) {$before = min($before, $p);}// note: on supprime le " L." en amont// if( ($p = strpos($nom_saisi, ' L.')) ) $before = min($before, $p);// "(" et ")", uniquement dans nom_sci dans le cadre de " Gp)", autrement: auteur// XXX: ce cas englobe " (L.)"if( ($p = strpos($nom_saisi, '(')) ) {$before = min($before, $p);}// TODO: gérer le " sp." [taxon supérieur], pour l'instant return FALSEif( ($p = strpos($nom_saisi, ' sp.')) ) {return FALSE;}// TODO: idemif( ($p = strpos($nom_saisi, ' sp ')) ) {return FALSE;}// si "&": auteur, et entre 1 et 10 mots à gauche// grep -o '^[^&]*&' liste-auteur.txt|while read f; do grep -o ' '<<<"$f"|wc -l; done|sort -n|tail -1// si ",": auteur, et entre 1 et 5 mots à gauche// grep -o '^[^,]*,' liste-auteur.txt|while read f; do grep -o ' '<<<"$f"|wc -l; done|sort -n|tail -1// TRIM auteurs:// sed -e 's/[()]//g' liste-auteur.txt|awk '{print $1}'|sed -e 's/[ .,]*$//g'|awk '{print $1}'|sed -r '/^.{0,3}$/d'|sort -u|wc -lsendAuthor:$x = self::contientAuteur($nom_saisi, $after, $auteur);if($x) {$n = substr($nom_saisi, 0, min($before, strpos($nom_saisi, $auteur[1])));$auteur = trim(substr($nom_saisi, strlen($n)));return trim($n, " \t\n\r\0\x0B(),.&");}return FALSE;}static function contientAuteur($nom_saisi, $start, &$auteur = NULL) {static $auteurs;// XXX: PHP-5.3// $auteurs = file_get_contents(dirname(__FILE__) . "/../static/auteurs-bdtfx.min.txt");$auteurs = file_get_contents(__DIR__ . "/auteurs-bdtfx.min.txt") or die('no file: auteurs-bdtfx.min.txt');return preg_match('^\s(' . $auteurs . ')^S', $nom_saisi, $auteur, 0, $start);}static function supprimerAuteur($nom_saisi, &$auteur = null) {// TODO: gérer les hybridesif(self::estUnHybride($nom_saisi) || self::estUneFormuleHybridite($nom_saisi)) {$nom_decoupe = explode(' ', $nom_saisi);$derniere_position_hybride = end(array_keys($nom_decoupe, 'x'));$nom_saisi_sans_auteur = implode(' ',array_slice($nom_decoupe, 0, $derniere_position_hybride + 2));/*var_dump($nom_saisi, $nom_decoupe, $derniere_position_hybride, $nom_saisi_sans_auteur);if($auteur != NULL) {$c = strpos($nom_saisi, ' x ');$auteur = substr($nom_saisi, $c + 3);return substr($nom_saisi, 0, $c);}var_dump(substr($nom_saisi, 0, strpos($nom_saisi, ' x ')));echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n";*/} else {/* Attention le parseur de nom n'est pas fiable à 100%mais ça marche dans la plupart des casà part les formules d'hybridité saisies avec un auteur */$nameparser = new NameParser();$auteur = $nameparser->parse_auth($nom_saisi);$nom_saisi_sans_auteur = str_replace($auteur, '', $nom_saisi);}return trim($nom_saisi_sans_auteur);}static function estUneFormuleHybridite($nom_saisi) {return strpos($nom_saisi,' x ') !== false;}static function estUnHybride($nom_saisi) {return strpos($nom_saisi,'x ') === 0;}}