876 |
raphael |
1 |
<?php
|
|
|
2 |
/*
|
|
|
3 |
fork temporaire de cel/jrest/lib/RechercheInfosTaxonBeta.php
|
|
|
4 |
[php-5.4 & co]
|
|
|
5 |
*/
|
|
|
6 |
|
|
|
7 |
require_once('/home/raphael/cel/jrest/lib/Cel.php');
|
|
|
8 |
// require_once('/home/raphael/cel/jrest/lib/RechercheInfosTaxonBeta.php');
|
|
|
9 |
require_once('/home/raphael/cel/jrest/lib/NameParser.php');
|
|
|
10 |
|
|
|
11 |
class RechercheInfosTaxonBeta {
|
|
|
12 |
static function getSpaceNoAfter($nom_saisi, $pattern, $offset) {
|
|
|
13 |
if( ($q = strpos($nom_saisi, $pattern, max(0, $offset))) ) {
|
|
|
14 |
// position du premier espace après $pattern,
|
|
|
15 |
// ou position de fin de $pattern autrement
|
|
|
16 |
if(! ($r = strpos($nom_saisi, ' ', $offset + strlen($pattern))) )
|
|
|
17 |
return $offset + strlen($pattern);
|
|
|
18 |
return $r;
|
|
|
19 |
}
|
|
|
20 |
return FALSE;
|
|
|
21 |
}
|
|
|
22 |
|
|
|
23 |
static function supprimerAuteurBis($nom_saisi, &$auteur = null) {
|
|
|
24 |
$strip_pos = 600;
|
|
|
25 |
|
|
|
26 |
$before = 600;
|
|
|
27 |
$after = 0;
|
|
|
28 |
// temp var
|
|
|
29 |
$p = $q = NULL;
|
|
|
30 |
|
|
|
31 |
if(strpos($nom_saisi, ' ') === FALSE) return FALSE; // pas d'espace, pas de nom d'auteur
|
|
|
32 |
|
|
|
33 |
// si "(", break après "Gp)" si présent, sinon, avant "("
|
|
|
34 |
if( ($p = strpos($nom_saisi, ' Gp)')) ) {
|
|
|
35 |
$after = $p + 4;
|
|
|
36 |
goto sendAuthor;
|
|
|
37 |
}
|
|
|
38 |
|
|
|
39 |
|
|
|
40 |
// si ".":
|
|
|
41 |
if( ($p = strpos($nom_saisi, '.')) ) {
|
|
|
42 |
// " f. "
|
|
|
43 |
|
|
|
44 |
/* SELECT nom_sci, LOCATE(' ', SUBSTRING_INDEX(nom_sci, ' f. ', -1)) AS space_pos
|
|
|
45 |
FROM tb_eflore.bdtfx_v1_02 WHERE nom_sci LIKE '% f. %' HAVING space_pos > 0; */
|
|
|
46 |
// f. suivi de 1 mot sauf, "Rosa pomifera f. x longicruris" (2)
|
|
|
47 |
/*if( ($q = strpos($nom_saisi, ' f. ', $p - 2)) ) {
|
|
|
48 |
$after = max($after, strpos($nom_saisi, ' ', $q + 4)); // premier espace après ' f. '
|
|
|
49 |
}*/
|
|
|
50 |
$after = max($after, self::getSpaceNoAfter($nom_saisi, ' f. ', $p - 2));
|
|
|
51 |
|
|
|
52 |
// " var. "
|
|
|
53 |
// var. n'est pas un repère vraiment adéquat, on sait juste qu'il fait partie du nom sci
|
|
|
54 |
// $after = min($strip_pos, strpos($nom_saisi, ' var. '));
|
|
|
55 |
$after = max($after, self::getSpaceNoAfter($nom_saisi, ' var. ', $p - 4));
|
|
|
56 |
|
|
|
57 |
// " subsp. "
|
|
|
58 |
// après subsp.: le plus souvent un ' x ', donc pas vraiment de règle (1 ou 2 mots)
|
|
|
59 |
$after = max($after, self::getSpaceNoAfter($nom_saisi, ' subsp. ', $p - 6));
|
|
|
60 |
|
|
|
61 |
// AUTEUR "."
|
|
|
62 |
// autrement, avant un "." dans la partie auteur, il peut y avoir entre 1 et 7 mots à gauche
|
|
|
63 |
// grep -o '^[^.]*\.' liste-auteur.txt|while read f; do grep -o ' '<<<"$f"|wc -l; done|sort -n|tail -1
|
|
|
64 |
if(!$after) { // si le "." rencontré n'est pas l'un du "nom_sci", c'est de "auteur"
|
|
|
65 |
$before = min($before, $p);
|
|
|
66 |
}
|
|
|
67 |
|
|
|
68 |
}
|
|
|
69 |
|
|
|
70 |
|
|
|
71 |
if( ($p = strpos($nom_saisi, ' x ')) ) {
|
|
|
72 |
$after = max($after, strpos($nom_saisi, ' x ', $p + 3));
|
|
|
73 |
}
|
|
|
74 |
|
|
|
75 |
// " (L.)" et " L."
|
|
|
76 |
if( ($p = strpos($nom_saisi, ' (L.)')) ) {
|
|
|
77 |
$before = min($before, $p);
|
|
|
78 |
}
|
|
|
79 |
|
|
|
80 |
// note: on supprime le " L." en amont
|
|
|
81 |
// if( ($p = strpos($nom_saisi, ' L.')) ) $before = min($before, $p);
|
|
|
82 |
|
|
|
83 |
|
|
|
84 |
|
|
|
85 |
// "(" et ")", uniquement dans nom_sci dans le cadre de " Gp)", autrement: auteur
|
|
|
86 |
// XXX: ce cas englobe " (L.)"
|
|
|
87 |
if( ($p = strpos($nom_saisi, '(')) ) {
|
|
|
88 |
$before = min($before, $p);
|
|
|
89 |
}
|
|
|
90 |
|
|
|
91 |
|
|
|
92 |
// TODO: gérer le " sp." [taxon supérieur], pour l'instant return FALSE
|
|
|
93 |
if( ($p = strpos($nom_saisi, ' sp.')) ) {
|
|
|
94 |
return FALSE;
|
|
|
95 |
}
|
|
|
96 |
// TODO: idem
|
|
|
97 |
if( ($p = strpos($nom_saisi, ' sp ')) ) {
|
|
|
98 |
return FALSE;
|
|
|
99 |
}
|
|
|
100 |
|
|
|
101 |
// si "&": auteur, et entre 1 et 10 mots à gauche
|
|
|
102 |
// grep -o '^[^&]*&' liste-auteur.txt|while read f; do grep -o ' '<<<"$f"|wc -l; done|sort -n|tail -1
|
|
|
103 |
|
|
|
104 |
// si ",": auteur, et entre 1 et 5 mots à gauche
|
|
|
105 |
// grep -o '^[^,]*,' liste-auteur.txt|while read f; do grep -o ' '<<<"$f"|wc -l; done|sort -n|tail -1
|
|
|
106 |
|
|
|
107 |
// TRIM auteurs:
|
|
|
108 |
// 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
|
|
|
109 |
|
|
|
110 |
sendAuthor:
|
|
|
111 |
$x = self::contientAuteur($nom_saisi, $after, $auteur);
|
|
|
112 |
if($x) {
|
|
|
113 |
$n = substr($nom_saisi, 0, min($before, strpos($nom_saisi, $auteur[1])));
|
|
|
114 |
$auteur = trim(substr($nom_saisi, strlen($n)));
|
|
|
115 |
return trim($n, " \t\n\r\0\x0B(),.&");
|
|
|
116 |
}
|
|
|
117 |
return FALSE;
|
|
|
118 |
}
|
|
|
119 |
|
|
|
120 |
static function contientAuteur($nom_saisi, $start, &$auteur = NULL) {
|
|
|
121 |
static $auteurs;
|
|
|
122 |
// XXX: PHP-5.3
|
|
|
123 |
// $auteurs = file_get_contents(dirname(__FILE__) . "/../static/auteurs-bdtfx.min.txt");
|
|
|
124 |
$auteurs = file_get_contents(__DIR__ . "/auteurs-bdtfx.min.txt") or die('no file: auteurs-bdtfx.min.txt');
|
|
|
125 |
return preg_match('^\s(' . $auteurs . ')^S', $nom_saisi, $auteur, 0, $start);
|
|
|
126 |
}
|
|
|
127 |
|
|
|
128 |
|
|
|
129 |
static function supprimerAuteur($nom_saisi, &$auteur = null) {
|
|
|
130 |
// TODO: gérer les hybrides
|
|
|
131 |
if(self::estUnHybride($nom_saisi) || self::estUneFormuleHybridite($nom_saisi)) {
|
|
|
132 |
|
|
|
133 |
$nom_decoupe = explode(' ', $nom_saisi);
|
|
|
134 |
$derniere_position_hybride = end(array_keys($nom_decoupe, 'x'));
|
|
|
135 |
$nom_saisi_sans_auteur = implode(' ',array_slice($nom_decoupe, 0, $derniere_position_hybride + 2));
|
|
|
136 |
|
|
|
137 |
/*
|
|
|
138 |
var_dump($nom_saisi, $nom_decoupe, $derniere_position_hybride, $nom_saisi_sans_auteur);
|
|
|
139 |
if($auteur != NULL) {
|
|
|
140 |
$c = strpos($nom_saisi, ' x ');
|
|
|
141 |
$auteur = substr($nom_saisi, $c + 3);
|
|
|
142 |
return substr($nom_saisi, 0, $c);
|
|
|
143 |
}
|
|
|
144 |
var_dump(substr($nom_saisi, 0, strpos($nom_saisi, ' x ')));
|
|
|
145 |
echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n";*/
|
|
|
146 |
} else {
|
|
|
147 |
/* Attention le parseur de nom n'est pas fiable à 100%
|
|
|
148 |
mais ça marche dans la plupart des cas
|
|
|
149 |
à part les formules d'hybridité saisies avec un auteur */
|
|
|
150 |
$nameparser = new NameParser();
|
|
|
151 |
$auteur = $nameparser->parse_auth($nom_saisi);
|
|
|
152 |
$nom_saisi_sans_auteur = str_replace($auteur, '', $nom_saisi);
|
|
|
153 |
}
|
|
|
154 |
|
|
|
155 |
return trim($nom_saisi_sans_auteur);
|
|
|
156 |
}
|
|
|
157 |
|
|
|
158 |
static function estUneFormuleHybridite($nom_saisi) {
|
|
|
159 |
return strpos($nom_saisi,' x ') !== false;
|
|
|
160 |
}
|
|
|
161 |
|
|
|
162 |
static function estUnHybride($nom_saisi) {
|
|
|
163 |
return strpos($nom_saisi,'x ') === 0;
|
|
|
164 |
}
|
|
|
165 |
}
|