Subversion Repositories eFlore/Applications.coel

Rev

Rev 1538 | Rev 1541 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1533 jpm 1
<?php
2
/**
3
 * Classe permettant de traiter plus facilement les champs dénomarlisés de la base de données COEL.
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
 
98
	private function formaterValeurTruck($valeur) {
99
		$chaine_a_retourner = '';
100
 
101
		if (preg_match('/^[^#]+##[^$]+$/', $valeur))	{
102
			$cle_valeur = explode(self::SEPARATEUR_TYPE_VALEUR, $valeur);
103
			$chaine_a_retourner = (($cle_valeur[1] == '' || $cle_valeur[1] == 'null') ? self::VALEUR_NULL : $cle_valeur[1]);
104
			$chaine_a_retourner .= ' '.$this->formaterParenthese($cle_valeur[0]);
105
		} else if ($valeur != '')	{
106
			$chaine_a_retourner = $valeur;
107
		} else {
108
			trigger_error("Valeur truck posant problème :$valeur", E_USER_NOTICE);
109
		}
110
 
111
		return $chaine_a_retourner;
112
	}
113
 
114
	public function formaterParenthese($chaine_a_afficher) {
115
		if ($chaine_a_afficher != '') {
116
			$chaine_a_afficher = '('.$chaine_a_afficher.')';
117
		}
118
		return $chaine_a_afficher;
119
	}
120
 
121
	public static function formaterTableauDeTxt(Array $tableau_de_txt, $majuscule = true, $point_final = true) {
122
		$chaine_a_afficher = '';
123
		$taille_du_tableau = count($tableau_de_txt);
124
		if ($taille_du_tableau > 0) {
125
			$index_avt_dernier = $taille_du_tableau - 1;
126
			for ($i = 0; $i < $taille_du_tableau; $i++)	{
127
				$mot = $tableau_de_txt[$i];
128
				if ($i != $index_avt_dernier) {
129
					$chaine_a_afficher .= $mot.', ';
130
				} else {
131
					$chaine_a_afficher .= self::nettoyerPointFinal($mot);
132
					if ($point_final) {
133
						$chaine_a_afficher .= '.';
134
					}
135
				}
136
			}
137
		}
138
		if ($majuscule) {
139
			$chaine_a_afficher = ucfirst($chaine_a_afficher);
140
		}
141
		return $chaine_a_afficher;
142
	}
143
 
144
	private static function formaterAutre($chaine_a_afficher) {
145
		if ($chaine_a_afficher != '') {
146
			$chaine_a_afficher = ' [Autre : '.$chaine_a_afficher.']';
147
		}
148
		return $chaine_a_afficher;
149
	}
150
 
151
	private static function formaterOuiNon($chaine_a_formater) {
152
		$txt_a_retourner = '';
153
		if ($chaine_a_formater == '0') {
154
			$txt_a_retourner = 'non';
155
		} else if ($chaine_a_formater == '1') {
156
			$txt_a_retourner = 'oui';
157
		}
158
		return $txt_a_retourner;
159
	}
160
 
161
	private static function nettoyerPointFinal($mot) {
162
		$mot = preg_replace('/[.]$/', '', $mot);
163
		return $mot;
164
	}
165
 
166
	public function construireTxtListeOntologie($chaineAAnalyser, $valeurEstOntologie = true, $typeEstOntologie = true, $donneeEstOntologie = false) {
167
		$termes = array();
168
		$autres = array();
169
		$chaineAAnalyser = trim($chaineAAnalyser);
170
		if ($chaineAAnalyser != '') {
171
			$valeurs = explode(self::SEPARATEUR_VALEURS, $chaineAAnalyser);
172
			$nbreValeurs = count($valeurs);
173
			if ($nbreValeurs > 0)	{
174
				for ($i = 0; $i < $nbreValeurs; $i++)	{
175
					$valeur = $valeurs[$i];
176
 
177
					// VALEUR SANS TYPE
178
					// La valeur sans type est une entrée de l'ontologie
179
					if ($valeurEstOntologie && preg_match('/^[0-9]+$/u', $valeur)) {
180
						if ($valeur == '0') {
181
							$valeur = '';
182
						} else {
183
							if (isset($this->ontologie)) {
1538 jpm 184
								$valeurOntologie = $this->ontologie->getTableauValeur($valeur);
1533 jpm 185
								if (isset($valeurOntologie)) {
186
									$valeur = $valeurOntologie['nom'];
187
								}
188
							} else {
1535 jpm 189
								$e = "Veuillez définir l'ontologie à utiliser en employant la méthode setOntologie().";
1533 jpm 190
								trigger_error($e, E_USER_WARNING);
191
							}
192
						}
193
					}
194
 
195
					// VALEUR AVEC TYPE
196
					// Type : AUTRE
197
					$valeurTypeAutre = self::TYPE_AUTRE.self::SEPARATEUR_TYPE_VALEUR;
198
					if (preg_match('/^'.$valeurTypeAutre.'.+$/u', $valeur)) {
199
						$txtAutre = preg_replace('/^'.$valeurTypeAutre.'/u', '', $valeur);
200
						if ($txtAutre != '') {
201
							$autres[] = $txtAutre;
202
						}
203
						$valeur = '';
204
					}
205
					// Type correspondant à une entrée de l'ontologie
206
					if ($typeEstOntologie) {
207
						$valeurTypeOntologie = '([0-9]+)'.self::SEPARATEUR_TYPE_VALEUR;
208
						$valeurTypeAutre = '([[:alnum:]]+)'.self::SEPARATEUR_TYPE_VALEUR;
209
						if (preg_match('/^'.$valeurTypeOntologie.'.*$/u', $valeur, $match)) {// Cas type : réf. numérique
210
							$type = $match[1];
1535 jpm 211
							if (isset($this->ontologie)) {
1538 jpm 212
								$valeurOntologieNom = $this->ontologie->getNom($type);
1533 jpm 213
								if (isset($valeurOntologieNom)) {
214
									$valeurOntologieNom .= ' : ';
215
									$valeur = preg_replace('/^'.$type.'/u', $valeurOntologieNom, $valeur);
216
								}
217
							} else {
1535 jpm 218
								$e = "Veuillez définir l'ontologie à utiliser en employant la méthode setOntologie().";
1533 jpm 219
								trigger_error($e, E_USER_WARNING);
220
							}
221
						} else if (preg_match('/^'.$valeurTypeAutre.'.*$/u', $valeur, $match)) {// Cas type : AUTRE
222
							$type = $match[1];
223
							$valeur = preg_replace('/^'.$type.'/u', $type.' : ', $valeur);
224
						}
225
					}
226
					// Donnée correspondant à une entrée de l'ontologie
227
					if ($donneeEstOntologie) {
228
						$donneeOntologie = self::SEPARATEUR_TYPE_VALEUR.'([0-9]+)';
229
						if (preg_match('/^.+'.$donneeOntologie.'$/u', $valeur, $match)) {
230
							$donnee = $match[1];
231
							$donnee = str_replace(self::SEPARATEUR_TYPE_VALEUR, '', $donnee);
232
							if (isset($this->ontologie)) {
1538 jpm 233
								$valeurOntologieNom = $this->ontologie->getNom($donnee);
1533 jpm 234
								if (isset($valeurOntologieNom)) {
235
									$valeur = preg_replace('/'.$donnee.'$/u', $valeurOntologieNom, $valeur);
236
								}
237
							} else {
1535 jpm 238
								$e = "Veuillez définir l'ontologie à utiliser en employant la méthode setOntologie().";
1533 jpm 239
								trigger_error($e, E_USER_WARNING);
240
							}
241
						}
242
					}
243
 
244
					// Nettoyage final
245
					$valeur = preg_replace('/'.self::SEPARATEUR_TYPE_VALEUR.'/', '', $valeur);
246
 
247
					if ($valeur != '') {
248
						$termes[] = $valeur;
249
					}
250
				}
251
			}
252
		}
253
 
254
		$chaineTermes = self::formaterTableauDeTxt($termes);
255
		$chaineAutres = self::formaterTableauDeTxt($autres);
256
		$chaineARetourner = $chaineTermes.self::formaterAutre($chaineAutres);
257
 
258
		return $chaineARetourner;
259
	}
1540 jpm 260
 
261
	public static function extraireNbrePart($truk_unite_base) {
262
		$types = explode(self::SEPARATEUR_VALEURS, $truk_unite_base);
263
		$nbre = 0;
264
		foreach ($types as $type) {
265
			$unite_base = explode(self::SEPARATEUR_TYPE_VALEUR, $type);
266
			$unite_base_info = explode('||', $unite_base[1]);
267
			$nbre_part = $unite_base_info[3];
268
			$nbre += $nbre_part;
269
		}
270
		return $nbre;
271
	}
1533 jpm 272
}