Subversion Repositories eFlore/Applications.coel

Rev

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

Rev Author Line No. Line
1533 jpm 1
<?php
2
/**
1829 mathias 3
 * Classe permettant de traiter plus facilement les champs dégueulasses de la base de données COEL.
1533 jpm 4
 *
5
 * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
6
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
7
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
8
 * @version $Id$
9
 * @copyright 2010
10
 */
11
class UtilTruck {
12
	const TYPE_AUTRE = 'AUTRE';
13
	const TYPE_TOTAL = 'TOTAL';
14
	const SEPARATEUR_TYPE_VALEUR = '##';
15
	const SEPARATEUR_VALEURS = ';;';
16
	const SEPARATEUR_DONNEES = '||';
17
	const VALEUR_NULL = 'NC';
18
 
19
	private $ontologie = null;
20
 
1538 jpm 21
	public function __construct(Ontologie $ontologie = null) {
1533 jpm 22
		$this->setOntologie($ontologie);
23
	}
24
 
1535 jpm 25
	public function setOntologie(Ontologie $ontologie) {
1533 jpm 26
		$this->ontologie = $ontologie;
27
	}
28
 
29
	public function construireTxtTruckSimple($chaine_a_analyser) {
30
		return $this->construireTxtTruck($chaine_a_analyser, false, false);
31
	}
32
 
33
	public static function construireTxtTruckSansMajuscule($chaine_a_analyser) {
34
		return $this->construireTxtTruck($chaine_a_analyser, false, true);
35
	}
36
 
37
	public function construireTxtTruckSansPointFinal($chaine_a_analyser) {
38
		return $this->construireTxtTruck($chaine_a_analyser, true, false);
39
	}
40
 
41
	private function construireTxtTruck($chaine_a_analyser, $majuscule = true, $point_final = true) {
42
		$termes = $this->traiterTxtTruck($chaine_a_analyser);
43
		$chaine_a_retourner = self::formaterTableauDeTxt($termes, $majuscule, $point_final);
44
		return $chaine_a_retourner;
45
	}
46
 
47
	public function traiterTxtTruck($chaine_a_analyser) {
48
		$termes = array();
49
		if ((!is_null($chaine_a_analyser)) && (trim($chaine_a_analyser) != ''))	{
50
			$valeurs = explode(self::SEPARATEUR_VALEURS, $chaine_a_analyser);
51
			$nbre_valeurs = count($valeurs);
52
			if ($nbre_valeurs > 0) {
53
				for ($i = 0; $i < $nbre_valeurs; $i++)	{
54
					$valeur = trim($valeurs[$i]);
55
					if ($valeur != '') {
56
						$valeur_formatee = $this->formaterValeurTruck($valeur);
57
						$termes[] = $valeur_formatee;
58
					}
59
				}
60
			}
61
		}
62
		return $termes;
63
	}
64
 
65
	public function getTxtTruckParPosition($chaine_a_analyser, $position = 1) {
66
		$retour = '';
67
		if ((!is_null($chaine_a_analyser)) && (trim($chaine_a_analyser) != ''))	{
68
			$valeurs = explode(self::SEPARATEUR_VALEURS, $chaine_a_analyser);
69
			$nbre_valeurs = count($valeurs);
70
			if ($nbre_valeurs > 0) {
71
				$position = $position - 1;
72
				$valeur = trim($valeurs[$position]);
73
				if ($valeur != '') {
74
					$retour = $this->formaterValeurTruck($valeur);
75
				}
76
			}
77
		}
78
		return $retour;
79
	}
80
 
81
	public function getTableauTruck($chaine_a_analyser) {
82
		$tableau_retour = array();
83
		if ((!is_null($chaine_a_analyser)) && (trim($chaine_a_analyser) != ''))	{
84
			$valeurs = explode(self::SEPARATEUR_VALEURS, $chaine_a_analyser);
85
			$nbre_valeurs = count($valeurs);
86
			if ($nbre_valeurs > 0) {
87
				for ($i = 0; $i < $nbre_valeurs; $i++)	{
88
					$valeur = trim($valeurs[$i]);
89
					if ($valeur != '') {
90
						$tableau_retour[] = $valeur;
91
					}
92
				}
93
			}
94
		}
95
		return $tableau_retour;
96
	}
97
 
1541 jpm 98
	public function getNbreValeur($chaine_a_analyser) {
99
		$nbre_valeurs = null;
100
		if ((!is_null($chaine_a_analyser)) && (trim($chaine_a_analyser) != ''))	{
101
			$valeurs = explode(self::SEPARATEUR_VALEURS, $chaine_a_analyser);
102
			$nbre_valeurs = count($valeurs);
103
		}
104
		return $nbre_valeurs;
105
	}
106
 
1533 jpm 107
	private function formaterValeurTruck($valeur) {
108
		$chaine_a_retourner = '';
109
 
110
		if (preg_match('/^[^#]+##[^$]+$/', $valeur))	{
111
			$cle_valeur = explode(self::SEPARATEUR_TYPE_VALEUR, $valeur);
112
			$chaine_a_retourner = (($cle_valeur[1] == '' || $cle_valeur[1] == 'null') ? self::VALEUR_NULL : $cle_valeur[1]);
113
			$chaine_a_retourner .= ' '.$this->formaterParenthese($cle_valeur[0]);
114
		} else if ($valeur != '')	{
115
			$chaine_a_retourner = $valeur;
116
		} else {
117
			trigger_error("Valeur truck posant problème :$valeur", E_USER_NOTICE);
118
		}
119
 
120
		return $chaine_a_retourner;
121
	}
122
 
123
	public function formaterParenthese($chaine_a_afficher) {
124
		if ($chaine_a_afficher != '') {
125
			$chaine_a_afficher = '('.$chaine_a_afficher.')';
126
		}
127
		return $chaine_a_afficher;
128
	}
129
 
130
	public static function formaterTableauDeTxt(Array $tableau_de_txt, $majuscule = true, $point_final = true) {
131
		$chaine_a_afficher = '';
132
		$taille_du_tableau = count($tableau_de_txt);
133
		if ($taille_du_tableau > 0) {
134
			$index_avt_dernier = $taille_du_tableau - 1;
135
			for ($i = 0; $i < $taille_du_tableau; $i++)	{
136
				$mot = $tableau_de_txt[$i];
137
				if ($i != $index_avt_dernier) {
138
					$chaine_a_afficher .= $mot.', ';
139
				} else {
140
					$chaine_a_afficher .= self::nettoyerPointFinal($mot);
141
					if ($point_final) {
142
						$chaine_a_afficher .= '.';
143
					}
144
				}
145
			}
146
		}
147
		if ($majuscule) {
148
			$chaine_a_afficher = ucfirst($chaine_a_afficher);
149
		}
150
		return $chaine_a_afficher;
151
	}
152
 
153
	private static function formaterAutre($chaine_a_afficher) {
154
		if ($chaine_a_afficher != '') {
155
			$chaine_a_afficher = ' [Autre : '.$chaine_a_afficher.']';
156
		}
157
		return $chaine_a_afficher;
158
	}
159
 
160
	private static function formaterOuiNon($chaine_a_formater) {
161
		$txt_a_retourner = '';
162
		if ($chaine_a_formater == '0') {
163
			$txt_a_retourner = 'non';
164
		} else if ($chaine_a_formater == '1') {
165
			$txt_a_retourner = 'oui';
166
		}
167
		return $txt_a_retourner;
168
	}
169
 
170
	private static function nettoyerPointFinal($mot) {
171
		$mot = preg_replace('/[.]$/', '', $mot);
172
		return $mot;
173
	}
174
 
175
	public function construireTxtListeOntologie($chaineAAnalyser, $valeurEstOntologie = true, $typeEstOntologie = true, $donneeEstOntologie = false) {
176
		$termes = array();
177
		$autres = array();
178
		$chaineAAnalyser = trim($chaineAAnalyser);
179
		if ($chaineAAnalyser != '') {
180
			$valeurs = explode(self::SEPARATEUR_VALEURS, $chaineAAnalyser);
181
			$nbreValeurs = count($valeurs);
182
			if ($nbreValeurs > 0)	{
183
				for ($i = 0; $i < $nbreValeurs; $i++)	{
184
					$valeur = $valeurs[$i];
185
 
186
					// VALEUR SANS TYPE
187
					// La valeur sans type est une entrée de l'ontologie
188
					if ($valeurEstOntologie && preg_match('/^[0-9]+$/u', $valeur)) {
189
						if ($valeur == '0') {
190
							$valeur = '';
191
						} else {
192
							if (isset($this->ontologie)) {
1538 jpm 193
								$valeurOntologie = $this->ontologie->getTableauValeur($valeur);
1533 jpm 194
								if (isset($valeurOntologie)) {
195
									$valeur = $valeurOntologie['nom'];
196
								}
197
							} else {
1535 jpm 198
								$e = "Veuillez définir l'ontologie à utiliser en employant la méthode setOntologie().";
1533 jpm 199
								trigger_error($e, E_USER_WARNING);
200
							}
201
						}
202
					}
203
 
204
					// VALEUR AVEC TYPE
205
					// Type : AUTRE
206
					$valeurTypeAutre = self::TYPE_AUTRE.self::SEPARATEUR_TYPE_VALEUR;
207
					if (preg_match('/^'.$valeurTypeAutre.'.+$/u', $valeur)) {
208
						$txtAutre = preg_replace('/^'.$valeurTypeAutre.'/u', '', $valeur);
209
						if ($txtAutre != '') {
210
							$autres[] = $txtAutre;
211
						}
212
						$valeur = '';
213
					}
214
					// Type correspondant à une entrée de l'ontologie
215
					if ($typeEstOntologie) {
216
						$valeurTypeOntologie = '([0-9]+)'.self::SEPARATEUR_TYPE_VALEUR;
217
						$valeurTypeAutre = '([[:alnum:]]+)'.self::SEPARATEUR_TYPE_VALEUR;
218
						if (preg_match('/^'.$valeurTypeOntologie.'.*$/u', $valeur, $match)) {// Cas type : réf. numérique
219
							$type = $match[1];
1535 jpm 220
							if (isset($this->ontologie)) {
1538 jpm 221
								$valeurOntologieNom = $this->ontologie->getNom($type);
1533 jpm 222
								if (isset($valeurOntologieNom)) {
223
									$valeurOntologieNom .= ' : ';
224
									$valeur = preg_replace('/^'.$type.'/u', $valeurOntologieNom, $valeur);
225
								}
226
							} else {
1535 jpm 227
								$e = "Veuillez définir l'ontologie à utiliser en employant la méthode setOntologie().";
1533 jpm 228
								trigger_error($e, E_USER_WARNING);
229
							}
230
						} else if (preg_match('/^'.$valeurTypeAutre.'.*$/u', $valeur, $match)) {// Cas type : AUTRE
231
							$type = $match[1];
232
							$valeur = preg_replace('/^'.$type.'/u', $type.' : ', $valeur);
233
						}
234
					}
235
					// Donnée correspondant à une entrée de l'ontologie
236
					if ($donneeEstOntologie) {
237
						$donneeOntologie = self::SEPARATEUR_TYPE_VALEUR.'([0-9]+)';
238
						if (preg_match('/^.+'.$donneeOntologie.'$/u', $valeur, $match)) {
239
							$donnee = $match[1];
240
							$donnee = str_replace(self::SEPARATEUR_TYPE_VALEUR, '', $donnee);
241
							if (isset($this->ontologie)) {
1538 jpm 242
								$valeurOntologieNom = $this->ontologie->getNom($donnee);
1533 jpm 243
								if (isset($valeurOntologieNom)) {
244
									$valeur = preg_replace('/'.$donnee.'$/u', $valeurOntologieNom, $valeur);
245
								}
246
							} else {
1535 jpm 247
								$e = "Veuillez définir l'ontologie à utiliser en employant la méthode setOntologie().";
1533 jpm 248
								trigger_error($e, E_USER_WARNING);
249
							}
250
						}
251
					}
252
 
253
					// Nettoyage final
254
					$valeur = preg_replace('/'.self::SEPARATEUR_TYPE_VALEUR.'/', '', $valeur);
255
 
256
					if ($valeur != '') {
257
						$termes[] = $valeur;
258
					}
259
				}
260
			}
261
		}
262
 
263
		$chaineTermes = self::formaterTableauDeTxt($termes);
264
		$chaineAutres = self::formaterTableauDeTxt($autres);
265
		$chaineARetourner = $chaineTermes.self::formaterAutre($chaineAutres);
266
 
267
		return $chaineARetourner;
268
	}
1540 jpm 269
 
270
	public static function extraireNbrePart($truk_unite_base) {
271
		$types = explode(self::SEPARATEUR_VALEURS, $truk_unite_base);
272
		$nbre = 0;
273
		foreach ($types as $type) {
274
			$unite_base = explode(self::SEPARATEUR_TYPE_VALEUR, $type);
1829 mathias 275
			$nbre_part = 0;
276
			if (isset($unite_base[1])) {
277
				$unite_base_info = explode('||', $unite_base[1]);
278
				$nbre_part = $unite_base_info[3];
279
			}
1540 jpm 280
			$nbre += $nbre_part;
281
		}
282
		return $nbre;
283
	}
1533 jpm 284
}