Completed
Push — master ( 2d83ae...c3f096 )
by cam
55s
created
ecrire/src/Compilateur/Iterateur/Data.php 2 patches
Indentation   +491 added lines, -491 removed lines patch added patch discarded remove patch
@@ -12,499 +12,499 @@
 block discarded – undo
12 12
  */
13 13
 class Data extends AbstractIterateur implements Iterator
14 14
 {
15
-	/** Tableau de données */
16
-	protected array $tableau = [];
17
-
18
-	/**
19
-	 * Conditions de filtrage
20
-	 * ie criteres de selection
21
-	 */
22
-	protected array $filtre = [];
23
-
24
-	/**
25
-	 * Cle courante
26
-	 *
27
-	 * @var scalar
28
-	 */
29
-	protected $cle = null;
30
-
31
-	/**
32
-	 * Valeur courante
33
-	 *
34
-	 * @var mixed
35
-	 */
36
-	protected $valeur = null;
37
-
38
-	/**
39
-	 * Constructeur
40
-	 *
41
-	 * @param  $command
42
-	 * @param array $info
43
-	 */
44
-	public function __construct(array $command, array $info = []) {
45
-		$this->type = 'DATA';
46
-		$this->command = $command;
47
-		$this->info = $info;
48
-
49
-		$this->select($command);
50
-	}
51
-
52
-	/**
53
-	 * Revenir au depart
54
-	 *
55
-	 * @return void
56
-	 */
57
-	public function rewind(): void {
58
-		reset($this->tableau);
59
-		$this->cle = array_key_first($this->tableau);
60
-		$this->valeur = current($this->tableau);
61
-		next($this->tableau);
62
-	}
63
-
64
-	/**
65
-	 * Déclarer les critères exceptions
66
-	 *
67
-	 * @return array
68
-	 */
69
-	public function exception_des_criteres() {
70
-		return ['tableau'];
71
-	}
72
-
73
-	/**
74
-	 * Récupérer depuis le cache si possible
75
-	 *
76
-	 * @param string $cle
77
-	 * @return mixed
78
-	 */
79
-	protected function cache_get($cle) {
80
-		if (!$cle) {
81
-			return;
82
-		}
83
-		# utiliser memoization si dispo
84
-		if (!function_exists('cache_get')) {
85
-			return;
86
-		}
87
-
88
-		return cache_get($cle);
89
-	}
90
-
91
-	/**
92
-	 * Stocker en cache si possible
93
-	 *
94
-	 * @param string $cle
95
-	 * @param int $ttl
96
-	 * @param null|mixed $valeur
97
-	 * @return bool
98
-	 */
99
-	protected function cache_set($cle, $ttl, $valeur = null) {
100
-		if (!$cle) {
101
-			return;
102
-		}
103
-		if (is_null($valeur)) {
104
-			$valeur = $this->tableau;
105
-		}
106
-		# utiliser memoization si dispo
107
-		if (!function_exists('cache_set')) {
108
-			return;
109
-		}
110
-
111
-		return cache_set(
112
-			$cle,
113
-			[
114
-				'data' => $valeur,
115
-				'time' => time(),
116
-				'ttl' => $ttl
117
-			],
118
-			3600 + $ttl
119
-		);
120
-		# conserver le cache 1h de plus que la validite demandee,
121
-		# pour le cas ou le serveur distant ne reponde plus
122
-	}
123
-
124
-	/**
125
-	 * Aller chercher les données de la boucle DATA
126
-	 *
127
-	 * @throws Exception
128
-	 * @param array $command
129
-	 * @return void
130
-	 */
131
-	protected function select($command) {
132
-
133
-		// l'iterateur DATA peut etre appele en passant (data:type)
134
-		// le type se retrouve dans la commande 'from'
135
-		// dans ce cas la le critere {source}, si present, n'a pas besoin du 1er argument
136
-		if (isset($this->command['from'][0])) {
137
-			if (isset($this->command['source']) and is_array($this->command['source'])) {
138
-				array_unshift($this->command['source'], $this->command['sourcemode']);
139
-			}
140
-			$this->command['sourcemode'] = $this->command['from'][0];
141
-		}
142
-
143
-		// cherchons differents moyens de creer le tableau de donnees
144
-		// les commandes connues pour l'iterateur DATA
145
-		// sont : {tableau #ARRAY} ; {cle=...} ; {valeur=...}
146
-
147
-		// {source format, [URL], [arg2]...}
148
-		if (
149
-			isset($this->command['source'])
150
-			and isset($this->command['sourcemode'])
151
-		) {
152
-			$this->select_source();
153
-		}
154
-
155
-		// Critere {liste X1, X2, X3}
156
-		if (isset($this->command['liste'])) {
157
-			$this->select_liste();
158
-		}
159
-		if (isset($this->command['enum'])) {
160
-			$this->select_enum();
161
-		}
162
-
163
-		// Si a ce stade on n'a pas de table, il y a un bug
164
-		if (!is_array($this->tableau)) {
165
-			$this->err = true;
166
-			spip_log('erreur datasource ' . var_export($command, true));
167
-		}
168
-
169
-		// {datapath query.results}
170
-		// extraire le chemin "query.results" du tableau de donnees
171
-		if (
172
-			!$this->err
173
-			and isset($this->command['datapath'])
174
-			and is_array($this->command['datapath'])
175
-		) {
176
-			$this->select_datapath();
177
-		}
178
-
179
-		// tri {par x}
180
-		if ($this->command['orderby']) {
181
-			$this->select_orderby();
182
-		}
183
-
184
-		// grouper les resultats {fusion /x/y/z} ;
185
-		if ($this->command['groupby']) {
186
-			$this->select_groupby();
187
-		}
188
-
189
-		$this->rewind();
190
-		#var_dump($this->tableau);
191
-	}
192
-
193
-
194
-	/**
195
-	 * Aller chercher les donnees de la boucle DATA
196
-	 * depuis une source
197
-	 * {source format, [URL], [arg2]...}
198
-	 */
199
-	protected function select_source() {
200
-		# un peu crado : avant de charger le cache il faut charger
201
-		# les class indispensables, sinon PHP ne saura pas gerer
202
-		# l'objet en cache ; cf plugins/icalendar
203
-		# perf : pas de fonction table_to_array ! (table est deja un array)
204
-		if (
205
-			isset($this->command['sourcemode'])
206
-			and !in_array($this->command['sourcemode'], ['table', 'array', 'tableau'])
207
-		) {
208
-			charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true);
209
-		}
210
-
211
-		# le premier argument peut etre un array, une URL etc.
212
-		$src = $this->command['source'][0];
213
-
214
-		# avons-nous un cache dispo ?
215
-		$cle = null;
216
-		if (is_string($src)) {
217
-			$cle = 'datasource_' . md5($this->command['sourcemode'] . ':' . var_export($this->command['source'], true));
218
-		}
219
-
220
-		$cache = $this->cache_get($cle);
221
-		if (isset($this->command['datacache'])) {
222
-			$ttl = intval($this->command['datacache']);
223
-		}
224
-		if (
225
-			$cache
226
-			and ($cache['time'] + ($ttl ?? $cache['ttl'])
227
-				> time())
228
-			and !(_request('var_mode') === 'recalcul'
229
-				and include_spip('inc/autoriser')
230
-				and autoriser('recalcul')
231
-			)
232
-		) {
233
-			$this->tableau = $cache['data'];
234
-		} else {
235
-			try {
236
-				if (
237
-					isset($this->command['sourcemode'])
238
-					and in_array(
239
-						$this->command['sourcemode'],
240
-						['table', 'array', 'tableau']
241
-					)
242
-				) {
243
-					if (
244
-						is_array($a = $src)
245
-						or (is_string($a)
246
-							and $a = str_replace('"', '"', $a) # fragile!
247
-							and is_array($a = @unserialize($a)))
248
-					) {
249
-						$this->tableau = $a;
250
-					}
251
-				} else {
252
-					$data = $src;
253
-					if (is_string($src)) {
254
-						if (tester_url_absolue($src)) {
255
-							include_spip('inc/distant');
256
-							$data = recuperer_url($src, ['taille_max' => _DATA_SOURCE_MAX_SIZE]);
257
-							$data = $data['page'] ?? '';
258
-							if (!$data) {
259
-								throw new Exception('404');
260
-							}
261
-							if (!isset($ttl)) {
262
-								$ttl = 24 * 3600;
263
-							}
264
-						} elseif (@is_dir($src)) {
265
-							$data = $src;
266
-						} elseif (@is_readable($src) && @is_file($src)) {
267
-							$data = spip_file_get_contents($src);
268
-						}
269
-						if (!isset($ttl)) {
270
-							$ttl = 10;
271
-						}
272
-					}
273
-
274
-					if (
275
-						!$this->err
276
-						and $data_to_array = charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true)
277
-					) {
278
-						$args = $this->command['source'];
279
-						$args[0] = $data;
280
-						if (is_array($a = $data_to_array(...$args))) {
281
-							$this->tableau = $a;
282
-						}
283
-					}
284
-				}
285
-
286
-				if (!is_array($this->tableau)) {
287
-					$this->err = true;
288
-				}
289
-
290
-				if (!$this->err and isset($ttl) and $ttl > 0) {
291
-					$this->cache_set($cle, $ttl);
292
-				}
293
-			} catch (Exception $e) {
294
-				$e = $e->getMessage();
295
-				$err = sprintf(
296
-					"[%s, %s] $e",
297
-					$src,
298
-					$this->command['sourcemode']
299
-				);
300
-				erreur_squelette([$err, []]);
301
-				$this->err = true;
302
-			}
303
-		}
304
-
305
-		# en cas d'erreur, utiliser le cache si encore dispo
306
-		if (
307
-			$this->err
308
-			and $cache
309
-		) {
310
-			$this->tableau = $cache['data'];
311
-			$this->err = false;
312
-		}
313
-	}
314
-
315
-
316
-	/**
317
-	 * Retourne un tableau donne depuis un critère liste
318
-	 *
319
-	 * Critère `{liste X1, X2, X3}`
320
-	 *
321
-	 * @see critere_DATA_liste_dist()
322
-	 *
323
-	 **/
324
-	protected function select_liste() {
325
-		# s'il n'y a qu'une valeur dans la liste, sans doute une #BALISE
326
-		if (!isset($this->command['liste'][1])) {
327
-			if (!is_array($this->command['liste'][0])) {
328
-				$this->command['liste'] = explode(',', $this->command['liste'][0]);
329
-			} else {
330
-				$this->command['liste'] = $this->command['liste'][0];
331
-			}
332
-		}
333
-		$this->tableau = $this->command['liste'];
334
-	}
335
-
336
-	/**
337
-	 * Retourne un tableau donne depuis un critere liste
338
-	 * Critere {enum Xmin, Xmax}
339
-	 *
340
-	 **/
341
-	protected function select_enum() {
342
-		# s'il n'y a qu'une valeur dans la liste, sans doute une #BALISE
343
-		if (!isset($this->command['enum'][1])) {
344
-			if (!is_array($this->command['enum'][0])) {
345
-				$this->command['enum'] = explode(',', $this->command['enum'][0]);
346
-			} else {
347
-				$this->command['enum'] = $this->command['enum'][0];
348
-			}
349
-		}
350
-		if ((is_countable($this->command['enum']) ? count($this->command['enum']) : 0) >= 3) {
351
-			$enum = range(
352
-				array_shift($this->command['enum']),
353
-				array_shift($this->command['enum']),
354
-				array_shift($this->command['enum'])
355
-			);
356
-		} else {
357
-			$enum = range(array_shift($this->command['enum']), array_shift($this->command['enum']));
358
-		}
359
-		$this->tableau = $enum;
360
-	}
361
-
362
-
363
-	/**
364
-	 * extraire le chemin "query.results" du tableau de donnees
365
-	 * {datapath query.results}
366
-	 *
367
-	 **/
368
-	protected function select_datapath() {
369
-		$base = reset($this->command['datapath']);
370
-		if (strlen($base = ltrim(trim($base), '/'))) {
371
-			$this->tableau = table_valeur($this->tableau, $base);
372
-			if (!is_array($this->tableau)) {
373
-				$this->tableau = [];
374
-				$this->err = true;
375
-				spip_log("datapath '$base' absent");
376
-			}
377
-		}
378
-	}
379
-
380
-	/**
381
-	 * Ordonner les resultats
382
-	 * {par x}
383
-	 *
384
-	 **/
385
-	protected function select_orderby() {
386
-		$sortfunc = '';
387
-		$aleas = 0;
388
-		foreach ($this->command['orderby'] as $tri) {
389
-			// virer le / initial pour les criteres de la forme {par /xx}
390
-			if (preg_match(',^\.?([/\w:_-]+)( DESC)?$,iS', ltrim($tri, '/'), $r)) {
391
-				$r = array_pad($r, 3, null);
392
-
393
-				// tri par cle
394
-				if ($r[1] == 'cle') {
395
-					if (isset($r[2]) and $r[2]) {
396
-						krsort($this->tableau);
397
-					} else {
398
-						ksort($this->tableau);
399
-					}
400
-				} # {par hasard}
401
-				else {
402
-					if ($r[1] == 'hasard') {
403
-						$k = array_keys($this->tableau);
404
-						shuffle($k);
405
-						$v = [];
406
-						foreach ($k as $cle) {
407
-							$v[$cle] = $this->tableau[$cle];
408
-						}
409
-						$this->tableau = $v;
410
-					} else {
411
-						# {par valeur}
412
-						if ($r[1] == 'valeur') {
413
-							$tv = '%s';
414
-						} # {par valeur/xx/yy} ??
415
-						else {
416
-							$tv = 'table_valeur(%s, ' . var_export($r[1], true) . ')';
417
-						}
418
-						$sortfunc .= '
15
+    /** Tableau de données */
16
+    protected array $tableau = [];
17
+
18
+    /**
19
+     * Conditions de filtrage
20
+     * ie criteres de selection
21
+     */
22
+    protected array $filtre = [];
23
+
24
+    /**
25
+     * Cle courante
26
+     *
27
+     * @var scalar
28
+     */
29
+    protected $cle = null;
30
+
31
+    /**
32
+     * Valeur courante
33
+     *
34
+     * @var mixed
35
+     */
36
+    protected $valeur = null;
37
+
38
+    /**
39
+     * Constructeur
40
+     *
41
+     * @param  $command
42
+     * @param array $info
43
+     */
44
+    public function __construct(array $command, array $info = []) {
45
+        $this->type = 'DATA';
46
+        $this->command = $command;
47
+        $this->info = $info;
48
+
49
+        $this->select($command);
50
+    }
51
+
52
+    /**
53
+     * Revenir au depart
54
+     *
55
+     * @return void
56
+     */
57
+    public function rewind(): void {
58
+        reset($this->tableau);
59
+        $this->cle = array_key_first($this->tableau);
60
+        $this->valeur = current($this->tableau);
61
+        next($this->tableau);
62
+    }
63
+
64
+    /**
65
+     * Déclarer les critères exceptions
66
+     *
67
+     * @return array
68
+     */
69
+    public function exception_des_criteres() {
70
+        return ['tableau'];
71
+    }
72
+
73
+    /**
74
+     * Récupérer depuis le cache si possible
75
+     *
76
+     * @param string $cle
77
+     * @return mixed
78
+     */
79
+    protected function cache_get($cle) {
80
+        if (!$cle) {
81
+            return;
82
+        }
83
+        # utiliser memoization si dispo
84
+        if (!function_exists('cache_get')) {
85
+            return;
86
+        }
87
+
88
+        return cache_get($cle);
89
+    }
90
+
91
+    /**
92
+     * Stocker en cache si possible
93
+     *
94
+     * @param string $cle
95
+     * @param int $ttl
96
+     * @param null|mixed $valeur
97
+     * @return bool
98
+     */
99
+    protected function cache_set($cle, $ttl, $valeur = null) {
100
+        if (!$cle) {
101
+            return;
102
+        }
103
+        if (is_null($valeur)) {
104
+            $valeur = $this->tableau;
105
+        }
106
+        # utiliser memoization si dispo
107
+        if (!function_exists('cache_set')) {
108
+            return;
109
+        }
110
+
111
+        return cache_set(
112
+            $cle,
113
+            [
114
+                'data' => $valeur,
115
+                'time' => time(),
116
+                'ttl' => $ttl
117
+            ],
118
+            3600 + $ttl
119
+        );
120
+        # conserver le cache 1h de plus que la validite demandee,
121
+        # pour le cas ou le serveur distant ne reponde plus
122
+    }
123
+
124
+    /**
125
+     * Aller chercher les données de la boucle DATA
126
+     *
127
+     * @throws Exception
128
+     * @param array $command
129
+     * @return void
130
+     */
131
+    protected function select($command) {
132
+
133
+        // l'iterateur DATA peut etre appele en passant (data:type)
134
+        // le type se retrouve dans la commande 'from'
135
+        // dans ce cas la le critere {source}, si present, n'a pas besoin du 1er argument
136
+        if (isset($this->command['from'][0])) {
137
+            if (isset($this->command['source']) and is_array($this->command['source'])) {
138
+                array_unshift($this->command['source'], $this->command['sourcemode']);
139
+            }
140
+            $this->command['sourcemode'] = $this->command['from'][0];
141
+        }
142
+
143
+        // cherchons differents moyens de creer le tableau de donnees
144
+        // les commandes connues pour l'iterateur DATA
145
+        // sont : {tableau #ARRAY} ; {cle=...} ; {valeur=...}
146
+
147
+        // {source format, [URL], [arg2]...}
148
+        if (
149
+            isset($this->command['source'])
150
+            and isset($this->command['sourcemode'])
151
+        ) {
152
+            $this->select_source();
153
+        }
154
+
155
+        // Critere {liste X1, X2, X3}
156
+        if (isset($this->command['liste'])) {
157
+            $this->select_liste();
158
+        }
159
+        if (isset($this->command['enum'])) {
160
+            $this->select_enum();
161
+        }
162
+
163
+        // Si a ce stade on n'a pas de table, il y a un bug
164
+        if (!is_array($this->tableau)) {
165
+            $this->err = true;
166
+            spip_log('erreur datasource ' . var_export($command, true));
167
+        }
168
+
169
+        // {datapath query.results}
170
+        // extraire le chemin "query.results" du tableau de donnees
171
+        if (
172
+            !$this->err
173
+            and isset($this->command['datapath'])
174
+            and is_array($this->command['datapath'])
175
+        ) {
176
+            $this->select_datapath();
177
+        }
178
+
179
+        // tri {par x}
180
+        if ($this->command['orderby']) {
181
+            $this->select_orderby();
182
+        }
183
+
184
+        // grouper les resultats {fusion /x/y/z} ;
185
+        if ($this->command['groupby']) {
186
+            $this->select_groupby();
187
+        }
188
+
189
+        $this->rewind();
190
+        #var_dump($this->tableau);
191
+    }
192
+
193
+
194
+    /**
195
+     * Aller chercher les donnees de la boucle DATA
196
+     * depuis une source
197
+     * {source format, [URL], [arg2]...}
198
+     */
199
+    protected function select_source() {
200
+        # un peu crado : avant de charger le cache il faut charger
201
+        # les class indispensables, sinon PHP ne saura pas gerer
202
+        # l'objet en cache ; cf plugins/icalendar
203
+        # perf : pas de fonction table_to_array ! (table est deja un array)
204
+        if (
205
+            isset($this->command['sourcemode'])
206
+            and !in_array($this->command['sourcemode'], ['table', 'array', 'tableau'])
207
+        ) {
208
+            charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true);
209
+        }
210
+
211
+        # le premier argument peut etre un array, une URL etc.
212
+        $src = $this->command['source'][0];
213
+
214
+        # avons-nous un cache dispo ?
215
+        $cle = null;
216
+        if (is_string($src)) {
217
+            $cle = 'datasource_' . md5($this->command['sourcemode'] . ':' . var_export($this->command['source'], true));
218
+        }
219
+
220
+        $cache = $this->cache_get($cle);
221
+        if (isset($this->command['datacache'])) {
222
+            $ttl = intval($this->command['datacache']);
223
+        }
224
+        if (
225
+            $cache
226
+            and ($cache['time'] + ($ttl ?? $cache['ttl'])
227
+                > time())
228
+            and !(_request('var_mode') === 'recalcul'
229
+                and include_spip('inc/autoriser')
230
+                and autoriser('recalcul')
231
+            )
232
+        ) {
233
+            $this->tableau = $cache['data'];
234
+        } else {
235
+            try {
236
+                if (
237
+                    isset($this->command['sourcemode'])
238
+                    and in_array(
239
+                        $this->command['sourcemode'],
240
+                        ['table', 'array', 'tableau']
241
+                    )
242
+                ) {
243
+                    if (
244
+                        is_array($a = $src)
245
+                        or (is_string($a)
246
+                            and $a = str_replace('"', '"', $a) # fragile!
247
+                            and is_array($a = @unserialize($a)))
248
+                    ) {
249
+                        $this->tableau = $a;
250
+                    }
251
+                } else {
252
+                    $data = $src;
253
+                    if (is_string($src)) {
254
+                        if (tester_url_absolue($src)) {
255
+                            include_spip('inc/distant');
256
+                            $data = recuperer_url($src, ['taille_max' => _DATA_SOURCE_MAX_SIZE]);
257
+                            $data = $data['page'] ?? '';
258
+                            if (!$data) {
259
+                                throw new Exception('404');
260
+                            }
261
+                            if (!isset($ttl)) {
262
+                                $ttl = 24 * 3600;
263
+                            }
264
+                        } elseif (@is_dir($src)) {
265
+                            $data = $src;
266
+                        } elseif (@is_readable($src) && @is_file($src)) {
267
+                            $data = spip_file_get_contents($src);
268
+                        }
269
+                        if (!isset($ttl)) {
270
+                            $ttl = 10;
271
+                        }
272
+                    }
273
+
274
+                    if (
275
+                        !$this->err
276
+                        and $data_to_array = charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true)
277
+                    ) {
278
+                        $args = $this->command['source'];
279
+                        $args[0] = $data;
280
+                        if (is_array($a = $data_to_array(...$args))) {
281
+                            $this->tableau = $a;
282
+                        }
283
+                    }
284
+                }
285
+
286
+                if (!is_array($this->tableau)) {
287
+                    $this->err = true;
288
+                }
289
+
290
+                if (!$this->err and isset($ttl) and $ttl > 0) {
291
+                    $this->cache_set($cle, $ttl);
292
+                }
293
+            } catch (Exception $e) {
294
+                $e = $e->getMessage();
295
+                $err = sprintf(
296
+                    "[%s, %s] $e",
297
+                    $src,
298
+                    $this->command['sourcemode']
299
+                );
300
+                erreur_squelette([$err, []]);
301
+                $this->err = true;
302
+            }
303
+        }
304
+
305
+        # en cas d'erreur, utiliser le cache si encore dispo
306
+        if (
307
+            $this->err
308
+            and $cache
309
+        ) {
310
+            $this->tableau = $cache['data'];
311
+            $this->err = false;
312
+        }
313
+    }
314
+
315
+
316
+    /**
317
+     * Retourne un tableau donne depuis un critère liste
318
+     *
319
+     * Critère `{liste X1, X2, X3}`
320
+     *
321
+     * @see critere_DATA_liste_dist()
322
+     *
323
+     **/
324
+    protected function select_liste() {
325
+        # s'il n'y a qu'une valeur dans la liste, sans doute une #BALISE
326
+        if (!isset($this->command['liste'][1])) {
327
+            if (!is_array($this->command['liste'][0])) {
328
+                $this->command['liste'] = explode(',', $this->command['liste'][0]);
329
+            } else {
330
+                $this->command['liste'] = $this->command['liste'][0];
331
+            }
332
+        }
333
+        $this->tableau = $this->command['liste'];
334
+    }
335
+
336
+    /**
337
+     * Retourne un tableau donne depuis un critere liste
338
+     * Critere {enum Xmin, Xmax}
339
+     *
340
+     **/
341
+    protected function select_enum() {
342
+        # s'il n'y a qu'une valeur dans la liste, sans doute une #BALISE
343
+        if (!isset($this->command['enum'][1])) {
344
+            if (!is_array($this->command['enum'][0])) {
345
+                $this->command['enum'] = explode(',', $this->command['enum'][0]);
346
+            } else {
347
+                $this->command['enum'] = $this->command['enum'][0];
348
+            }
349
+        }
350
+        if ((is_countable($this->command['enum']) ? count($this->command['enum']) : 0) >= 3) {
351
+            $enum = range(
352
+                array_shift($this->command['enum']),
353
+                array_shift($this->command['enum']),
354
+                array_shift($this->command['enum'])
355
+            );
356
+        } else {
357
+            $enum = range(array_shift($this->command['enum']), array_shift($this->command['enum']));
358
+        }
359
+        $this->tableau = $enum;
360
+    }
361
+
362
+
363
+    /**
364
+     * extraire le chemin "query.results" du tableau de donnees
365
+     * {datapath query.results}
366
+     *
367
+     **/
368
+    protected function select_datapath() {
369
+        $base = reset($this->command['datapath']);
370
+        if (strlen($base = ltrim(trim($base), '/'))) {
371
+            $this->tableau = table_valeur($this->tableau, $base);
372
+            if (!is_array($this->tableau)) {
373
+                $this->tableau = [];
374
+                $this->err = true;
375
+                spip_log("datapath '$base' absent");
376
+            }
377
+        }
378
+    }
379
+
380
+    /**
381
+     * Ordonner les resultats
382
+     * {par x}
383
+     *
384
+     **/
385
+    protected function select_orderby() {
386
+        $sortfunc = '';
387
+        $aleas = 0;
388
+        foreach ($this->command['orderby'] as $tri) {
389
+            // virer le / initial pour les criteres de la forme {par /xx}
390
+            if (preg_match(',^\.?([/\w:_-]+)( DESC)?$,iS', ltrim($tri, '/'), $r)) {
391
+                $r = array_pad($r, 3, null);
392
+
393
+                // tri par cle
394
+                if ($r[1] == 'cle') {
395
+                    if (isset($r[2]) and $r[2]) {
396
+                        krsort($this->tableau);
397
+                    } else {
398
+                        ksort($this->tableau);
399
+                    }
400
+                } # {par hasard}
401
+                else {
402
+                    if ($r[1] == 'hasard') {
403
+                        $k = array_keys($this->tableau);
404
+                        shuffle($k);
405
+                        $v = [];
406
+                        foreach ($k as $cle) {
407
+                            $v[$cle] = $this->tableau[$cle];
408
+                        }
409
+                        $this->tableau = $v;
410
+                    } else {
411
+                        # {par valeur}
412
+                        if ($r[1] == 'valeur') {
413
+                            $tv = '%s';
414
+                        } # {par valeur/xx/yy} ??
415
+                        else {
416
+                            $tv = 'table_valeur(%s, ' . var_export($r[1], true) . ')';
417
+                        }
418
+                        $sortfunc .= '
419 419
 					$a = ' . sprintf($tv, '$aa') . ';
420 420
 					$b = ' . sprintf($tv, '$bb') . ';
421 421
 					if ($a <> $b)
422 422
 						return ($a ' . (!empty($r[2]) ? '>' : '<') . ' $b) ? -1 : 1;';
423
-					}
424
-				}
425
-			}
426
-		}
427
-
428
-		if ($sortfunc) {
429
-			$sortfunc .= "\n return 0;";
430
-			uasort($this->tableau, fn($aa, $bb) => eval($sortfunc));
431
-		}
432
-	}
433
-
434
-
435
-	/**
436
-	 * Grouper les resultats
437
-	 * {fusion /x/y/z}
438
-	 *
439
-	 **/
440
-	protected function select_groupby() {
441
-		// virer le / initial pour les criteres de la forme {fusion /xx}
442
-		if (strlen($fusion = ltrim($this->command['groupby'][0], '/'))) {
443
-			$vu = [];
444
-			foreach ($this->tableau as $k => $v) {
445
-				$val = table_valeur($v, $fusion);
446
-				if (isset($vu[$val])) {
447
-					unset($this->tableau[$k]);
448
-				} else {
449
-					$vu[$val] = true;
450
-				}
451
-			}
452
-		}
453
-	}
454
-
455
-
456
-	/**
457
-	 * L'iterateur est-il encore valide ?
458
-	 *
459
-	 * @return bool
460
-	 */
461
-	public function valid(): bool {
462
-		return !is_null($this->cle);
463
-	}
464
-
465
-	/**
466
-	 * Retourner la valeur
467
-	 *
468
-	 * @return mixed
469
-	 */
470
-	#[\ReturnTypeWillChange]
471
-	public function current() {
472
-		return $this->valeur;
473
-	}
474
-
475
-	/**
476
-	 * Retourner la cle
477
-	 *
478
-	 * @return mixed
479
-	 */
480
-	#[\ReturnTypeWillChange]
481
-	public function key() {
482
-		return $this->cle;
483
-	}
484
-
485
-	/**
486
-	 * Passer a la valeur suivante
487
-	 *
488
-	 * @return void
489
-	 */
490
-	public function next(): void {
491
-		if ($this->valid()) {
492
-			$this->cle = key($this->tableau);
493
-			$this->valeur = current($this->tableau);
494
-			next($this->tableau);
495
-		}
496
-	}
497
-
498
-	/**
499
-	 * Compter le nombre total de resultats
500
-	 *
501
-	 * @return int
502
-	 */
503
-	public function count() {
504
-		if (is_null($this->total)) {
505
-			$this->total = count($this->tableau);
506
-		}
507
-
508
-		return $this->total;
509
-	}
423
+                    }
424
+                }
425
+            }
426
+        }
427
+
428
+        if ($sortfunc) {
429
+            $sortfunc .= "\n return 0;";
430
+            uasort($this->tableau, fn($aa, $bb) => eval($sortfunc));
431
+        }
432
+    }
433
+
434
+
435
+    /**
436
+     * Grouper les resultats
437
+     * {fusion /x/y/z}
438
+     *
439
+     **/
440
+    protected function select_groupby() {
441
+        // virer le / initial pour les criteres de la forme {fusion /xx}
442
+        if (strlen($fusion = ltrim($this->command['groupby'][0], '/'))) {
443
+            $vu = [];
444
+            foreach ($this->tableau as $k => $v) {
445
+                $val = table_valeur($v, $fusion);
446
+                if (isset($vu[$val])) {
447
+                    unset($this->tableau[$k]);
448
+                } else {
449
+                    $vu[$val] = true;
450
+                }
451
+            }
452
+        }
453
+    }
454
+
455
+
456
+    /**
457
+     * L'iterateur est-il encore valide ?
458
+     *
459
+     * @return bool
460
+     */
461
+    public function valid(): bool {
462
+        return !is_null($this->cle);
463
+    }
464
+
465
+    /**
466
+     * Retourner la valeur
467
+     *
468
+     * @return mixed
469
+     */
470
+    #[\ReturnTypeWillChange]
471
+    public function current() {
472
+        return $this->valeur;
473
+    }
474
+
475
+    /**
476
+     * Retourner la cle
477
+     *
478
+     * @return mixed
479
+     */
480
+    #[\ReturnTypeWillChange]
481
+    public function key() {
482
+        return $this->cle;
483
+    }
484
+
485
+    /**
486
+     * Passer a la valeur suivante
487
+     *
488
+     * @return void
489
+     */
490
+    public function next(): void {
491
+        if ($this->valid()) {
492
+            $this->cle = key($this->tableau);
493
+            $this->valeur = current($this->tableau);
494
+            next($this->tableau);
495
+        }
496
+    }
497
+
498
+    /**
499
+     * Compter le nombre total de resultats
500
+     *
501
+     * @return int
502
+     */
503
+    public function count() {
504
+        if (is_null($this->total)) {
505
+            $this->total = count($this->tableau);
506
+        }
507
+
508
+        return $this->total;
509
+    }
510 510
 }
Please login to merge, or discard this patch.
Spacing   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -163,7 +163,7 @@  discard block
 block discarded – undo
163 163
 		// Si a ce stade on n'a pas de table, il y a un bug
164 164
 		if (!is_array($this->tableau)) {
165 165
 			$this->err = true;
166
-			spip_log('erreur datasource ' . var_export($command, true));
166
+			spip_log('erreur datasource '.var_export($command, true));
167 167
 		}
168 168
 
169 169
 		// {datapath query.results}
@@ -205,7 +205,7 @@  discard block
 block discarded – undo
205 205
 			isset($this->command['sourcemode'])
206 206
 			and !in_array($this->command['sourcemode'], ['table', 'array', 'tableau'])
207 207
 		) {
208
-			charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true);
208
+			charger_fonction($this->command['sourcemode'].'_to_array', 'inc', true);
209 209
 		}
210 210
 
211 211
 		# le premier argument peut etre un array, une URL etc.
@@ -214,7 +214,7 @@  discard block
 block discarded – undo
214 214
 		# avons-nous un cache dispo ?
215 215
 		$cle = null;
216 216
 		if (is_string($src)) {
217
-			$cle = 'datasource_' . md5($this->command['sourcemode'] . ':' . var_export($this->command['source'], true));
217
+			$cle = 'datasource_'.md5($this->command['sourcemode'].':'.var_export($this->command['source'], true));
218 218
 		}
219 219
 
220 220
 		$cache = $this->cache_get($cle);
@@ -273,7 +273,7 @@  discard block
 block discarded – undo
273 273
 
274 274
 					if (
275 275
 						!$this->err
276
-						and $data_to_array = charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true)
276
+						and $data_to_array = charger_fonction($this->command['sourcemode'].'_to_array', 'inc', true)
277 277
 					) {
278 278
 						$args = $this->command['source'];
279 279
 						$args[0] = $data;
@@ -413,13 +413,13 @@  discard block
 block discarded – undo
413 413
 							$tv = '%s';
414 414
 						} # {par valeur/xx/yy} ??
415 415
 						else {
416
-							$tv = 'table_valeur(%s, ' . var_export($r[1], true) . ')';
416
+							$tv = 'table_valeur(%s, '.var_export($r[1], true).')';
417 417
 						}
418 418
 						$sortfunc .= '
419
-					$a = ' . sprintf($tv, '$aa') . ';
420
-					$b = ' . sprintf($tv, '$bb') . ';
419
+					$a = ' . sprintf($tv, '$aa').';
420
+					$b = ' . sprintf($tv, '$bb').';
421 421
 					if ($a <> $b)
422
-						return ($a ' . (!empty($r[2]) ? '>' : '<') . ' $b) ? -1 : 1;';
422
+						return ($a ' . (!empty($r[2]) ? '>' : '<').' $b) ? -1 : 1;';
423 423
 					}
424 424
 				}
425 425
 			}
Please login to merge, or discard this patch.
ecrire/src/Compilateur/Noeud/Boucle.php 1 patch
Indentation   +363 added lines, -363 removed lines patch added patch discarded remove patch
@@ -7,367 +7,367 @@
 block discarded – undo
7 7
  */
8 8
 class Boucle
9 9
 {
10
-	/** Type de noeud */
11
-	public string $type = 'boucle';
12
-
13
-	/** Identifiant de la boucle */
14
-	public string $id_boucle;
15
-
16
-	/** Identifiant de la boucle parente */
17
-	public string $id_parent = '';
18
-
19
-	/** Un nom explicite qui peut être affecté manuellement à certaines boucles générées */
20
-	public string $nom = '';
21
-
22
-	/**
23
-	 * Partie avant toujours affichee
24
-	 *
25
-	 * @var string|array
26
-	 */
27
-	public $preaff = '';
28
-
29
-	/**
30
-	 * Partie optionnelle avant
31
-	 *
32
-	 * @var string|array
33
-	 */
34
-	public $avant = '';
35
-
36
-	/**
37
-	 * Pour chaque élément
38
-	 *
39
-	 * @var string|array
40
-	 */
41
-	public $milieu = '';
42
-
43
-	/**
44
-	 * Partie optionnelle après
45
-	 *
46
-	 * @var string|array
47
-	 */
48
-	public $apres = '';
49
-
50
-	/**
51
-	 * Partie alternative, si pas de résultat dans la boucle
52
-	 *
53
-	 * @var string|array
54
-	 */
55
-	public $altern = '';
56
-
57
-	/**
58
-	 * Partie apres toujours affichee
59
-	 *
60
-	 * @var string|array
61
-	 */
62
-	public $postaff = '';
63
-
64
-
65
-	/**
66
-	 * La boucle doit-elle sélectionner la langue ?
67
-	 *
68
-	 * Valeurs : '', 'oui', 'non'
69
-	 */
70
-	public string $lang_select = '';
71
-
72
-	/**
73
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
74
-	 *
75
-	 * FIXME: un seul typage (string ?)
76
-	 *
77
-	 * @var string|false|null
78
-	 */
79
-	public $type_requete = null;
80
-
81
-	/**
82
-	 * La table est elle optionnelle ?
83
-	 *
84
-	 * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente
85
-	 */
86
-	public bool $table_optionnelle = false;
87
-
88
-	/**
89
-	 * Nom du fichier de connexion
90
-	 */
91
-	public string $sql_serveur = '';
92
-
93
-	/**
94
-	 * Paramètres de la boucle
95
-	 *
96
-	 * Description des paramètres passés à la boucle, qui servent ensuite
97
-	 * au calcul des critères
98
-	 *
99
-	 * FIXME: type unique.
100
-	 * @var false|array
101
-	 *     - false: erreur de syntaxe
102
-	 */
103
-	public $param = [];
104
-
105
-	/**
106
-	 * Critères de la boucle
107
-	 *
108
-	 * FIXME: type array unique.
109
-	 *
110
-	 * @var string|Critere[]
111
-	 * - string: phrasage (code brut). Il reste si erreur de critère
112
-	 * - array: analyse correcte des critères...
113
-	 */
114
-	public $criteres = [];
115
-
116
-	/**
117
-	 * Textes insérés entre 2 éléments de boucle (critère inter)
118
-	 *
119
-	 * @var string[]
120
-	 */
121
-	public array $separateur = [];
122
-
123
-	/**
124
-	 * Liste des jointures possibles avec cette table
125
-	 *
126
-	 * Les jointures par défaut de la table sont complétées en priorité
127
-	 * des jointures déclarées explicitement sur la boucle
128
-	 *
129
-	 * @see base_trouver_table_dist()
130
-	 */
131
-	public array $jointures = [];
132
-
133
-	/**
134
-	 * Jointures explicites avec cette table
135
-	 *
136
-	 * Ces jointures sont utilisées en priorité par rapport aux jointures
137
-	 * normales possibles pour retrouver les colonnes demandées extérieures
138
-	 * à la boucle.
139
-	 *
140
-	 * @var string|bool
141
-	 */
142
-	public $jointures_explicites = false;
143
-
144
-	/**
145
-	 * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index"
146
-	 */
147
-	public string $doublons = '';
148
-
149
-	/**
150
-	 * Code PHP ajouté au début de chaque itération de boucle.
151
-	 *
152
-	 * Utilisé entre autre par les critères {pagination}, {n-a,b}, {a/b}...
153
-	 */
154
-	public string $partie = '';
155
-
156
-	/**
157
-	 * Nombre de divisions de la boucle, d'éléments à afficher,
158
-	 * ou de soustractions d'éléments à faire
159
-	 *
160
-	 * Dans les critères limitant le nombre d'éléments affichés
161
-	 * {a,b}, {a,n-b}, {a/b}, {pagination b}, b est affecté à total_parties.
162
-	 */
163
-	public string $total_parties = '';
164
-
165
-	/**
166
-	 * Code PHP ajouté avant l'itération de boucle.
167
-	 *
168
-	 * Utilisé entre autre par les critères {pagination}, {a,b}, {a/b}
169
-	 * pour initialiser les variables de début et de fin d'itération.
170
-	 */
171
-	public string $mode_partie = '';
172
-
173
-	/**
174
-	 * Identifiant d'une boucle qui appelle celle-ci de manière récursive
175
-	 *
176
-	 * Si une boucle est appelée de manière récursive quelque part par
177
-	 * une autre boucle comme <BOUCLE_rec(boucle_identifiant) />, cette
178
-	 * boucle (identifiant) reçoit dans cette propriété l'identifiant
179
-	 * de l'appelant (rec)
180
-	 */
181
-	public string $externe = '';
182
-
183
-	// champs pour la construction de la requete SQL
184
-
185
-	/**
186
-	 * Liste des champs à récupérer par la boucle
187
-	 *
188
-	 * Expression 'table.nom_champ' ou calculée 'nom_champ AS x'
189
-	 *
190
-	 * @var string[]
191
-	 */
192
-	public array $select = [];
193
-
194
-	/**
195
-	 * Liste des alias / tables SQL utilisées dans la boucle
196
-	 *
197
-	 * L'index est un identifiant (xx dans spip_xx assez souvent) qui servira
198
-	 * d'alias au nom de la table ; la valeur est le nom de la table SQL désirée.
199
-	 *
200
-	 * L'index 0 peut définir le type de sources de données de l'itérateur DATA
201
-	 *
202
-	 * @var string[]
203
-	 */
204
-	public array $from = [];
205
-
206
-	/**
207
-	 * Liste des alias / type de jointures utilisées dans la boucle
208
-	 *
209
-	 * L'index est le nom d'alias (comme pour la propriété $from), et la valeur
210
-	 * un type de jointure parmi 'INNER', 'LEFT', 'RIGHT', 'OUTER'.
211
-	 *
212
-	 * Lorsque le type n'est pas déclaré pour un alias, c'est 'INNER'
213
-	 * qui sera utilisé par défaut (créant donc un INNER JOIN).
214
-	 *
215
-	 * @var string[]
216
-	 */
217
-	public array $from_type = [];
218
-
219
-	/**
220
-	 * Liste des conditions WHERE de la boucle
221
-	 *
222
-	 * Permet de restreindre les éléments retournés par une boucle
223
-	 * en fonctions des conditions transmises dans ce tableau.
224
-	 *
225
-	 * Ce tableau peut avoir plusieurs niveaux de profondeur.
226
-	 *
227
-	 * Les éléments du premier niveau sont reliés par des AND, donc
228
-	 * chaque élément ajouté directement au where par
229
-	 * $boucle->where[] = array(...) ou $boucle->where[] = "'expression'"
230
-	 * est une condition AND en plus.
231
-	 *
232
-	 * Par contre, lorsqu'on indique un tableau, il peut décrire des relations
233
-	 * internes différentes. Soit $expr un tableau d'expressions quelconques de 3 valeurs :
234
-	 * $expr = array(operateur, val1, val2)
235
-	 *
236
-	 * Ces 3 valeurs sont des expressions PHP. L'index 0 désigne l'opérateur
237
-	 * à réaliser tel que :
238
-	 *
239
-	 * - "'='" , "'>='", "'<'", "'IN'", "'REGEXP'", "'LIKE'", ... :
240
-	 *    val1 et val2 sont des champs et valeurs à utiliser dans la comparaison
241
-	 *    suivant cet ordre : "val1 operateur val2".
242
-	 *    Exemple : $boucle->where[] = array("'='", "'articles.statut'", "'\"publie\"'");
243
-	 * - "'AND'", "'OR'", "'NOT'" :
244
-	 *    dans ce cas val1 et val2 sont également des expressions
245
-	 *    de comparaison complètes, et peuvent être eux-même des tableaux comme $expr
246
-	 *    Exemples :
247
-	 *    $boucle->where[] = array("'OR'", $expr1, $expr2);
248
-	 *    $boucle->where[] = array("'NOT'", $expr); // val2 n'existe pas avec NOT
249
-	 *
250
-	 * D'autres noms sont possibles pour l'opérateur (le nombre de valeurs diffère) :
251
-	 * - "'SELF'", "'SUBSELECT'" : indiquent des sous requêtes
252
-	 * - "'?'" : indique une condition à faire évaluer (val1 ? val2 : val3)
253
-	 */
254
-	public array $where = [];
255
-
256
-	public array $join = [];
257
-	public array $having = [];
258
-	public $limit = '';
259
-	public array $group = [];
260
-	public array $order = [];
261
-	public array $default_order = [];
262
-	public string $date = 'date';
263
-	public string $hash = '';
264
-	public $in = '';
265
-	public bool $sous_requete = false;
266
-
267
-	/**
268
-	 * Code PHP qui sera ajouté en tout début de la fonction de boucle
269
-	 *
270
-	 * Il sert à insérer le code calculant une hierarchie
271
-	 */
272
-	public string $hierarchie = '';
273
-
274
-	// champs pour la construction du corps PHP
275
-
276
-	/**
277
-	 * Description des sources de données de la boucle
278
-	 *
279
-	 * Description des données de la boucle issu de trouver_table
280
-	 * dans le cadre de l'itérateur SQL et contenant au moins l'index 'field'.
281
-	 *
282
-	 * @see base_trouver_table_dist()
283
-	 */
284
-	public array $show = [];
285
-
286
-	/**
287
-	 * Nom de la table SQL principale de la boucle, sans son préfixe
288
-	 */
289
-	public string $id_table = '';
290
-
291
-	/**
292
-	 * Nom de la clé primaire de la table SQL principale de la boucle
293
-	 */
294
-	public string $primary = '';
295
-
296
-	/**
297
-	 * Code PHP compilé de la boucle
298
-	 *
299
-	 * FIXME: un seul type (string ?)
300
-	 *
301
-	 * - false: boucle fautive ?
302
-	 *
303
-	 * @var string|false
304
-	 */
305
-	public $return = '';
306
-
307
-	public $numrows = false;
308
-	public $cptrows = false;
309
-
310
-	/**
311
-	 * Description du squelette
312
-	 *
313
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
314
-	 *
315
-	 * Peut contenir les index :
316
-	 *
317
-	 * - nom : Nom du fichier de cache
318
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
319
-	 * - sourcefile : Chemin du squelette
320
-	 * - squelette : Code du squelette
321
-	 * - id_mere : Identifiant de la boucle parente
322
-	 * - documents : Pour embed et img dans les textes
323
-	 * - session : Pour un cache sessionné par auteur
324
-	 * - niv : Niveau de tabulation
325
-	 */
326
-	public array $descr = [];
327
-
328
-	/** Numéro de ligne dans le code source du squelette */
329
-	public int $ligne = 0;
330
-
331
-
332
-	/**
333
-	 * table pour stocker les modificateurs de boucle tels que tout, plat ...,
334
-	 * utilisable par les plugins egalement
335
-	 *
336
-	 * @var array<string, mixed>
337
-	 */
338
-	public array $modificateur = [];
339
-
340
-	/**
341
-	 * Type d'itérateur utilisé pour cette boucle
342
-	 *
343
-	 * - 'SQL' dans le cadre d'une boucle sur une table SQL
344
-	 * - 'DATA' pour l'itérateur DATA, ...
345
-	 *
346
-	 * @var string
347
-	 */
348
-	public string $iterateur = ''; // type d'iterateur
349
-
350
-	/**
351
-	 * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug
352
-	 */
353
-	public array $debug = [];
354
-
355
-	/**
356
-	 * Index de la boucle dont le champ présent dans cette boucle est originaire,
357
-	 * notamment si le champ a été trouve dans une boucle parente
358
-	 *
359
-	 * Tableau nom du champ => index de boucle
360
-	*/
361
-	public array $index_champ = [];
362
-
363
-	/** Résultat de la compilation (?) (sert au débusqueur) */
364
-	public string $code = '';
365
-
366
-	/** Source des filtres (compatibilité) (?) */
367
-	public array $fonctions = [];
368
-
369
-	// obsoletes, conserves provisoirement pour compatibilite
370
-	public $tout = false;
371
-	public $plat = false;
372
-	public $lien = false;
10
+    /** Type de noeud */
11
+    public string $type = 'boucle';
12
+
13
+    /** Identifiant de la boucle */
14
+    public string $id_boucle;
15
+
16
+    /** Identifiant de la boucle parente */
17
+    public string $id_parent = '';
18
+
19
+    /** Un nom explicite qui peut être affecté manuellement à certaines boucles générées */
20
+    public string $nom = '';
21
+
22
+    /**
23
+     * Partie avant toujours affichee
24
+     *
25
+     * @var string|array
26
+     */
27
+    public $preaff = '';
28
+
29
+    /**
30
+     * Partie optionnelle avant
31
+     *
32
+     * @var string|array
33
+     */
34
+    public $avant = '';
35
+
36
+    /**
37
+     * Pour chaque élément
38
+     *
39
+     * @var string|array
40
+     */
41
+    public $milieu = '';
42
+
43
+    /**
44
+     * Partie optionnelle après
45
+     *
46
+     * @var string|array
47
+     */
48
+    public $apres = '';
49
+
50
+    /**
51
+     * Partie alternative, si pas de résultat dans la boucle
52
+     *
53
+     * @var string|array
54
+     */
55
+    public $altern = '';
56
+
57
+    /**
58
+     * Partie apres toujours affichee
59
+     *
60
+     * @var string|array
61
+     */
62
+    public $postaff = '';
63
+
64
+
65
+    /**
66
+     * La boucle doit-elle sélectionner la langue ?
67
+     *
68
+     * Valeurs : '', 'oui', 'non'
69
+     */
70
+    public string $lang_select = '';
71
+
72
+    /**
73
+     * Alias de table d'application de la requête ou nom complet de la table SQL
74
+     *
75
+     * FIXME: un seul typage (string ?)
76
+     *
77
+     * @var string|false|null
78
+     */
79
+    public $type_requete = null;
80
+
81
+    /**
82
+     * La table est elle optionnelle ?
83
+     *
84
+     * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente
85
+     */
86
+    public bool $table_optionnelle = false;
87
+
88
+    /**
89
+     * Nom du fichier de connexion
90
+     */
91
+    public string $sql_serveur = '';
92
+
93
+    /**
94
+     * Paramètres de la boucle
95
+     *
96
+     * Description des paramètres passés à la boucle, qui servent ensuite
97
+     * au calcul des critères
98
+     *
99
+     * FIXME: type unique.
100
+     * @var false|array
101
+     *     - false: erreur de syntaxe
102
+     */
103
+    public $param = [];
104
+
105
+    /**
106
+     * Critères de la boucle
107
+     *
108
+     * FIXME: type array unique.
109
+     *
110
+     * @var string|Critere[]
111
+     * - string: phrasage (code brut). Il reste si erreur de critère
112
+     * - array: analyse correcte des critères...
113
+     */
114
+    public $criteres = [];
115
+
116
+    /**
117
+     * Textes insérés entre 2 éléments de boucle (critère inter)
118
+     *
119
+     * @var string[]
120
+     */
121
+    public array $separateur = [];
122
+
123
+    /**
124
+     * Liste des jointures possibles avec cette table
125
+     *
126
+     * Les jointures par défaut de la table sont complétées en priorité
127
+     * des jointures déclarées explicitement sur la boucle
128
+     *
129
+     * @see base_trouver_table_dist()
130
+     */
131
+    public array $jointures = [];
132
+
133
+    /**
134
+     * Jointures explicites avec cette table
135
+     *
136
+     * Ces jointures sont utilisées en priorité par rapport aux jointures
137
+     * normales possibles pour retrouver les colonnes demandées extérieures
138
+     * à la boucle.
139
+     *
140
+     * @var string|bool
141
+     */
142
+    public $jointures_explicites = false;
143
+
144
+    /**
145
+     * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index"
146
+     */
147
+    public string $doublons = '';
148
+
149
+    /**
150
+     * Code PHP ajouté au début de chaque itération de boucle.
151
+     *
152
+     * Utilisé entre autre par les critères {pagination}, {n-a,b}, {a/b}...
153
+     */
154
+    public string $partie = '';
155
+
156
+    /**
157
+     * Nombre de divisions de la boucle, d'éléments à afficher,
158
+     * ou de soustractions d'éléments à faire
159
+     *
160
+     * Dans les critères limitant le nombre d'éléments affichés
161
+     * {a,b}, {a,n-b}, {a/b}, {pagination b}, b est affecté à total_parties.
162
+     */
163
+    public string $total_parties = '';
164
+
165
+    /**
166
+     * Code PHP ajouté avant l'itération de boucle.
167
+     *
168
+     * Utilisé entre autre par les critères {pagination}, {a,b}, {a/b}
169
+     * pour initialiser les variables de début et de fin d'itération.
170
+     */
171
+    public string $mode_partie = '';
172
+
173
+    /**
174
+     * Identifiant d'une boucle qui appelle celle-ci de manière récursive
175
+     *
176
+     * Si une boucle est appelée de manière récursive quelque part par
177
+     * une autre boucle comme <BOUCLE_rec(boucle_identifiant) />, cette
178
+     * boucle (identifiant) reçoit dans cette propriété l'identifiant
179
+     * de l'appelant (rec)
180
+     */
181
+    public string $externe = '';
182
+
183
+    // champs pour la construction de la requete SQL
184
+
185
+    /**
186
+     * Liste des champs à récupérer par la boucle
187
+     *
188
+     * Expression 'table.nom_champ' ou calculée 'nom_champ AS x'
189
+     *
190
+     * @var string[]
191
+     */
192
+    public array $select = [];
193
+
194
+    /**
195
+     * Liste des alias / tables SQL utilisées dans la boucle
196
+     *
197
+     * L'index est un identifiant (xx dans spip_xx assez souvent) qui servira
198
+     * d'alias au nom de la table ; la valeur est le nom de la table SQL désirée.
199
+     *
200
+     * L'index 0 peut définir le type de sources de données de l'itérateur DATA
201
+     *
202
+     * @var string[]
203
+     */
204
+    public array $from = [];
205
+
206
+    /**
207
+     * Liste des alias / type de jointures utilisées dans la boucle
208
+     *
209
+     * L'index est le nom d'alias (comme pour la propriété $from), et la valeur
210
+     * un type de jointure parmi 'INNER', 'LEFT', 'RIGHT', 'OUTER'.
211
+     *
212
+     * Lorsque le type n'est pas déclaré pour un alias, c'est 'INNER'
213
+     * qui sera utilisé par défaut (créant donc un INNER JOIN).
214
+     *
215
+     * @var string[]
216
+     */
217
+    public array $from_type = [];
218
+
219
+    /**
220
+     * Liste des conditions WHERE de la boucle
221
+     *
222
+     * Permet de restreindre les éléments retournés par une boucle
223
+     * en fonctions des conditions transmises dans ce tableau.
224
+     *
225
+     * Ce tableau peut avoir plusieurs niveaux de profondeur.
226
+     *
227
+     * Les éléments du premier niveau sont reliés par des AND, donc
228
+     * chaque élément ajouté directement au where par
229
+     * $boucle->where[] = array(...) ou $boucle->where[] = "'expression'"
230
+     * est une condition AND en plus.
231
+     *
232
+     * Par contre, lorsqu'on indique un tableau, il peut décrire des relations
233
+     * internes différentes. Soit $expr un tableau d'expressions quelconques de 3 valeurs :
234
+     * $expr = array(operateur, val1, val2)
235
+     *
236
+     * Ces 3 valeurs sont des expressions PHP. L'index 0 désigne l'opérateur
237
+     * à réaliser tel que :
238
+     *
239
+     * - "'='" , "'>='", "'<'", "'IN'", "'REGEXP'", "'LIKE'", ... :
240
+     *    val1 et val2 sont des champs et valeurs à utiliser dans la comparaison
241
+     *    suivant cet ordre : "val1 operateur val2".
242
+     *    Exemple : $boucle->where[] = array("'='", "'articles.statut'", "'\"publie\"'");
243
+     * - "'AND'", "'OR'", "'NOT'" :
244
+     *    dans ce cas val1 et val2 sont également des expressions
245
+     *    de comparaison complètes, et peuvent être eux-même des tableaux comme $expr
246
+     *    Exemples :
247
+     *    $boucle->where[] = array("'OR'", $expr1, $expr2);
248
+     *    $boucle->where[] = array("'NOT'", $expr); // val2 n'existe pas avec NOT
249
+     *
250
+     * D'autres noms sont possibles pour l'opérateur (le nombre de valeurs diffère) :
251
+     * - "'SELF'", "'SUBSELECT'" : indiquent des sous requêtes
252
+     * - "'?'" : indique une condition à faire évaluer (val1 ? val2 : val3)
253
+     */
254
+    public array $where = [];
255
+
256
+    public array $join = [];
257
+    public array $having = [];
258
+    public $limit = '';
259
+    public array $group = [];
260
+    public array $order = [];
261
+    public array $default_order = [];
262
+    public string $date = 'date';
263
+    public string $hash = '';
264
+    public $in = '';
265
+    public bool $sous_requete = false;
266
+
267
+    /**
268
+     * Code PHP qui sera ajouté en tout début de la fonction de boucle
269
+     *
270
+     * Il sert à insérer le code calculant une hierarchie
271
+     */
272
+    public string $hierarchie = '';
273
+
274
+    // champs pour la construction du corps PHP
275
+
276
+    /**
277
+     * Description des sources de données de la boucle
278
+     *
279
+     * Description des données de la boucle issu de trouver_table
280
+     * dans le cadre de l'itérateur SQL et contenant au moins l'index 'field'.
281
+     *
282
+     * @see base_trouver_table_dist()
283
+     */
284
+    public array $show = [];
285
+
286
+    /**
287
+     * Nom de la table SQL principale de la boucle, sans son préfixe
288
+     */
289
+    public string $id_table = '';
290
+
291
+    /**
292
+     * Nom de la clé primaire de la table SQL principale de la boucle
293
+     */
294
+    public string $primary = '';
295
+
296
+    /**
297
+     * Code PHP compilé de la boucle
298
+     *
299
+     * FIXME: un seul type (string ?)
300
+     *
301
+     * - false: boucle fautive ?
302
+     *
303
+     * @var string|false
304
+     */
305
+    public $return = '';
306
+
307
+    public $numrows = false;
308
+    public $cptrows = false;
309
+
310
+    /**
311
+     * Description du squelette
312
+     *
313
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
314
+     *
315
+     * Peut contenir les index :
316
+     *
317
+     * - nom : Nom du fichier de cache
318
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
319
+     * - sourcefile : Chemin du squelette
320
+     * - squelette : Code du squelette
321
+     * - id_mere : Identifiant de la boucle parente
322
+     * - documents : Pour embed et img dans les textes
323
+     * - session : Pour un cache sessionné par auteur
324
+     * - niv : Niveau de tabulation
325
+     */
326
+    public array $descr = [];
327
+
328
+    /** Numéro de ligne dans le code source du squelette */
329
+    public int $ligne = 0;
330
+
331
+
332
+    /**
333
+     * table pour stocker les modificateurs de boucle tels que tout, plat ...,
334
+     * utilisable par les plugins egalement
335
+     *
336
+     * @var array<string, mixed>
337
+     */
338
+    public array $modificateur = [];
339
+
340
+    /**
341
+     * Type d'itérateur utilisé pour cette boucle
342
+     *
343
+     * - 'SQL' dans le cadre d'une boucle sur une table SQL
344
+     * - 'DATA' pour l'itérateur DATA, ...
345
+     *
346
+     * @var string
347
+     */
348
+    public string $iterateur = ''; // type d'iterateur
349
+
350
+    /**
351
+     * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug
352
+     */
353
+    public array $debug = [];
354
+
355
+    /**
356
+     * Index de la boucle dont le champ présent dans cette boucle est originaire,
357
+     * notamment si le champ a été trouve dans une boucle parente
358
+     *
359
+     * Tableau nom du champ => index de boucle
360
+     */
361
+    public array $index_champ = [];
362
+
363
+    /** Résultat de la compilation (?) (sert au débusqueur) */
364
+    public string $code = '';
365
+
366
+    /** Source des filtres (compatibilité) (?) */
367
+    public array $fonctions = [];
368
+
369
+    // obsoletes, conserves provisoirement pour compatibilite
370
+    public $tout = false;
371
+    public $plat = false;
372
+    public $lien = false;
373 373
 }
Please login to merge, or discard this patch.
ecrire/src/Compilateur/Noeud/Inclure.php 1 patch
Indentation   +52 added lines, -52 removed lines patch added patch discarded remove patch
@@ -7,63 +7,63 @@
 block discarded – undo
7 7
  **/
8 8
 class Inclure
9 9
 {
10
-	/** Type de noeud */
11
-	public string $type = 'include';
10
+    /** Type de noeud */
11
+    public string $type = 'include';
12 12
 
13
-	/**
14
-	 * Nom d'un fichier inclu
15
-	 *
16
-	 * - Objet Texte si inclusion d'un autre squelette
17
-	 * - chaîne si inclusion d'un fichier PHP directement
18
-	 *
19
-	 * @var string|Texte
20
-	 */
21
-	public $texte;
13
+    /**
14
+     * Nom d'un fichier inclu
15
+     *
16
+     * - Objet Texte si inclusion d'un autre squelette
17
+     * - chaîne si inclusion d'un fichier PHP directement
18
+     *
19
+     * @var string|Texte
20
+     */
21
+    public $texte;
22 22
 
23
-	/**
24
-	 * Inutilisé, propriété générique de l'AST
25
-	 *
26
-	 * @var string|array
27
-	 */
28
-	public $avant = '';
23
+    /**
24
+     * Inutilisé, propriété générique de l'AST
25
+     *
26
+     * @var string|array
27
+     */
28
+    public $avant = '';
29 29
 
30
-	/**
31
-	 * Inutilisé, propriété générique de l'AST
32
-	 *
33
-	 * @var string|array
34
-	 */
35
-	public $apres = '';
30
+    /**
31
+     * Inutilisé, propriété générique de l'AST
32
+     *
33
+     * @var string|array
34
+     */
35
+    public $apres = '';
36 36
 
37
-	/** Numéro de ligne dans le code source du squelette */
38
-	public int $ligne = 0;
37
+    /** Numéro de ligne dans le code source du squelette */
38
+    public int $ligne = 0;
39 39
 
40
-	/**
41
-	 * Valeurs des paramètres
42
-	 *
43
-	 * FIXME: type unique.
44
-	 * @var false|array
45
-	 *     - false: erreur de syntaxe
46
-	 */
47
-	public $param = [];
40
+    /**
41
+     * Valeurs des paramètres
42
+     *
43
+     * FIXME: type unique.
44
+     * @var false|array
45
+     *     - false: erreur de syntaxe
46
+     */
47
+    public $param = [];
48 48
 
49
-	/** Source des filtres (compatibilité) (?) */
50
-	public array $fonctions = [];
49
+    /** Source des filtres (compatibilité) (?) */
50
+    public array $fonctions = [];
51 51
 
52
-	/**
53
-	 * Description du squelette
54
-	 *
55
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
56
-	 *
57
-	 * Peut contenir les index :
58
-	 *
59
-	 * - nom : Nom du fichier de cache
60
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
61
-	 * - sourcefile : Chemin du squelette
62
-	 * - squelette : Code du squelette
63
-	 * - id_mere : Identifiant de la boucle parente
64
-	 * - documents : Pour embed et img dans les textes
65
-	 * - session : Pour un cache sessionné par auteur
66
-	 * - niv : Niveau de tabulation
67
-	 */
68
-	public array $descr = [];
52
+    /**
53
+     * Description du squelette
54
+     *
55
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
56
+     *
57
+     * Peut contenir les index :
58
+     *
59
+     * - nom : Nom du fichier de cache
60
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
61
+     * - sourcefile : Chemin du squelette
62
+     * - squelette : Code du squelette
63
+     * - id_mere : Identifiant de la boucle parente
64
+     * - documents : Pour embed et img dans les textes
65
+     * - session : Pour un cache sessionné par auteur
66
+     * - niv : Niveau de tabulation
67
+     */
68
+    public array $descr = [];
69 69
 }
Please login to merge, or discard this patch.
ecrire/src/Compilateur/Noeud/Texte.php 1 patch
Indentation   +22 added lines, -22 removed lines patch added patch discarded remove patch
@@ -7,30 +7,30 @@
 block discarded – undo
7 7
  **/
8 8
 class Texte
9 9
 {
10
-	/** Type de noeud */
11
-	public string $type = 'texte';
10
+    /** Type de noeud */
11
+    public string $type = 'texte';
12 12
 
13
-	/** Le texte */
14
-	public string $texte;
13
+    /** Le texte */
14
+    public string $texte;
15 15
 
16
-	/**
17
-	 * Contenu avant le texte.
18
-	 *
19
-	 * Vide ou apostrophe simple ou double si le texte en était entouré
20
-	 *
21
-	 * @var string|array
22
-	 */
23
-	public $avant = '';
16
+    /**
17
+     * Contenu avant le texte.
18
+     *
19
+     * Vide ou apostrophe simple ou double si le texte en était entouré
20
+     *
21
+     * @var string|array
22
+     */
23
+    public $avant = '';
24 24
 
25
-	/**
26
-	 * Contenu après le texte.
27
-	 *
28
-	 * Vide ou apostrophe simple ou double si le texte en était entouré
29
-	 *
30
-	 * @var string|array
31
-	 */
32
-	public $apres = '';
25
+    /**
26
+     * Contenu après le texte.
27
+     *
28
+     * Vide ou apostrophe simple ou double si le texte en était entouré
29
+     *
30
+     * @var string|array
31
+     */
32
+    public $apres = '';
33 33
 
34
-	/** Numéro de ligne dans le code source du squelette */
35
-	public int $ligne = 0;
34
+    /** Numéro de ligne dans le code source du squelette */
35
+    public int $ligne = 0;
36 36
 }
Please login to merge, or discard this patch.
ecrire/src/Compilateur/Noeud/Critere.php 1 patch
Indentation   +28 added lines, -28 removed lines patch added patch discarded remove patch
@@ -8,32 +8,32 @@
 block discarded – undo
8 8
  * Sous-noeud de Boucle
9 9
  **/
10 10
 class Critere {
11
-	/** Type de noeud */
12
-	public string $type = 'critere';
13
-
14
-	/** Opérateur (>, <, >=, IN, ...) */
15
-	public ?string $op;
16
-
17
-	/** Présence d'une négation (truc !op valeur) */
18
-	public bool $not = false;
19
-
20
-	/** Présence d'une exclusion (!truc op valeur) */
21
-	public string $exclus = '';
22
-
23
-	/** Présence d'une condition dans le critère (truc ?) */
24
-	public bool $cond = false;
25
-
26
-	/**
27
-	 * Paramètres du critère
28
-	 * - $param[0] : élément avant l'opérateur
29
-	 * - $param[1..n] : éléments après l'opérateur
30
-	 *
31
-	 * FIXME: type unique.
32
-	 * @var false|array
33
-	 *     - false: erreur de syntaxe
34
-	 */
35
-	public $param = [];
36
-
37
-	/** Numéro de ligne dans le code source du squelette */
38
-	public int $ligne = 0;
11
+    /** Type de noeud */
12
+    public string $type = 'critere';
13
+
14
+    /** Opérateur (>, <, >=, IN, ...) */
15
+    public ?string $op;
16
+
17
+    /** Présence d'une négation (truc !op valeur) */
18
+    public bool $not = false;
19
+
20
+    /** Présence d'une exclusion (!truc op valeur) */
21
+    public string $exclus = '';
22
+
23
+    /** Présence d'une condition dans le critère (truc ?) */
24
+    public bool $cond = false;
25
+
26
+    /**
27
+     * Paramètres du critère
28
+     * - $param[0] : élément avant l'opérateur
29
+     * - $param[1..n] : éléments après l'opérateur
30
+     *
31
+     * FIXME: type unique.
32
+     * @var false|array
33
+     *     - false: erreur de syntaxe
34
+     */
35
+    public $param = [];
36
+
37
+    /** Numéro de ligne dans le code source du squelette */
38
+    public int $ligne = 0;
39 39
 }
Please login to merge, or discard this patch.
ecrire/src/Compilateur/Noeud/Champ.php 1 patch
Indentation   +98 added lines, -98 removed lines patch added patch discarded remove patch
@@ -7,102 +7,102 @@
 block discarded – undo
7 7
  */
8 8
 class Champ
9 9
 {
10
-	/** Type de noeud */
11
-	public string $type = 'champ';
12
-
13
-	/** Nom du champ demandé. Exemple 'ID_ARTICLE' */
14
-	public ?string $nom_champ;
15
-
16
-	/** Identifiant de la boucle parente si explicité */
17
-	public ?string $nom_boucle = '';
18
-
19
-	/**
20
-	 * Partie optionnelle avant
21
-	 *
22
-	 * @var null|string|array
23
-	 */
24
-	public $avant;
25
-
26
-	/**
27
-	 * Partie optionnelle après
28
-	 *
29
-	 * @var null|string|array
30
-	 */
31
-	public $apres;
32
-
33
-	/**
34
-	 * Étoiles : annuler des automatismes
35
-	 *
36
-	 * - '*' annule les filtres automatiques
37
-	 * - '**' annule en plus les protections de scripts
38
-	 */
39
-	public ?string $etoile;
40
-
41
-	/**
42
-	 * Arguments et filtres explicites sur la balise
43
-	 *
44
-	 * - $param[0] contient les arguments de la balise
45
-	 * - $param[1..n] contient les filtres à appliquer à la balise
46
-	 *
47
-	 * FIXME: type unique.
48
-	 * @var false|array
49
-	 *     - false: erreur de syntaxe
50
-	 */
51
-	public $param = [];
52
-
53
-	/** Source des filtres (compatibilité) (?) */
54
-	public array $fonctions = [];
55
-
56
-	/**
57
-	 * Identifiant de la boucle
58
-	 *
59
-	 * @var string
60
-	 */
61
-	public $id_boucle = '';
62
-
63
-	/**
64
-	 * AST du squelette, liste de toutes les boucles
65
-	 *
66
-	 * @var Boucle[]
67
-	 */
68
-	public array $boucles;
69
-
70
-	/** Alias de table d'application de la requête ou nom complet de la table SQL */
71
-	public ?string $type_requete;
72
-
73
-	/** Résultat de la compilation: toujours une expression PHP */
74
-	public string $code = '';
75
-
76
-	/**
77
-	 * Interdire les scripts
78
-	 *
79
-	 * false si on est sûr de cette balise
80
-	 *
81
-	 * @see interdire_scripts()
82
-	 */
83
-	public bool $interdire_scripts = true;
84
-
85
-	/**
86
-	 * Description du squelette
87
-	 *
88
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
89
-	 *
90
-	 * Peut contenir les index :
91
-	 *
92
-	 * - nom : Nom du fichier de cache
93
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
94
-	 * - sourcefile : Chemin du squelette
95
-	 * - squelette : Code du squelette
96
-	 * - id_mere : Identifiant de la boucle parente
97
-	 * - documents : Pour embed et img dans les textes
98
-	 * - session : Pour un cache sessionné par auteur
99
-	 * - niv : Niveau de tabulation
100
-	 */
101
-	public array $descr = [];
102
-
103
-	/** Numéro de ligne dans le code source du squelette*/
104
-	public int $ligne = 0;
105
-
106
-	/** Drapeau pour reperer les balises calculées par une fonction explicite */
107
-	public bool $balise_calculee = false;
10
+    /** Type de noeud */
11
+    public string $type = 'champ';
12
+
13
+    /** Nom du champ demandé. Exemple 'ID_ARTICLE' */
14
+    public ?string $nom_champ;
15
+
16
+    /** Identifiant de la boucle parente si explicité */
17
+    public ?string $nom_boucle = '';
18
+
19
+    /**
20
+     * Partie optionnelle avant
21
+     *
22
+     * @var null|string|array
23
+     */
24
+    public $avant;
25
+
26
+    /**
27
+     * Partie optionnelle après
28
+     *
29
+     * @var null|string|array
30
+     */
31
+    public $apres;
32
+
33
+    /**
34
+     * Étoiles : annuler des automatismes
35
+     *
36
+     * - '*' annule les filtres automatiques
37
+     * - '**' annule en plus les protections de scripts
38
+     */
39
+    public ?string $etoile;
40
+
41
+    /**
42
+     * Arguments et filtres explicites sur la balise
43
+     *
44
+     * - $param[0] contient les arguments de la balise
45
+     * - $param[1..n] contient les filtres à appliquer à la balise
46
+     *
47
+     * FIXME: type unique.
48
+     * @var false|array
49
+     *     - false: erreur de syntaxe
50
+     */
51
+    public $param = [];
52
+
53
+    /** Source des filtres (compatibilité) (?) */
54
+    public array $fonctions = [];
55
+
56
+    /**
57
+     * Identifiant de la boucle
58
+     *
59
+     * @var string
60
+     */
61
+    public $id_boucle = '';
62
+
63
+    /**
64
+     * AST du squelette, liste de toutes les boucles
65
+     *
66
+     * @var Boucle[]
67
+     */
68
+    public array $boucles;
69
+
70
+    /** Alias de table d'application de la requête ou nom complet de la table SQL */
71
+    public ?string $type_requete;
72
+
73
+    /** Résultat de la compilation: toujours une expression PHP */
74
+    public string $code = '';
75
+
76
+    /**
77
+     * Interdire les scripts
78
+     *
79
+     * false si on est sûr de cette balise
80
+     *
81
+     * @see interdire_scripts()
82
+     */
83
+    public bool $interdire_scripts = true;
84
+
85
+    /**
86
+     * Description du squelette
87
+     *
88
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
89
+     *
90
+     * Peut contenir les index :
91
+     *
92
+     * - nom : Nom du fichier de cache
93
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
94
+     * - sourcefile : Chemin du squelette
95
+     * - squelette : Code du squelette
96
+     * - id_mere : Identifiant de la boucle parente
97
+     * - documents : Pour embed et img dans les textes
98
+     * - session : Pour un cache sessionné par auteur
99
+     * - niv : Niveau de tabulation
100
+     */
101
+    public array $descr = [];
102
+
103
+    /** Numéro de ligne dans le code source du squelette*/
104
+    public int $ligne = 0;
105
+
106
+    /** Drapeau pour reperer les balises calculées par une fonction explicite */
107
+    public bool $balise_calculee = false;
108 108
 }
Please login to merge, or discard this patch.
ecrire/src/Compilateur/Noeud/Polyglotte.php 1 patch
Indentation   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -9,16 +9,16 @@
 block discarded – undo
9 9
  **/
10 10
 class Polyglotte
11 11
 {
12
-	/** Type de noeud */
13
-	public string $type = 'polyglotte';
12
+    /** Type de noeud */
13
+    public string $type = 'polyglotte';
14 14
 
15
-	/**
16
-	 * Tableau des traductions possibles classées par langue
17
-	 *
18
-	 * Tableau code de langue => texte
19
-	 */
20
-	public array $traductions = [];
15
+    /**
16
+     * Tableau des traductions possibles classées par langue
17
+     *
18
+     * Tableau code de langue => texte
19
+     */
20
+    public array $traductions = [];
21 21
 
22
-	/** Numéro de ligne dans le code source du squelette */
23
-	public int $ligne = 0;
22
+    /** Numéro de ligne dans le code source du squelette */
23
+    public int $ligne = 0;
24 24
 }
Please login to merge, or discard this patch.
ecrire/src/Compilateur/Noeud/Contexte.php 1 patch
Indentation   +25 added lines, -25 removed lines patch added patch discarded remove patch
@@ -14,33 +14,33 @@
 block discarded – undo
14 14
  */
15 15
 class Contexte
16 16
 {
17
-	/**
18
-	 * Description du squelette
19
-	 *
20
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
21
-	 *
22
-	 * Peut contenir les index :
23
-	 *
24
-	 * - nom : Nom du fichier de cache
25
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
26
-	 * - sourcefile : Chemin du squelette
27
-	 * - squelette : Code du squelette
28
-	 * - id_mere : Identifiant de la boucle parente
29
-	 * - documents : Pour embed et img dans les textes
30
-	 * - session : Pour un cache sessionné par auteur
31
-	 * - niv : Niveau de tabulation
32
-	 */
33
-	public array $descr = [];
17
+    /**
18
+     * Description du squelette
19
+     *
20
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
21
+     *
22
+     * Peut contenir les index :
23
+     *
24
+     * - nom : Nom du fichier de cache
25
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
26
+     * - sourcefile : Chemin du squelette
27
+     * - squelette : Code du squelette
28
+     * - id_mere : Identifiant de la boucle parente
29
+     * - documents : Pour embed et img dans les textes
30
+     * - session : Pour un cache sessionné par auteur
31
+     * - niv : Niveau de tabulation
32
+     */
33
+    public array $descr = [];
34 34
 
35
-	/** Identifiant de la boucle */
36
-	public string $id_boucle = '';
35
+    /** Identifiant de la boucle */
36
+    public string $id_boucle = '';
37 37
 
38
-	/** Numéro de ligne dans le code source du squelette */
39
-	public int $ligne = 0;
38
+    /** Numéro de ligne dans le code source du squelette */
39
+    public int $ligne = 0;
40 40
 
41
-	/** Langue d'exécution */
42
-	public string $lang = '';
41
+    /** Langue d'exécution */
42
+    public string $lang = '';
43 43
 
44
-	/** Résultat de la compilation: toujours une expression PHP */
45
-	public string $code = '';
44
+    /** Résultat de la compilation: toujours une expression PHP */
45
+    public string $code = '';
46 46
 }
Please login to merge, or discard this patch.
ecrire/src/Compilateur/Noeud/Idiome.php 1 patch
Indentation   +81 added lines, -81 removed lines patch added patch discarded remove patch
@@ -7,85 +7,85 @@
 block discarded – undo
7 7
  **/
8 8
 class Idiome
9 9
 {
10
-	/** Type de noeud */
11
-	public string $type = 'idiome';
12
-
13
-	/** Clé de traduction demandée. Exemple 'item_oui' */
14
-	public string $nom_champ = '';
15
-
16
-	/** Module de langue où chercher la clé de traduction. Exemple 'medias' */
17
-	public string $module = '';
18
-
19
-	/** Arguments à passer à la chaîne */
20
-	public array $arg = [];
21
-
22
-	/**
23
-	 * Filtres à appliquer au résultat
24
-	 *
25
-	 *
26
-	 * * FIXME: type unique.
27
-	 * @var false|array
28
-	 *     - false: erreur de syntaxe
29
-	 */
30
-	public $param = [];
31
-
32
-	/** Source des filtres (compatibilité) (?) */
33
-	public array $fonctions = [];
34
-
35
-	/**
36
-	 * Inutilisé, propriété générique de l'AST
37
-	 *
38
-	 * @var string|array
39
-	 */
40
-	public $avant = '';
41
-
42
-	/**
43
-	 * Inutilisé, propriété générique de l'AST
44
-	 *
45
-	 * @var string|array
46
-	 */
47
-	public $apres = '';
48
-
49
-	/** Identifiant de la boucle */
50
-	public string $id_boucle = '';
51
-
52
-	/**
53
-	 * AST du squelette, liste de toutes les boucles
54
-	 *
55
-	 * @var Boucle[]
56
-	 */
57
-	public array $boucles;
58
-
59
-	/** Alias de table d'application de la requête ou nom complet de la table SQL */
60
-	public ?string $type_requete;
61
-
62
-	/** Résultat de la compilation: toujours une expression PHP */
63
-	public string $code = '';
64
-
65
-	/**
66
-	 * Interdire les scripts
67
-	 *
68
-	 * @see interdire_scripts()
69
-	 */
70
-	public bool $interdire_scripts = false;
71
-
72
-	/**
73
-	 * Description du squelette
74
-	 *
75
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
76
-	 *
77
-	 * Peut contenir les index :
78
-	 * - nom : Nom du fichier de cache
79
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
80
-	 * - sourcefile : Chemin du squelette
81
-	 * - squelette : Code du squelette
82
-	 * - id_mere : Identifiant de la boucle parente
83
-	 * - documents : Pour embed et img dans les textes
84
-	 * - session : Pour un cache sessionné par auteur
85
-	 * - niv : Niveau de tabulation
86
-	 */
87
-	public array $descr = [];
88
-
89
-	/** Numéro de ligne dans le code source du squelette */
90
-	public int $ligne = 0;
10
+    /** Type de noeud */
11
+    public string $type = 'idiome';
12
+
13
+    /** Clé de traduction demandée. Exemple 'item_oui' */
14
+    public string $nom_champ = '';
15
+
16
+    /** Module de langue où chercher la clé de traduction. Exemple 'medias' */
17
+    public string $module = '';
18
+
19
+    /** Arguments à passer à la chaîne */
20
+    public array $arg = [];
21
+
22
+    /**
23
+     * Filtres à appliquer au résultat
24
+     *
25
+     *
26
+     * * FIXME: type unique.
27
+     * @var false|array
28
+     *     - false: erreur de syntaxe
29
+     */
30
+    public $param = [];
31
+
32
+    /** Source des filtres (compatibilité) (?) */
33
+    public array $fonctions = [];
34
+
35
+    /**
36
+     * Inutilisé, propriété générique de l'AST
37
+     *
38
+     * @var string|array
39
+     */
40
+    public $avant = '';
41
+
42
+    /**
43
+     * Inutilisé, propriété générique de l'AST
44
+     *
45
+     * @var string|array
46
+     */
47
+    public $apres = '';
48
+
49
+    /** Identifiant de la boucle */
50
+    public string $id_boucle = '';
51
+
52
+    /**
53
+     * AST du squelette, liste de toutes les boucles
54
+     *
55
+     * @var Boucle[]
56
+     */
57
+    public array $boucles;
58
+
59
+    /** Alias de table d'application de la requête ou nom complet de la table SQL */
60
+    public ?string $type_requete;
61
+
62
+    /** Résultat de la compilation: toujours une expression PHP */
63
+    public string $code = '';
64
+
65
+    /**
66
+     * Interdire les scripts
67
+     *
68
+     * @see interdire_scripts()
69
+     */
70
+    public bool $interdire_scripts = false;
71
+
72
+    /**
73
+     * Description du squelette
74
+     *
75
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
76
+     *
77
+     * Peut contenir les index :
78
+     * - nom : Nom du fichier de cache
79
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
80
+     * - sourcefile : Chemin du squelette
81
+     * - squelette : Code du squelette
82
+     * - id_mere : Identifiant de la boucle parente
83
+     * - documents : Pour embed et img dans les textes
84
+     * - session : Pour un cache sessionné par auteur
85
+     * - niv : Niveau de tabulation
86
+     */
87
+    public array $descr = [];
88
+
89
+    /** Numéro de ligne dans le code source du squelette */
90
+    public int $ligne = 0;
91 91
 }
Please login to merge, or discard this patch.