Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 876 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
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
}