New file |
0,0 → 1,165 |
<?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; |
} |
} |