Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 880 | 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 autrement
                        if(! ($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_pos
                           FROM 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 -1
                        if(!$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 FALSE
                if( ($p = strpos($nom_saisi, ' sp.')) ) {
                        return FALSE;
                }
                // TODO: idem
                if( ($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 -l

        sendAuthor:
                $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 hybrides
                if(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;
        }
}