Rev 880 | Go to most recent revision | 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;
}
}