Completed
Push — master ( 23dea2...2a7532 )
by cam
06:32 queued 02:13
created
ecrire/public/composer.php 2 patches
Indentation   +735 added lines, -735 removed lines patch added patch discarded remove patch
@@ -18,7 +18,7 @@  discard block
 block discarded – undo
18 18
  **/
19 19
 
20 20
 if (!defined('_ECRIRE_INC_VERSION')) {
21
-	return;
21
+    return;
22 22
 }
23 23
 
24 24
 include_spip('inc/texte');
@@ -43,239 +43,239 @@  discard block
 block discarded – undo
43 43
 // https://code.spip.net/@public_composer_dist
44 44
 function public_composer_dist($squelette, $mime_type, $gram, $source, $connect = '') {
45 45
 
46
-	$nom = calculer_nom_fonction_squel($squelette, $mime_type, $connect);
47
-
48
-	//  si deja en memoire (INCLURE  a repetition) c'est bon.
49
-	if (function_exists($nom)) {
50
-		return $nom;
51
-	}
52
-
53
-	if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
54
-		$GLOBALS['debug_objets']['courant'] = $nom;
55
-	}
56
-
57
-	$phpfile = sous_repertoire(_DIR_SKELS, '', false, true) . $nom . '.php';
58
-
59
-	// si squelette est deja compile et perenne, le charger
60
-	if (!squelette_obsolete($phpfile, $source)) {
61
-		include_once $phpfile;
62
-		#if (!squelette_obsolete($phpfile, $source)
63
-		#  AND lire_fichier ($phpfile, $skel_code,
64
-		#  array('critique' => 'oui', 'phpcheck' => 'oui'))){
65
-		## eval('?'.'>'.$skel_code);
66
-		#	 spip_log($skel_code, 'comp')
67
-		#}
68
-	}
69
-
70
-	if (file_exists($lib = $squelette . '_fonctions' . '.php')) {
71
-		include_once $lib;
72
-	}
73
-
74
-	// tester si le eval ci-dessus a mis le squelette en memoire
75
-
76
-	if (function_exists($nom)) {
77
-		return $nom;
78
-	}
79
-
80
-	// charger le source, si possible, et compiler 
81
-	$skel_code = '';
82
-	if (lire_fichier($source, $skel)) {
83
-		$compiler = charger_fonction('compiler', 'public');
84
-		$skel_code = $compiler($skel, $nom, $gram, $source, $connect);
85
-	}
86
-
87
-	// Ne plus rien faire si le compilateur n'a pas pu operer.
88
-	if (!$skel_code) {
89
-		return false;
90
-	}
91
-
92
-	foreach ($skel_code as $id => $boucle) {
93
-		$f = $boucle->return;
94
-		try {
95
-			// @todo : a remplacer quand _PHP_MIN >= 7
96
-			// eval("return true; $f ;");
97
-			// PHP 5.x compat
98
-			if ($ok = @eval("return true; $f ;") === false) {
99
-				// Code syntaxiquement faux (critere etc mal programme')
100
-				$msg = _T('zbug_erreur_compilation');
101
-				erreur_squelette($msg, $boucle);
102
-				// continuer pour trouver d'autres fautes eventuelles
103
-				// mais prevenir que c'est mort
104
-				$nom = '';
105
-			}
106
-		} catch (\ParseError $e) {
107
-			// Code syntaxiquement faux (critere etc mal programme')
108
-			$msg = _T('zbug_erreur_compilation') . ' | Line ' . $e->getLine() . ' : ' . $e->getMessage();
109
-			erreur_squelette($msg, $boucle);
110
-			// continuer pour trouver d'autres fautes eventuelles
111
-			// mais prevenir que c'est mort
112
-			$nom = '';
113
-		}
114
-
115
-		// Contexte de compil inutile a present
116
-		// (mais la derniere valeur de $boucle est utilisee ci-dessous)
117
-		$skel_code[$id] = $f;
118
-	}
119
-
120
-	$code = '';
121
-	if ($nom) {
122
-		// Si le code est bon, concatener et mettre en cache
123
-		if (function_exists($nom)) {
124
-			$code = squelette_traduit($skel, $source, $phpfile, $skel_code);
125
-		} else {
126
-			// code semantiquement faux: bug du compilateur
127
-			// $boucle est en fait ici la fct principale du squelette
128
-			$msg = _T('zbug_erreur_compilation');
129
-			erreur_squelette($msg, $boucle);
130
-			$nom = '';
131
-		}
132
-	}
133
-
134
-	if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
135
-
136
-		// Tracer ce qui vient d'etre compile
137
-		$GLOBALS['debug_objets']['code'][$nom . 'tout'] = $code;
138
-
139
-		// si c'est ce que demande le debusqueur, lui passer la main
140
-		if ($GLOBALS['debug_objets']['sourcefile']
141
-			and (_request('var_mode_objet') == $nom)
142
-			and (_request('var_mode_affiche') == 'code')
143
-		) {
144
-			erreur_squelette();
145
-		}
146
-	}
147
-
148
-	return $nom ? $nom : false;
46
+    $nom = calculer_nom_fonction_squel($squelette, $mime_type, $connect);
47
+
48
+    //  si deja en memoire (INCLURE  a repetition) c'est bon.
49
+    if (function_exists($nom)) {
50
+        return $nom;
51
+    }
52
+
53
+    if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
54
+        $GLOBALS['debug_objets']['courant'] = $nom;
55
+    }
56
+
57
+    $phpfile = sous_repertoire(_DIR_SKELS, '', false, true) . $nom . '.php';
58
+
59
+    // si squelette est deja compile et perenne, le charger
60
+    if (!squelette_obsolete($phpfile, $source)) {
61
+        include_once $phpfile;
62
+        #if (!squelette_obsolete($phpfile, $source)
63
+        #  AND lire_fichier ($phpfile, $skel_code,
64
+        #  array('critique' => 'oui', 'phpcheck' => 'oui'))){
65
+        ## eval('?'.'>'.$skel_code);
66
+        #	 spip_log($skel_code, 'comp')
67
+        #}
68
+    }
69
+
70
+    if (file_exists($lib = $squelette . '_fonctions' . '.php')) {
71
+        include_once $lib;
72
+    }
73
+
74
+    // tester si le eval ci-dessus a mis le squelette en memoire
75
+
76
+    if (function_exists($nom)) {
77
+        return $nom;
78
+    }
79
+
80
+    // charger le source, si possible, et compiler 
81
+    $skel_code = '';
82
+    if (lire_fichier($source, $skel)) {
83
+        $compiler = charger_fonction('compiler', 'public');
84
+        $skel_code = $compiler($skel, $nom, $gram, $source, $connect);
85
+    }
86
+
87
+    // Ne plus rien faire si le compilateur n'a pas pu operer.
88
+    if (!$skel_code) {
89
+        return false;
90
+    }
91
+
92
+    foreach ($skel_code as $id => $boucle) {
93
+        $f = $boucle->return;
94
+        try {
95
+            // @todo : a remplacer quand _PHP_MIN >= 7
96
+            // eval("return true; $f ;");
97
+            // PHP 5.x compat
98
+            if ($ok = @eval("return true; $f ;") === false) {
99
+                // Code syntaxiquement faux (critere etc mal programme')
100
+                $msg = _T('zbug_erreur_compilation');
101
+                erreur_squelette($msg, $boucle);
102
+                // continuer pour trouver d'autres fautes eventuelles
103
+                // mais prevenir que c'est mort
104
+                $nom = '';
105
+            }
106
+        } catch (\ParseError $e) {
107
+            // Code syntaxiquement faux (critere etc mal programme')
108
+            $msg = _T('zbug_erreur_compilation') . ' | Line ' . $e->getLine() . ' : ' . $e->getMessage();
109
+            erreur_squelette($msg, $boucle);
110
+            // continuer pour trouver d'autres fautes eventuelles
111
+            // mais prevenir que c'est mort
112
+            $nom = '';
113
+        }
114
+
115
+        // Contexte de compil inutile a present
116
+        // (mais la derniere valeur de $boucle est utilisee ci-dessous)
117
+        $skel_code[$id] = $f;
118
+    }
119
+
120
+    $code = '';
121
+    if ($nom) {
122
+        // Si le code est bon, concatener et mettre en cache
123
+        if (function_exists($nom)) {
124
+            $code = squelette_traduit($skel, $source, $phpfile, $skel_code);
125
+        } else {
126
+            // code semantiquement faux: bug du compilateur
127
+            // $boucle est en fait ici la fct principale du squelette
128
+            $msg = _T('zbug_erreur_compilation');
129
+            erreur_squelette($msg, $boucle);
130
+            $nom = '';
131
+        }
132
+    }
133
+
134
+    if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
135
+
136
+        // Tracer ce qui vient d'etre compile
137
+        $GLOBALS['debug_objets']['code'][$nom . 'tout'] = $code;
138
+
139
+        // si c'est ce que demande le debusqueur, lui passer la main
140
+        if ($GLOBALS['debug_objets']['sourcefile']
141
+            and (_request('var_mode_objet') == $nom)
142
+            and (_request('var_mode_affiche') == 'code')
143
+        ) {
144
+            erreur_squelette();
145
+        }
146
+    }
147
+
148
+    return $nom ? $nom : false;
149 149
 }
150 150
 
151 151
 function squelette_traduit($squelette, $sourcefile, $phpfile, $boucles) {
152 152
 
153
-	// Le dernier index est '' (fonction principale)
154
-	$noms = substr(join(', ', array_keys($boucles)), 0, -2);
155
-	if (CODE_COMMENTE) {
156
-		$code = "
153
+    // Le dernier index est '' (fonction principale)
154
+    $noms = substr(join(', ', array_keys($boucles)), 0, -2);
155
+    if (CODE_COMMENTE) {
156
+        $code = "
157 157
 /*
158 158
  * Squelette : $sourcefile
159 159
  * Date :      " . gmdate("D, d M Y H:i:s", @filemtime($sourcefile)) . " GMT
160 160
  * Compile :   " . gmdate("D, d M Y H:i:s", time()) . " GMT
161 161
  * " . (!$boucles ? "Pas de boucle" : ("Boucles :   " . $noms)) . "
162 162
  */ ";
163
-	}
163
+    }
164 164
 
165
-	$code = '<' . "?php\n" . $code . join('', $boucles) . "\n?" . '>';
166
-	if (!defined('_VAR_NOCACHE') or !_VAR_NOCACHE) {
167
-		ecrire_fichier($phpfile, $code);
168
-	}
165
+    $code = '<' . "?php\n" . $code . join('', $boucles) . "\n?" . '>';
166
+    if (!defined('_VAR_NOCACHE') or !_VAR_NOCACHE) {
167
+        ecrire_fichier($phpfile, $code);
168
+    }
169 169
 
170
-	return $code;
170
+    return $code;
171 171
 }
172 172
 
173 173
 // Le squelette compile est-il trop vieux ?
174 174
 // https://code.spip.net/@squelette_obsolete
175 175
 function squelette_obsolete($skel, $squelette) {
176
-	static $date_change = null;
177
-	// ne verifier la date de mes_fonctions et mes_options qu'une seule fois
178
-	// par hit
179
-	if (is_null($date_change)) {
180
-		if (@file_exists($fonc = 'mes_fonctions.php')) {
181
-			$date_change = @filemtime($fonc);
182
-		} # compatibilite
183
-		if (defined('_FILE_OPTIONS')) {
184
-			$date_change = max($date_change, @filemtime(_FILE_OPTIONS));
185
-		}
186
-	}
187
-
188
-	return (
189
-		(defined('_VAR_MODE') and in_array(_VAR_MODE, array('recalcul', 'preview', 'debug')))
190
-		or !@file_exists($skel)
191
-		or ((@file_exists($squelette) ? @filemtime($squelette) : 0)
192
-			> ($date = @filemtime($skel)))
193
-		or ($date_change > $date)
194
-	);
176
+    static $date_change = null;
177
+    // ne verifier la date de mes_fonctions et mes_options qu'une seule fois
178
+    // par hit
179
+    if (is_null($date_change)) {
180
+        if (@file_exists($fonc = 'mes_fonctions.php')) {
181
+            $date_change = @filemtime($fonc);
182
+        } # compatibilite
183
+        if (defined('_FILE_OPTIONS')) {
184
+            $date_change = max($date_change, @filemtime(_FILE_OPTIONS));
185
+        }
186
+    }
187
+
188
+    return (
189
+        (defined('_VAR_MODE') and in_array(_VAR_MODE, array('recalcul', 'preview', 'debug')))
190
+        or !@file_exists($skel)
191
+        or ((@file_exists($squelette) ? @filemtime($squelette) : 0)
192
+            > ($date = @filemtime($skel)))
193
+        or ($date_change > $date)
194
+    );
195 195
 }
196 196
 
197 197
 // Activer l'invalideur de session
198 198
 // https://code.spip.net/@invalideur_session
199 199
 function invalideur_session(&$Cache, $code = null) {
200
-	$Cache['session'] = spip_session();
200
+    $Cache['session'] = spip_session();
201 201
 
202
-	return $code;
202
+    return $code;
203 203
 }
204 204
 
205 205
 
206 206
 // https://code.spip.net/@analyse_resultat_skel
207 207
 function analyse_resultat_skel($nom, $cache, $corps, $source = '') {
208
-	static $filtres = array();
209
-	$headers = array();
210
-
211
-	// Recupere les < ?php header('Xx: y'); ? > pour $page['headers']
212
-	// note: on essaie d'attrapper aussi certains de ces entetes codes
213
-	// "a la main" dans les squelettes, mais evidemment sans exhaustivite
214
-	if (stripos($corps, 'header') !== false
215
-		and preg_match_all(
216
-			'/(<[?]php\s+)@?header\s*\(\s*.([^:\'"]*):?\s*([^)]*)[^)]\s*\)\s*[;]?\s*[?]>/ims',
217
-			$corps, $regs, PREG_SET_ORDER)
218
-	) {
219
-		foreach ($regs as $r) {
220
-			$corps = str_replace($r[0], '', $corps);
221
-			# $j = Content-Type, et pas content-TYPE.
222
-			$j = join('-', array_map('ucwords', explode('-', strtolower($r[2]))));
223
-
224
-			if ($j == 'X-Spip-Filtre' and isset($headers[$j])) {
225
-				$headers[$j] .= "|" . $r[3];
226
-			} else {
227
-				$headers[$j] = $r[3];
228
-			}
229
-		}
230
-	}
231
-	// S'agit-il d'un resultat constant ou contenant du code php
232
-	$process_ins = (
233
-		strpos($corps, '<' . '?') === false
234
-		or
235
-		(strpos($corps, '<' . '?xml') !== false and
236
-			strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false)
237
-	)
238
-		? 'html'
239
-		: 'php';
240
-
241
-	$skel = array(
242
-		'squelette' => $nom,
243
-		'source' => $source,
244
-		'process_ins' => $process_ins,
245
-		'invalideurs' => $cache,
246
-		'entetes' => $headers,
247
-		'duree' => isset($headers['X-Spip-Cache']) ? intval($headers['X-Spip-Cache']) : 0
248
-	);
249
-
250
-	// traiter #FILTRE{} et filtres
251
-	if (!isset($filtres[$nom])) {
252
-		$filtres[$nom] = pipeline('declarer_filtres_squelettes', array('args' => $skel, 'data' => array()));
253
-	}
254
-	$filtres_headers = array();
255
-	if (isset($headers['X-Spip-Filtre']) and strlen($headers['X-Spip-Filtre'])) {
256
-		$filtres_headers = array_filter(explode('|', $headers['X-Spip-Filtre']));
257
-		unset($headers['X-Spip-Filtre']);
258
-	}
259
-	if (count($filtres[$nom]) or count($filtres_headers)) {
260
-		include_spip('public/sandbox');
261
-		$corps = sandbox_filtrer_squelette($skel, $corps, $filtres_headers, $filtres[$nom]);
262
-
263
-		if ($process_ins == 'html') {
264
-			$skel['process_ins'] = (
265
-				strpos($corps, '<' . '?') === false
266
-				or
267
-				(strpos($corps, '<' . '?xml') !== false and
268
-					strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false)
269
-			)
270
-				? 'html'
271
-				: 'php';
272
-		}
273
-	}
274
-
275
-	$skel['entetes'] = $headers;
276
-	$skel['texte'] = $corps;
277
-
278
-	return $skel;
208
+    static $filtres = array();
209
+    $headers = array();
210
+
211
+    // Recupere les < ?php header('Xx: y'); ? > pour $page['headers']
212
+    // note: on essaie d'attrapper aussi certains de ces entetes codes
213
+    // "a la main" dans les squelettes, mais evidemment sans exhaustivite
214
+    if (stripos($corps, 'header') !== false
215
+        and preg_match_all(
216
+            '/(<[?]php\s+)@?header\s*\(\s*.([^:\'"]*):?\s*([^)]*)[^)]\s*\)\s*[;]?\s*[?]>/ims',
217
+            $corps, $regs, PREG_SET_ORDER)
218
+    ) {
219
+        foreach ($regs as $r) {
220
+            $corps = str_replace($r[0], '', $corps);
221
+            # $j = Content-Type, et pas content-TYPE.
222
+            $j = join('-', array_map('ucwords', explode('-', strtolower($r[2]))));
223
+
224
+            if ($j == 'X-Spip-Filtre' and isset($headers[$j])) {
225
+                $headers[$j] .= "|" . $r[3];
226
+            } else {
227
+                $headers[$j] = $r[3];
228
+            }
229
+        }
230
+    }
231
+    // S'agit-il d'un resultat constant ou contenant du code php
232
+    $process_ins = (
233
+        strpos($corps, '<' . '?') === false
234
+        or
235
+        (strpos($corps, '<' . '?xml') !== false and
236
+            strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false)
237
+    )
238
+        ? 'html'
239
+        : 'php';
240
+
241
+    $skel = array(
242
+        'squelette' => $nom,
243
+        'source' => $source,
244
+        'process_ins' => $process_ins,
245
+        'invalideurs' => $cache,
246
+        'entetes' => $headers,
247
+        'duree' => isset($headers['X-Spip-Cache']) ? intval($headers['X-Spip-Cache']) : 0
248
+    );
249
+
250
+    // traiter #FILTRE{} et filtres
251
+    if (!isset($filtres[$nom])) {
252
+        $filtres[$nom] = pipeline('declarer_filtres_squelettes', array('args' => $skel, 'data' => array()));
253
+    }
254
+    $filtres_headers = array();
255
+    if (isset($headers['X-Spip-Filtre']) and strlen($headers['X-Spip-Filtre'])) {
256
+        $filtres_headers = array_filter(explode('|', $headers['X-Spip-Filtre']));
257
+        unset($headers['X-Spip-Filtre']);
258
+    }
259
+    if (count($filtres[$nom]) or count($filtres_headers)) {
260
+        include_spip('public/sandbox');
261
+        $corps = sandbox_filtrer_squelette($skel, $corps, $filtres_headers, $filtres[$nom]);
262
+
263
+        if ($process_ins == 'html') {
264
+            $skel['process_ins'] = (
265
+                strpos($corps, '<' . '?') === false
266
+                or
267
+                (strpos($corps, '<' . '?xml') !== false and
268
+                    strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false)
269
+            )
270
+                ? 'html'
271
+                : 'php';
272
+        }
273
+    }
274
+
275
+    $skel['entetes'] = $headers;
276
+    $skel['texte'] = $corps;
277
+
278
+    return $skel;
279 279
 }
280 280
 
281 281
 //
@@ -289,7 +289,7 @@  discard block
 block discarded – undo
289 289
 inserer_balise_dynamique(balise_%s_dyn(%s), array(%s));
290 290
 if ($lang_select) lang_select();
291 291
 ?'
292
-	. '>');
292
+    . '>');
293 293
 
294 294
 /**
295 295
  * Synthétise une balise dynamique : crée l'appel à l'inclusion
@@ -309,33 +309,33 @@  discard block
 block discarded – undo
309 309
  *     Code PHP pour inclure le squelette de la balise dynamique
310 310
  **/
311 311
 function synthetiser_balise_dynamique($nom, $args, $file, $context_compil) {
312
-	if (
313
-		strncmp($file, "/", 1) !== 0 
314
-		// pas de lien symbolique sous Windows
315
-		and !(stristr(PHP_OS, 'WIN') and strpos($file, ':') !== false)
316
-	) {
317
-		$file = './" . _DIR_RACINE . "' . $file;
318
-	}
319
-
320
-	$lang = $context_compil[4];
321
-	if (preg_match(",\W,", $lang)) {
322
-		$lang = '';
323
-	}
324
-
325
-	$args = array_map('argumenter_squelette', $args);
326
-	if (!empty($context_compil['appel_php_depuis_modele'])) {
327
-		$args[0] = 'arguments_balise_dyn_depuis_modele('.$args[0].')';
328
-	}
329
-	$args = join(', ', $args);
330
-
331
-	$r = sprintf(CODE_INCLURE_BALISE,
332
-		$file,
333
-		$lang,
334
-		$nom,
335
-		$args,
336
-		join(', ', array_map('_q', $context_compil)));
337
-
338
-	return $r;
312
+    if (
313
+        strncmp($file, "/", 1) !== 0 
314
+        // pas de lien symbolique sous Windows
315
+        and !(stristr(PHP_OS, 'WIN') and strpos($file, ':') !== false)
316
+    ) {
317
+        $file = './" . _DIR_RACINE . "' . $file;
318
+    }
319
+
320
+    $lang = $context_compil[4];
321
+    if (preg_match(",\W,", $lang)) {
322
+        $lang = '';
323
+    }
324
+
325
+    $args = array_map('argumenter_squelette', $args);
326
+    if (!empty($context_compil['appel_php_depuis_modele'])) {
327
+        $args[0] = 'arguments_balise_dyn_depuis_modele('.$args[0].')';
328
+    }
329
+    $args = join(', ', $args);
330
+
331
+    $r = sprintf(CODE_INCLURE_BALISE,
332
+        $file,
333
+        $lang,
334
+        $nom,
335
+        $args,
336
+        join(', ', array_map('_q', $context_compil)));
337
+
338
+    return $r;
339 339
 }
340 340
 
341 341
 /**
@@ -353,18 +353,18 @@  discard block
 block discarded – undo
353 353
  **/
354 354
 function argumenter_squelette($v) {
355 355
 
356
-	if (is_object($v)) {
357
-		return var_export($v, true);
358
-	} elseif (!is_array($v)) {
359
-		return "'" . texte_script($v) . "'";
360
-	} else {
361
-		$out = array();
362
-		foreach ($v as $k => $val) {
363
-			$out [] = argumenter_squelette($k) . '=>' . argumenter_squelette($val);
364
-		}
365
-
366
-		return 'array(' . join(", ", $out) . ')';
367
-	}
356
+    if (is_object($v)) {
357
+        return var_export($v, true);
358
+    } elseif (!is_array($v)) {
359
+        return "'" . texte_script($v) . "'";
360
+    } else {
361
+        $out = array();
362
+        foreach ($v as $k => $val) {
363
+            $out [] = argumenter_squelette($k) . '=>' . argumenter_squelette($val);
364
+        }
365
+
366
+        return 'array(' . join(", ", $out) . ')';
367
+    }
368 368
 }
369 369
 
370 370
 
@@ -395,85 +395,85 @@  discard block
 block discarded – undo
395 395
  *     Code PHP d'exécutant l'inclusion du squelette (ou texte) de la balise dynamique
396 396
  **/
397 397
 function executer_balise_dynamique($nom, $args, $context_compil) {
398
-	/** @var string Nom de la balise à charger (balise demandée ou balise générique) */
399
-	$nom_balise = $nom;
400
-	/** @var string Nom de la balise générique (si utilisée) */
401
-	$nom_balise_generique = "";
402
-
403
-	$appel_php_depuis_modele = false;
404
-	if (is_array($context_compil)
405
-	  and !is_numeric($context_compil[3])
406
-	  and empty($context_compil[0])
407
-		and empty($context_compil[1])
408
-		and empty($context_compil[2])
409
-		and empty($context_compil[3])) {
410
-		$appel_php_depuis_modele = true;
411
-	}
412
-
413
-	if (!$fonction_balise = charger_fonction($nom_balise, 'balise', true)) {
414
-		// Calculer un nom générique (ie. 'formulaire_' dans 'formulaire_editer_article')
415
-		if ($balise_generique = chercher_balise_generique($nom)) {
416
-			// injecter en premier arg le nom de la balise 
417
-			array_unshift($args, $nom);
418
-			$nom_balise_generique = $balise_generique['nom_generique'];
419
-			$fonction_balise = $balise_generique['fonction_generique'];
420
-			$nom_balise = $nom_balise_generique;
421
-		}
422
-		unset($balise_generique);
423
-	}
424
-
425
-	if (!$fonction_balise) {
426
-		$msg = array('zbug_balise_inexistante', array('from' => 'CVT', 'balise' => $nom));
427
-		erreur_squelette($msg, $context_compil);
428
-
429
-		return '';
430
-	}
431
-
432
-	// retrouver le fichier qui a déclaré la fonction
433
-	// même si la fonction dynamique est déclarée dans un fichier de fonctions.
434
-	// Attention sous windows, getFileName() retourne un antislash. 
435
-	$reflector = new ReflectionFunction($fonction_balise);
436
-	$file = str_replace('\\', '/', $reflector->getFileName());
437
-	if (strncmp($file, str_replace('\\', '/', _ROOT_RACINE), strlen(_ROOT_RACINE)) === 0) {
438
-		$file = substr($file, strlen(_ROOT_RACINE));
439
-	}
440
-
441
-	// Y a-t-il une fonction de traitement des arguments ?
442
-	$f = 'balise_' . $nom_balise . '_stat';
443
-
444
-	$r = !function_exists($f) ? $args : $f($args, $context_compil);
445
-
446
-	if (!is_array($r)) {
447
-		return $r;
448
-	}
449
-
450
-	// verifier que la fonction dyn est la, 
451
-	// sinon se replier sur la generique si elle existe
452
-	if (!function_exists('balise_' . $nom_balise . '_dyn')) {
453
-		if (
454
-			$balise_generique = chercher_balise_generique($nom)
455
-			and $nom_balise_generique = $balise_generique['nom_generique']
456
-			and $file = include_spip("balise/" . strtolower($nom_balise_generique))
457
-			and function_exists('balise_' . $nom_balise_generique . '_dyn')
458
-		) {
459
-			// et lui injecter en premier arg le nom de la balise 
460
-			array_unshift($r, $nom);
461
-			$nom_balise = $nom_balise_generique;
462
-			if (!_DIR_RESTREINT) {
463
-				$file = _DIR_RESTREINT_ABS . $file;
464
-			}
465
-		} else {
466
-			$msg = array('zbug_balise_inexistante', array('from' => 'CVT', 'balise' => $nom));
467
-			erreur_squelette($msg, $context_compil);
468
-
469
-			return '';
470
-		}
471
-	}
472
-
473
-	if ($appel_php_depuis_modele) {
474
-		$context_compil['appel_php_depuis_modele'] = true;
475
-	}
476
-	return synthetiser_balise_dynamique($nom_balise, $r, $file, $context_compil);
398
+    /** @var string Nom de la balise à charger (balise demandée ou balise générique) */
399
+    $nom_balise = $nom;
400
+    /** @var string Nom de la balise générique (si utilisée) */
401
+    $nom_balise_generique = "";
402
+
403
+    $appel_php_depuis_modele = false;
404
+    if (is_array($context_compil)
405
+      and !is_numeric($context_compil[3])
406
+      and empty($context_compil[0])
407
+        and empty($context_compil[1])
408
+        and empty($context_compil[2])
409
+        and empty($context_compil[3])) {
410
+        $appel_php_depuis_modele = true;
411
+    }
412
+
413
+    if (!$fonction_balise = charger_fonction($nom_balise, 'balise', true)) {
414
+        // Calculer un nom générique (ie. 'formulaire_' dans 'formulaire_editer_article')
415
+        if ($balise_generique = chercher_balise_generique($nom)) {
416
+            // injecter en premier arg le nom de la balise 
417
+            array_unshift($args, $nom);
418
+            $nom_balise_generique = $balise_generique['nom_generique'];
419
+            $fonction_balise = $balise_generique['fonction_generique'];
420
+            $nom_balise = $nom_balise_generique;
421
+        }
422
+        unset($balise_generique);
423
+    }
424
+
425
+    if (!$fonction_balise) {
426
+        $msg = array('zbug_balise_inexistante', array('from' => 'CVT', 'balise' => $nom));
427
+        erreur_squelette($msg, $context_compil);
428
+
429
+        return '';
430
+    }
431
+
432
+    // retrouver le fichier qui a déclaré la fonction
433
+    // même si la fonction dynamique est déclarée dans un fichier de fonctions.
434
+    // Attention sous windows, getFileName() retourne un antislash. 
435
+    $reflector = new ReflectionFunction($fonction_balise);
436
+    $file = str_replace('\\', '/', $reflector->getFileName());
437
+    if (strncmp($file, str_replace('\\', '/', _ROOT_RACINE), strlen(_ROOT_RACINE)) === 0) {
438
+        $file = substr($file, strlen(_ROOT_RACINE));
439
+    }
440
+
441
+    // Y a-t-il une fonction de traitement des arguments ?
442
+    $f = 'balise_' . $nom_balise . '_stat';
443
+
444
+    $r = !function_exists($f) ? $args : $f($args, $context_compil);
445
+
446
+    if (!is_array($r)) {
447
+        return $r;
448
+    }
449
+
450
+    // verifier que la fonction dyn est la, 
451
+    // sinon se replier sur la generique si elle existe
452
+    if (!function_exists('balise_' . $nom_balise . '_dyn')) {
453
+        if (
454
+            $balise_generique = chercher_balise_generique($nom)
455
+            and $nom_balise_generique = $balise_generique['nom_generique']
456
+            and $file = include_spip("balise/" . strtolower($nom_balise_generique))
457
+            and function_exists('balise_' . $nom_balise_generique . '_dyn')
458
+        ) {
459
+            // et lui injecter en premier arg le nom de la balise 
460
+            array_unshift($r, $nom);
461
+            $nom_balise = $nom_balise_generique;
462
+            if (!_DIR_RESTREINT) {
463
+                $file = _DIR_RESTREINT_ABS . $file;
464
+            }
465
+        } else {
466
+            $msg = array('zbug_balise_inexistante', array('from' => 'CVT', 'balise' => $nom));
467
+            erreur_squelette($msg, $context_compil);
468
+
469
+            return '';
470
+        }
471
+    }
472
+
473
+    if ($appel_php_depuis_modele) {
474
+        $context_compil['appel_php_depuis_modele'] = true;
475
+    }
476
+    return synthetiser_balise_dynamique($nom_balise, $r, $file, $context_compil);
477 477
 
478 478
 }
479 479
 
@@ -489,23 +489,23 @@  discard block
 block discarded – undo
489 489
  * @return array|null
490 490
  */
491 491
 function chercher_balise_generique($nom) {
492
-	if (false === strpos($nom, "_")) {
493
-		return null;
494
-	}
495
-	$nom_generique = $nom;
496
-	while (false !== ($p = strrpos($nom_generique, "_"))) {
497
-		$nom_generique = substr($nom_generique, 0, $p + 1);
498
-		$fonction_generique = charger_fonction($nom_generique, 'balise', true);
499
-		if ($fonction_generique) {
500
-			return [
501
-				'nom' => $nom,
502
-				'nom_generique' => $nom_generique,
503
-				'fonction_generique' => $fonction_generique,
504
-			];
505
-		}
506
-		$nom_generique = substr($nom_generique, 0, -1);
507
-	}
508
-	return null;
492
+    if (false === strpos($nom, "_")) {
493
+        return null;
494
+    }
495
+    $nom_generique = $nom;
496
+    while (false !== ($p = strrpos($nom_generique, "_"))) {
497
+        $nom_generique = substr($nom_generique, 0, $p + 1);
498
+        $fonction_generique = charger_fonction($nom_generique, 'balise', true);
499
+        if ($fonction_generique) {
500
+            return [
501
+                'nom' => $nom,
502
+                'nom_generique' => $nom_generique,
503
+                'fonction_generique' => $fonction_generique,
504
+            ];
505
+        }
506
+        $nom_generique = substr($nom_generique, 0, -1);
507
+    }
508
+    return null;
509 509
 }
510 510
 
511 511
 
@@ -529,27 +529,27 @@  discard block
 block discarded – undo
529 529
  * @return null;
530 530
  **/
531 531
 function lang_select_public($lang, $lang_select, $titre = null) {
532
-	// Cas 1. forcer_lang = true et pas de critere {lang_select}
533
-	if (isset($GLOBALS['forcer_lang']) and $GLOBALS['forcer_lang']
534
-		and $lang_select !== 'oui'
535
-	) {
536
-		$lang = $GLOBALS['spip_lang'];
537
-	} // Cas 2. l'objet n'a pas de langue definie (ou definie a '')
538
-	elseif (!strlen($lang)) {
539
-		$lang = $GLOBALS['spip_lang'];
540
-	} // Cas 3. l'objet est multilingue !
541
-	elseif ($lang_select !== 'oui'
542
-		and strlen($titre) > 10
543
-		and strpos($titre, '<multi>') !== false
544
-		and strpos(echappe_html($titre), '<multi>') !== false
545
-	) {
546
-		$lang = $GLOBALS['spip_lang'];
547
-	}
548
-
549
-	// faire un lang_select() eventuellement sur la langue inchangee
550
-	lang_select($lang);
551
-
552
-	return;
532
+    // Cas 1. forcer_lang = true et pas de critere {lang_select}
533
+    if (isset($GLOBALS['forcer_lang']) and $GLOBALS['forcer_lang']
534
+        and $lang_select !== 'oui'
535
+    ) {
536
+        $lang = $GLOBALS['spip_lang'];
537
+    } // Cas 2. l'objet n'a pas de langue definie (ou definie a '')
538
+    elseif (!strlen($lang)) {
539
+        $lang = $GLOBALS['spip_lang'];
540
+    } // Cas 3. l'objet est multilingue !
541
+    elseif ($lang_select !== 'oui'
542
+        and strlen($titre) > 10
543
+        and strpos($titre, '<multi>') !== false
544
+        and strpos(echappe_html($titre), '<multi>') !== false
545
+    ) {
546
+        $lang = $GLOBALS['spip_lang'];
547
+    }
548
+
549
+    // faire un lang_select() eventuellement sur la langue inchangee
550
+    lang_select($lang);
551
+
552
+    return;
553 553
 }
554 554
 
555 555
 
@@ -557,21 +557,21 @@  discard block
 block discarded – undo
557 557
 // il faut le nettoyer car il pourrait etre injecte en SQL
558 558
 // https://code.spip.net/@nettoyer_env_doublons
559 559
 function nettoyer_env_doublons($envd) {
560
-	foreach ($envd as $table => $liste) {
561
-		$n = '';
562
-		foreach (explode(',', $liste) as $val) {
563
-			if ($a = intval($val) and $val === strval($a)) {
564
-				$n .= ',' . $val;
565
-			}
566
-		}
567
-		if (strlen($n)) {
568
-			$envd[$table] = $n;
569
-		} else {
570
-			unset($envd[$table]);
571
-		}
572
-	}
573
-
574
-	return $envd;
560
+    foreach ($envd as $table => $liste) {
561
+        $n = '';
562
+        foreach (explode(',', $liste) as $val) {
563
+            if ($a = intval($val) and $val === strval($a)) {
564
+                $n .= ',' . $val;
565
+            }
566
+        }
567
+        if (strlen($n)) {
568
+            $envd[$table] = $n;
569
+        } else {
570
+            unset($envd[$table]);
571
+        }
572
+    }
573
+
574
+    return $envd;
575 575
 }
576 576
 
577 577
 /**
@@ -590,21 +590,21 @@  discard block
 block discarded – undo
590 590
  *     Opérateur trouvé (SELF ou SUBSELECT) sinon false.
591 591
  **/
592 592
 function match_self($w) {
593
-	if (is_string($w)) {
594
-		return false;
595
-	}
596
-	if (is_array($w)) {
597
-		if (in_array(reset($w), array("SELF", "SUBSELECT"))) {
598
-			return $w;
599
-		}
600
-		foreach (array_filter($w, 'is_array') as $sw) {
601
-			if ($m = match_self($sw)) {
602
-				return $m;
603
-			}
604
-		}
605
-	}
606
-
607
-	return false;
593
+    if (is_string($w)) {
594
+        return false;
595
+    }
596
+    if (is_array($w)) {
597
+        if (in_array(reset($w), array("SELF", "SUBSELECT"))) {
598
+            return $w;
599
+        }
600
+        foreach (array_filter($w, 'is_array') as $sw) {
601
+            if ($m = match_self($sw)) {
602
+                return $m;
603
+            }
604
+        }
605
+    }
606
+
607
+    return false;
608 608
 }
609 609
 
610 610
 /**
@@ -620,16 +620,16 @@  discard block
 block discarded – undo
620 620
  *     est remplacée par son code.
621 621
  **/
622 622
 function remplace_sous_requete($w, $sousrequete) {
623
-	if (is_array($w)) {
624
-		if (in_array(reset($w), array("SELF", "SUBSELECT"))) {
625
-			return $sousrequete;
626
-		}
627
-		foreach ($w as $k => $sw) {
628
-			$w[$k] = remplace_sous_requete($sw, $sousrequete);
629
-		}
630
-	}
631
-
632
-	return $w;
623
+    if (is_array($w)) {
624
+        if (in_array(reset($w), array("SELF", "SUBSELECT"))) {
625
+            return $sousrequete;
626
+        }
627
+        foreach ($w as $k => $sw) {
628
+            $w[$k] = remplace_sous_requete($sw, $sousrequete);
629
+        }
630
+    }
631
+
632
+    return $w;
633 633
 }
634 634
 
635 635
 /**
@@ -643,17 +643,17 @@  discard block
 block discarded – undo
643 643
  *     - Conditions avec des sous requêtes
644 644
  **/
645 645
 function trouver_sous_requetes($where) {
646
-	$where_simples = array();
647
-	$where_sous = array();
648
-	foreach ($where as $k => $w) {
649
-		if (match_self($w)) {
650
-			$where_sous[$k] = $w;
651
-		} else {
652
-			$where_simples[$k] = $w;
653
-		}
654
-	}
655
-
656
-	return array($where_simples, $where_sous);
646
+    $where_simples = array();
647
+    $where_sous = array();
648
+    foreach ($where as $k => $w) {
649
+        if (match_self($w)) {
650
+            $where_sous[$k] = $w;
651
+        } else {
652
+            $where_simples[$k] = $w;
653
+        }
654
+    }
655
+
656
+    return array($where_simples, $where_sous);
657 657
 }
658 658
 
659 659
 
@@ -679,270 +679,270 @@  discard block
 block discarded – undo
679 679
  * @return resource
680 680
  */
681 681
 function calculer_select(
682
-	$select = array(),
683
-	$from = array(),
684
-	$from_type = array(),
685
-	$where = array(),
686
-	$join = array(),
687
-	$groupby = array(),
688
-	$orderby = array(),
689
-	$limit = '',
690
-	$having = array(),
691
-	$table = '',
692
-	$id = '',
693
-	$serveur = '',
694
-	$requeter = true
682
+    $select = array(),
683
+    $from = array(),
684
+    $from_type = array(),
685
+    $where = array(),
686
+    $join = array(),
687
+    $groupby = array(),
688
+    $orderby = array(),
689
+    $limit = '',
690
+    $having = array(),
691
+    $table = '',
692
+    $id = '',
693
+    $serveur = '',
694
+    $requeter = true
695 695
 ) {
696 696
 
697
-	// retirer les criteres vides:
698
-	// {X ?} avec X absent de l'URL
699
-	// {par #ENV{X}} avec X absent de l'URL
700
-	// IN sur collection vide (ce dernier devrait pouvoir etre fait a la compil)
701
-	$menage = false;
702
-	foreach ($where as $k => $v) {
703
-		if (is_array($v)) {
704
-			if ((count($v) >= 2) && ($v[0] == 'REGEXP') && ($v[2] == "'.*'")) {
705
-				$op = false;
706
-			} elseif ((count($v) >= 2) && ($v[0] == 'LIKE') && ($v[2] == "'%'")) {
707
-				$op = false;
708
-			} else {
709
-				$op = $v[0] ? $v[0] : $v;
710
-			}
711
-		} else {
712
-			$op = $v;
713
-		}
714
-		if ((!$op) or ($op == 1) or ($op == '0=0')) {
715
-			unset($where[$k]);
716
-			$menage = true;
717
-		}
718
-	}
719
-
720
-	// evacuer les eventuels groupby vide issus d'un calcul dynamique
721
-	$groupby = array_diff($groupby, array(''));
722
-
723
-	// remplacer les sous requetes recursives au calcul
724
-	list($where_simples, $where_sous) = trouver_sous_requetes($where);
725
-	foreach ($where_sous as $k => $w) {
726
-		$menage = true;
727
-		// on recupere la sous requete 
728
-		$sous = match_self($w);
729
-		if ($sous[0] == 'SELF') {
730
-			// c'est une sous requete identique a elle meme sous la forme (SELF,$select,$where)
731
-			array_push($where_simples, $sous[2]);
732
-			$wheresub = array(
733
-				$sous[2],
734
-				'0=0'
735
-			); // pour accepter une string et forcer a faire le menage car on a surement simplifie select et where
736
-			$jsub = $join;
737
-			// trouver les jointures utiles a
738
-			// reinjecter dans le where de la sous requete les conditions supplementaires des jointures qui y sont mentionnees
739
-			// ie L1.objet='article'
740
-			// on construit le where une fois, puis on ajoute les where complentaires si besoin, et on reconstruit le where en fonction
741
-			$i = 0;
742
-			do {
743
-				$where[$k] = remplace_sous_requete($w, "(" . calculer_select(
744
-						array($sous[1] . " AS id"),
745
-						$from,
746
-						$from_type,
747
-						$wheresub,
748
-						$jsub,
749
-						array(), array(), '',
750
-						$having, $table, $id, $serveur, false) . ")");
751
-				if (!$i) {
752
-					$i = 1;
753
-					$wherestring = calculer_where_to_string($where[$k]);
754
-					foreach ($join as $cle => $wj) {
755
-						if (count($wj) == 4
756
-							and strpos($wherestring, "{$cle}.") !== false
757
-						) {
758
-							$i = 0;
759
-							$wheresub[] = $wj[3];
760
-							unset($jsub[$cle][3]);
761
-						}
762
-					}
763
-				}
764
-			} while ($i++ < 1);
765
-		}
766
-		if ($sous[0] == 'SUBSELECT') {
767
-			// c'est une sous requete explicite sous la forme identique a sql_select : (SUBSELECT,$select,$from,$where,$groupby,$orderby,$limit,$having)
768
-			array_push($where_simples, $sous[3]); // est-ce utile dans ce cas ?
769
-			$where[$k] = remplace_sous_requete($w, "(" . calculer_select(
770
-					$sous[1], # select
771
-					$sous[2], #from
772
-					array(), #from_type
773
-					$sous[3] ? (is_array($sous[3]) ? $sous[3] : array($sous[3])) : array(),
774
-					#where, qui peut etre de la forme string comme dans sql_select
775
-					array(), #join
776
-					$sous[4] ? $sous[4] : array(), #groupby
777
-					$sous[5] ? $sous[5] : array(), #orderby
778
-					$sous[6], #limit
779
-					$sous[7] ? $sous[7] : array(), #having
780
-					$table, $id, $serveur, false
781
-				) . ")");
782
-		}
783
-		array_pop($where_simples);
784
-	}
785
-
786
-	foreach ($having as $k => $v) {
787
-		if ((!$v) or ($v == 1) or ($v == '0=0')) {
788
-			unset($having[$k]);
789
-		}
790
-	}
791
-
792
-	// Installer les jointures.
793
-	// Retirer celles seulement utiles aux criteres finalement absents mais
794
-	// parcourir de la plus recente a la moins recente pour pouvoir eliminer Ln
795
-	// si elle est seulement utile a Ln+1 elle meme inutile
796
-
797
-	$afrom = array();
798
-	$equiv = array();
799
-	$k = count($join);
800
-	foreach (array_reverse($join, true) as $cledef => $j) {
801
-		$cle = $cledef;
802
-		// le format de join est :
803
-		// array(table depart, cle depart [,cle arrivee[,condition optionnelle and ...]])
804
-		$join[$cle] = array_values($join[$cle]); // recalculer les cles car des unset ont pu perturber
805
-		if (count($join[$cle]) == 2) {
806
-			$join[$cle][] = $join[$cle][1];
807
-		}
808
-		if (count($join[$cle]) == 3) {
809
-			$join[$cle][] = '';
810
-		}
811
-		list($t, $c, $carr, $and) = $join[$cle];
812
-		// si le nom de la jointure n'a pas ete specifiee, on prend Lx avec x sont rang dans la liste
813
-		// pour compat avec ancienne convention
814
-		if (is_numeric($cle)) {
815
-			$cle = "L$k";
816
-		}
817
-		$cle_where_lie = "JOIN-$cle";
818
-		if (!$menage
819
-			or isset($afrom[$cle])
820
-			or calculer_jointnul($cle, $select)
821
-			or calculer_jointnul($cle, array_diff_key($join, array($cle => $join[$cle])))
822
-			or calculer_jointnul($cle, $having)
823
-			or calculer_jointnul($cle, array_diff_key($where_simples, [$cle_where_lie => '']))
824
-		) {
825
-			// corriger les references non explicites dans select
826
-			// ou groupby
827
-			foreach ($select as $i => $s) {
828
-				if ($s == $c) {
829
-					$select[$i] = "$cle.$c AS $c";
830
-					break;
831
-				}
832
-			}
833
-			foreach ($groupby as $i => $g) {
834
-				if ($g == $c) {
835
-					$groupby[$i] = "$cle.$c";
836
-					break;
837
-				}
838
-			}
839
-			// on garde une ecriture decomposee pour permettre une simplification ulterieure si besoin
840
-			// sans recours a preg_match
841
-			// un implode(' ',..) est fait dans reinjecte_joint un peu plus bas
842
-			$afrom[$t][$cle] = array(
843
-				"\n" .
844
-				(isset($from_type[$cle]) ? $from_type[$cle] : "INNER") . " JOIN",
845
-				$from[$cle],
846
-				"AS $cle",
847
-				"ON (",
848
-				"$cle.$c",
849
-				"=",
850
-				"$t.$carr",
851
-				($and ? "AND " . $and : "") .
852
-				")"
853
-			);
854
-			if (isset($afrom[$cle])) {
855
-				$afrom[$t] = $afrom[$t] + $afrom[$cle];
856
-				unset($afrom[$cle]);
857
-			}
858
-			$equiv[] = $carr;
859
-		} else {
860
-			unset($join[$cledef]);
861
-			if (isset($where_simples[$cle_where_lie])) {
862
-				unset($where_simples[$cle_where_lie]);
863
-				unset($where[$cle_where_lie]);
864
-			}
865
-		}
866
-		unset($from[$cle]);
867
-		$k--;
868
-	}
869
-
870
-	if (count($afrom)) {
871
-		// Regarder si la table principale ne sert finalement a rien comme dans
872
-		//<BOUCLE3(MOTS){id_article}{id_mot}> class='on'</BOUCLE3>
873
-		//<BOUCLE2(MOTS){id_article} />#TOTAL_BOUCLE<//B2>
874
-		//<BOUCLE5(RUBRIQUES){id_mot}{tout} />#TOTAL_BOUCLE<//B5>
875
-		// ou dans
876
-		//<BOUCLE8(HIERARCHIE){id_rubrique}{tout}{type='Squelette'}{inverse}{0,1}{lang_select=non} />#TOTAL_BOUCLE<//B8>
877
-		// qui comporte plusieurs jointures
878
-		// ou dans
879
-		// <BOUCLE6(ARTICLES){id_mot=2}{statut==.*} />#TOTAL_BOUCLE<//B6>
880
-		// <BOUCLE7(ARTICLES){id_mot>0}{statut?} />#TOTAL_BOUCLE<//B7>
881
-		// penser a regarder aussi la clause orderby pour ne pas simplifier abusivement
882
-		// <BOUCLE9(ARTICLES){recherche truc}{par titre}>#ID_ARTICLE</BOUCLE9>
883
-		// penser a regarder aussi la clause groubpy pour ne pas simplifier abusivement
884
-		// <BOUCLE10(EVENEMENTS){id_rubrique} />#TOTAL_BOUCLE<//B10>
885
-
886
-		$t = key($from);
887
-		$c = current($from);
888
-		reset($from);
889
-		$e = '/\b(' . "$t\\." . join("|" . $t . '\.', $equiv) . ')\b/';
890
-		if (!(strpos($t, ' ') or // jointure des le depart cf boucle_doc
891
-				calculer_jointnul($t, $select, $e) or
892
-				calculer_jointnul($t, $join, $e) or
893
-				calculer_jointnul($t, $where, $e) or
894
-				calculer_jointnul($t, $orderby, $e) or
895
-				calculer_jointnul($t, $groupby, $e) or
896
-				calculer_jointnul($t, $having, $e))
897
-			&& count($afrom[$t])
898
-		) {
899
-			$nfrom = reset($afrom[$t]);
900
-			$nt = key($afrom[$t]);
901
-			unset($from[$t]);
902
-			$from[$nt] = $nfrom[1];
903
-			unset($afrom[$t][$nt]);
904
-			$afrom[$nt] = $afrom[$t];
905
-			unset($afrom[$t]);
906
-			$e = '/\b' . preg_quote($nfrom[6]) . '\b/';
907
-			$t = $nfrom[4];
908
-			$alias = "";
909
-			// verifier que les deux cles sont homonymes, sinon installer un alias dans le select
910
-			$oldcle = explode('.', $nfrom[6]);
911
-			$oldcle = end($oldcle);
912
-			$newcle = explode('.', $nfrom[4]);
913
-			$newcle = end($newcle);
914
-			if ($newcle != $oldcle) {
915
-				// si l'ancienne cle etait deja dans le select avec un AS
916
-				// reprendre simplement ce AS
917
-				$as = '/\b' . preg_quote($nfrom[6]) . '\s+(AS\s+\w+)\b/';
918
-				if (preg_match($as, implode(',', $select), $m)) {
919
-					$alias = "";
920
-				} else {
921
-					$alias = ", " . $nfrom[4] . " AS $oldcle";
922
-				}
923
-			}
924
-			$select = remplacer_jointnul($t . $alias, $select, $e);
925
-			$join = remplacer_jointnul($t, $join, $e);
926
-			$where = remplacer_jointnul($t, $where, $e);
927
-			$having = remplacer_jointnul($t, $having, $e);
928
-			$groupby = remplacer_jointnul($t, $groupby, $e);
929
-			$orderby = remplacer_jointnul($t, $orderby, $e);
930
-		}
931
-		$from = reinjecte_joint($afrom, $from);
932
-	}
933
-	if (empty($GLOBALS['debug']) or !is_array($GLOBALS['debug'])) {
934
-		$wasdebug = empty($GLOBALS['debug']) ? false : $GLOBALS['debug'];
935
-		$GLOBALS['debug'] = array();
936
-		if ($wasdebug) {
937
-			$GLOBALS['debug']['debug'] = true;
938
-		}
939
-	}
940
-	$GLOBALS['debug']['aucasou'] = array($table, $id, $serveur, $requeter);
941
-	$r = sql_select($select, $from, $where,
942
-		$groupby, array_filter($orderby), $limit, $having, $serveur, $requeter);
943
-	unset($GLOBALS['debug']['aucasou']);
944
-
945
-	return $r;
697
+    // retirer les criteres vides:
698
+    // {X ?} avec X absent de l'URL
699
+    // {par #ENV{X}} avec X absent de l'URL
700
+    // IN sur collection vide (ce dernier devrait pouvoir etre fait a la compil)
701
+    $menage = false;
702
+    foreach ($where as $k => $v) {
703
+        if (is_array($v)) {
704
+            if ((count($v) >= 2) && ($v[0] == 'REGEXP') && ($v[2] == "'.*'")) {
705
+                $op = false;
706
+            } elseif ((count($v) >= 2) && ($v[0] == 'LIKE') && ($v[2] == "'%'")) {
707
+                $op = false;
708
+            } else {
709
+                $op = $v[0] ? $v[0] : $v;
710
+            }
711
+        } else {
712
+            $op = $v;
713
+        }
714
+        if ((!$op) or ($op == 1) or ($op == '0=0')) {
715
+            unset($where[$k]);
716
+            $menage = true;
717
+        }
718
+    }
719
+
720
+    // evacuer les eventuels groupby vide issus d'un calcul dynamique
721
+    $groupby = array_diff($groupby, array(''));
722
+
723
+    // remplacer les sous requetes recursives au calcul
724
+    list($where_simples, $where_sous) = trouver_sous_requetes($where);
725
+    foreach ($where_sous as $k => $w) {
726
+        $menage = true;
727
+        // on recupere la sous requete 
728
+        $sous = match_self($w);
729
+        if ($sous[0] == 'SELF') {
730
+            // c'est une sous requete identique a elle meme sous la forme (SELF,$select,$where)
731
+            array_push($where_simples, $sous[2]);
732
+            $wheresub = array(
733
+                $sous[2],
734
+                '0=0'
735
+            ); // pour accepter une string et forcer a faire le menage car on a surement simplifie select et where
736
+            $jsub = $join;
737
+            // trouver les jointures utiles a
738
+            // reinjecter dans le where de la sous requete les conditions supplementaires des jointures qui y sont mentionnees
739
+            // ie L1.objet='article'
740
+            // on construit le where une fois, puis on ajoute les where complentaires si besoin, et on reconstruit le where en fonction
741
+            $i = 0;
742
+            do {
743
+                $where[$k] = remplace_sous_requete($w, "(" . calculer_select(
744
+                        array($sous[1] . " AS id"),
745
+                        $from,
746
+                        $from_type,
747
+                        $wheresub,
748
+                        $jsub,
749
+                        array(), array(), '',
750
+                        $having, $table, $id, $serveur, false) . ")");
751
+                if (!$i) {
752
+                    $i = 1;
753
+                    $wherestring = calculer_where_to_string($where[$k]);
754
+                    foreach ($join as $cle => $wj) {
755
+                        if (count($wj) == 4
756
+                            and strpos($wherestring, "{$cle}.") !== false
757
+                        ) {
758
+                            $i = 0;
759
+                            $wheresub[] = $wj[3];
760
+                            unset($jsub[$cle][3]);
761
+                        }
762
+                    }
763
+                }
764
+            } while ($i++ < 1);
765
+        }
766
+        if ($sous[0] == 'SUBSELECT') {
767
+            // c'est une sous requete explicite sous la forme identique a sql_select : (SUBSELECT,$select,$from,$where,$groupby,$orderby,$limit,$having)
768
+            array_push($where_simples, $sous[3]); // est-ce utile dans ce cas ?
769
+            $where[$k] = remplace_sous_requete($w, "(" . calculer_select(
770
+                    $sous[1], # select
771
+                    $sous[2], #from
772
+                    array(), #from_type
773
+                    $sous[3] ? (is_array($sous[3]) ? $sous[3] : array($sous[3])) : array(),
774
+                    #where, qui peut etre de la forme string comme dans sql_select
775
+                    array(), #join
776
+                    $sous[4] ? $sous[4] : array(), #groupby
777
+                    $sous[5] ? $sous[5] : array(), #orderby
778
+                    $sous[6], #limit
779
+                    $sous[7] ? $sous[7] : array(), #having
780
+                    $table, $id, $serveur, false
781
+                ) . ")");
782
+        }
783
+        array_pop($where_simples);
784
+    }
785
+
786
+    foreach ($having as $k => $v) {
787
+        if ((!$v) or ($v == 1) or ($v == '0=0')) {
788
+            unset($having[$k]);
789
+        }
790
+    }
791
+
792
+    // Installer les jointures.
793
+    // Retirer celles seulement utiles aux criteres finalement absents mais
794
+    // parcourir de la plus recente a la moins recente pour pouvoir eliminer Ln
795
+    // si elle est seulement utile a Ln+1 elle meme inutile
796
+
797
+    $afrom = array();
798
+    $equiv = array();
799
+    $k = count($join);
800
+    foreach (array_reverse($join, true) as $cledef => $j) {
801
+        $cle = $cledef;
802
+        // le format de join est :
803
+        // array(table depart, cle depart [,cle arrivee[,condition optionnelle and ...]])
804
+        $join[$cle] = array_values($join[$cle]); // recalculer les cles car des unset ont pu perturber
805
+        if (count($join[$cle]) == 2) {
806
+            $join[$cle][] = $join[$cle][1];
807
+        }
808
+        if (count($join[$cle]) == 3) {
809
+            $join[$cle][] = '';
810
+        }
811
+        list($t, $c, $carr, $and) = $join[$cle];
812
+        // si le nom de la jointure n'a pas ete specifiee, on prend Lx avec x sont rang dans la liste
813
+        // pour compat avec ancienne convention
814
+        if (is_numeric($cle)) {
815
+            $cle = "L$k";
816
+        }
817
+        $cle_where_lie = "JOIN-$cle";
818
+        if (!$menage
819
+            or isset($afrom[$cle])
820
+            or calculer_jointnul($cle, $select)
821
+            or calculer_jointnul($cle, array_diff_key($join, array($cle => $join[$cle])))
822
+            or calculer_jointnul($cle, $having)
823
+            or calculer_jointnul($cle, array_diff_key($where_simples, [$cle_where_lie => '']))
824
+        ) {
825
+            // corriger les references non explicites dans select
826
+            // ou groupby
827
+            foreach ($select as $i => $s) {
828
+                if ($s == $c) {
829
+                    $select[$i] = "$cle.$c AS $c";
830
+                    break;
831
+                }
832
+            }
833
+            foreach ($groupby as $i => $g) {
834
+                if ($g == $c) {
835
+                    $groupby[$i] = "$cle.$c";
836
+                    break;
837
+                }
838
+            }
839
+            // on garde une ecriture decomposee pour permettre une simplification ulterieure si besoin
840
+            // sans recours a preg_match
841
+            // un implode(' ',..) est fait dans reinjecte_joint un peu plus bas
842
+            $afrom[$t][$cle] = array(
843
+                "\n" .
844
+                (isset($from_type[$cle]) ? $from_type[$cle] : "INNER") . " JOIN",
845
+                $from[$cle],
846
+                "AS $cle",
847
+                "ON (",
848
+                "$cle.$c",
849
+                "=",
850
+                "$t.$carr",
851
+                ($and ? "AND " . $and : "") .
852
+                ")"
853
+            );
854
+            if (isset($afrom[$cle])) {
855
+                $afrom[$t] = $afrom[$t] + $afrom[$cle];
856
+                unset($afrom[$cle]);
857
+            }
858
+            $equiv[] = $carr;
859
+        } else {
860
+            unset($join[$cledef]);
861
+            if (isset($where_simples[$cle_where_lie])) {
862
+                unset($where_simples[$cle_where_lie]);
863
+                unset($where[$cle_where_lie]);
864
+            }
865
+        }
866
+        unset($from[$cle]);
867
+        $k--;
868
+    }
869
+
870
+    if (count($afrom)) {
871
+        // Regarder si la table principale ne sert finalement a rien comme dans
872
+        //<BOUCLE3(MOTS){id_article}{id_mot}> class='on'</BOUCLE3>
873
+        //<BOUCLE2(MOTS){id_article} />#TOTAL_BOUCLE<//B2>
874
+        //<BOUCLE5(RUBRIQUES){id_mot}{tout} />#TOTAL_BOUCLE<//B5>
875
+        // ou dans
876
+        //<BOUCLE8(HIERARCHIE){id_rubrique}{tout}{type='Squelette'}{inverse}{0,1}{lang_select=non} />#TOTAL_BOUCLE<//B8>
877
+        // qui comporte plusieurs jointures
878
+        // ou dans
879
+        // <BOUCLE6(ARTICLES){id_mot=2}{statut==.*} />#TOTAL_BOUCLE<//B6>
880
+        // <BOUCLE7(ARTICLES){id_mot>0}{statut?} />#TOTAL_BOUCLE<//B7>
881
+        // penser a regarder aussi la clause orderby pour ne pas simplifier abusivement
882
+        // <BOUCLE9(ARTICLES){recherche truc}{par titre}>#ID_ARTICLE</BOUCLE9>
883
+        // penser a regarder aussi la clause groubpy pour ne pas simplifier abusivement
884
+        // <BOUCLE10(EVENEMENTS){id_rubrique} />#TOTAL_BOUCLE<//B10>
885
+
886
+        $t = key($from);
887
+        $c = current($from);
888
+        reset($from);
889
+        $e = '/\b(' . "$t\\." . join("|" . $t . '\.', $equiv) . ')\b/';
890
+        if (!(strpos($t, ' ') or // jointure des le depart cf boucle_doc
891
+                calculer_jointnul($t, $select, $e) or
892
+                calculer_jointnul($t, $join, $e) or
893
+                calculer_jointnul($t, $where, $e) or
894
+                calculer_jointnul($t, $orderby, $e) or
895
+                calculer_jointnul($t, $groupby, $e) or
896
+                calculer_jointnul($t, $having, $e))
897
+            && count($afrom[$t])
898
+        ) {
899
+            $nfrom = reset($afrom[$t]);
900
+            $nt = key($afrom[$t]);
901
+            unset($from[$t]);
902
+            $from[$nt] = $nfrom[1];
903
+            unset($afrom[$t][$nt]);
904
+            $afrom[$nt] = $afrom[$t];
905
+            unset($afrom[$t]);
906
+            $e = '/\b' . preg_quote($nfrom[6]) . '\b/';
907
+            $t = $nfrom[4];
908
+            $alias = "";
909
+            // verifier que les deux cles sont homonymes, sinon installer un alias dans le select
910
+            $oldcle = explode('.', $nfrom[6]);
911
+            $oldcle = end($oldcle);
912
+            $newcle = explode('.', $nfrom[4]);
913
+            $newcle = end($newcle);
914
+            if ($newcle != $oldcle) {
915
+                // si l'ancienne cle etait deja dans le select avec un AS
916
+                // reprendre simplement ce AS
917
+                $as = '/\b' . preg_quote($nfrom[6]) . '\s+(AS\s+\w+)\b/';
918
+                if (preg_match($as, implode(',', $select), $m)) {
919
+                    $alias = "";
920
+                } else {
921
+                    $alias = ", " . $nfrom[4] . " AS $oldcle";
922
+                }
923
+            }
924
+            $select = remplacer_jointnul($t . $alias, $select, $e);
925
+            $join = remplacer_jointnul($t, $join, $e);
926
+            $where = remplacer_jointnul($t, $where, $e);
927
+            $having = remplacer_jointnul($t, $having, $e);
928
+            $groupby = remplacer_jointnul($t, $groupby, $e);
929
+            $orderby = remplacer_jointnul($t, $orderby, $e);
930
+        }
931
+        $from = reinjecte_joint($afrom, $from);
932
+    }
933
+    if (empty($GLOBALS['debug']) or !is_array($GLOBALS['debug'])) {
934
+        $wasdebug = empty($GLOBALS['debug']) ? false : $GLOBALS['debug'];
935
+        $GLOBALS['debug'] = array();
936
+        if ($wasdebug) {
937
+            $GLOBALS['debug']['debug'] = true;
938
+        }
939
+    }
940
+    $GLOBALS['debug']['aucasou'] = array($table, $id, $serveur, $requeter);
941
+    $r = sql_select($select, $from, $where,
942
+        $groupby, array_filter($orderby), $limit, $having, $serveur, $requeter);
943
+    unset($GLOBALS['debug']['aucasou']);
944
+
945
+    return $r;
946 946
 }
947 947
 
948 948
 /**
@@ -953,20 +953,20 @@  discard block
 block discarded – undo
953 953
  * @return string
954 954
  */
955 955
 function calculer_where_to_string($v, $join = 'AND') {
956
-	if (empty($v)) {
957
-		return '';
958
-	}
959
-
960
-	if (!is_array($v)) {
961
-		return $v;
962
-	} else {
963
-		$exp = "";
964
-		if (strtoupper($join) === 'AND') {
965
-			return $exp . join(" $join ", array_map('calculer_where_to_string', $v));
966
-		} else {
967
-			return $exp . join($join, $v);
968
-		}
969
-	}
956
+    if (empty($v)) {
957
+        return '';
958
+    }
959
+
960
+    if (!is_array($v)) {
961
+        return $v;
962
+    } else {
963
+        $exp = "";
964
+        if (strtoupper($join) === 'AND') {
965
+            return $exp . join(" $join ", array_map('calculer_where_to_string', $v));
966
+        } else {
967
+            return $exp . join($join, $v);
968
+        }
969
+    }
970 970
 }
971 971
 
972 972
 
@@ -974,62 +974,62 @@  discard block
 block discarded – undo
974 974
 
975 975
 // https://code.spip.net/@calculer_jointnul
976 976
 function calculer_jointnul($cle, $exp, $equiv = '') {
977
-	if (!is_array($exp)) {
978
-		if ($equiv) {
979
-			$exp = preg_replace($equiv, '', $exp);
980
-		}
981
-
982
-		return preg_match("/\\b$cle\\./", $exp);
983
-	} else {
984
-		foreach ($exp as $v) {
985
-			if (calculer_jointnul($cle, $v, $equiv)) {
986
-				return true;
987
-			}
988
-		}
989
-
990
-		return false;
991
-	}
977
+    if (!is_array($exp)) {
978
+        if ($equiv) {
979
+            $exp = preg_replace($equiv, '', $exp);
980
+        }
981
+
982
+        return preg_match("/\\b$cle\\./", $exp);
983
+    } else {
984
+        foreach ($exp as $v) {
985
+            if (calculer_jointnul($cle, $v, $equiv)) {
986
+                return true;
987
+            }
988
+        }
989
+
990
+        return false;
991
+    }
992 992
 }
993 993
 
994 994
 // https://code.spip.net/@reinjecte_joint
995 995
 function reinjecte_joint($afrom, $from) {
996
-	$from_synth = array();
997
-	foreach ($from as $k => $v) {
998
-		$from_synth[$k] = $from[$k];
999
-		if (isset($afrom[$k])) {
1000
-			foreach ($afrom[$k] as $kk => $vv) {
1001
-				$afrom[$k][$kk] = implode(' ', $afrom[$k][$kk]);
1002
-			}
1003
-			$from_synth["$k@"] = implode(' ', $afrom[$k]);
1004
-			unset($afrom[$k]);
1005
-		}
1006
-	}
1007
-
1008
-	return $from_synth;
996
+    $from_synth = array();
997
+    foreach ($from as $k => $v) {
998
+        $from_synth[$k] = $from[$k];
999
+        if (isset($afrom[$k])) {
1000
+            foreach ($afrom[$k] as $kk => $vv) {
1001
+                $afrom[$k][$kk] = implode(' ', $afrom[$k][$kk]);
1002
+            }
1003
+            $from_synth["$k@"] = implode(' ', $afrom[$k]);
1004
+            unset($afrom[$k]);
1005
+        }
1006
+    }
1007
+
1008
+    return $from_synth;
1009 1009
 }
1010 1010
 
1011 1011
 // https://code.spip.net/@remplacer_jointnul
1012 1012
 function remplacer_jointnul($cle, $exp, $equiv = '') {
1013
-	if (!is_array($exp)) {
1014
-		return preg_replace($equiv, $cle, $exp);
1015
-	} else {
1016
-		foreach ($exp as $k => $v) {
1017
-			$exp[$k] = remplacer_jointnul($cle, $v, $equiv);
1018
-		}
1019
-
1020
-		return $exp;
1021
-	}
1013
+    if (!is_array($exp)) {
1014
+        return preg_replace($equiv, $cle, $exp);
1015
+    } else {
1016
+        foreach ($exp as $k => $v) {
1017
+            $exp[$k] = remplacer_jointnul($cle, $v, $equiv);
1018
+        }
1019
+
1020
+        return $exp;
1021
+    }
1022 1022
 }
1023 1023
 
1024 1024
 // calcul du nom du squelette
1025 1025
 // https://code.spip.net/@calculer_nom_fonction_squel
1026 1026
 function calculer_nom_fonction_squel($skel, $mime_type = 'html', $connect = '') {
1027
-	// ne pas doublonner les squelette selon qu'ils sont calcules depuis ecrire/ ou depuis la racine
1028
-	if ($l = strlen(_DIR_RACINE) and strncmp($skel, _DIR_RACINE, $l) == 0) {
1029
-		$skel = substr($skel, strlen(_DIR_RACINE));
1030
-	}
1031
-
1032
-	return $mime_type
1033
-	. (!$connect ? '' : preg_replace('/\W/', "_", $connect)) . '_'
1034
-	. md5($GLOBALS['spip_version_code'] . ' * ' . $skel . (isset($GLOBALS['marqueur_skel']) ? '*' . $GLOBALS['marqueur_skel'] : ''));
1027
+    // ne pas doublonner les squelette selon qu'ils sont calcules depuis ecrire/ ou depuis la racine
1028
+    if ($l = strlen(_DIR_RACINE) and strncmp($skel, _DIR_RACINE, $l) == 0) {
1029
+        $skel = substr($skel, strlen(_DIR_RACINE));
1030
+    }
1031
+
1032
+    return $mime_type
1033
+    . (!$connect ? '' : preg_replace('/\W/', "_", $connect)) . '_'
1034
+    . md5($GLOBALS['spip_version_code'] . ' * ' . $skel . (isset($GLOBALS['marqueur_skel']) ? '*' . $GLOBALS['marqueur_skel'] : ''));
1035 1035
 }
Please login to merge, or discard this patch.
Spacing   +43 added lines, -43 removed lines patch added patch discarded remove patch
@@ -54,7 +54,7 @@  discard block
 block discarded – undo
54 54
 		$GLOBALS['debug_objets']['courant'] = $nom;
55 55
 	}
56 56
 
57
-	$phpfile = sous_repertoire(_DIR_SKELS, '', false, true) . $nom . '.php';
57
+	$phpfile = sous_repertoire(_DIR_SKELS, '', false, true).$nom.'.php';
58 58
 
59 59
 	// si squelette est deja compile et perenne, le charger
60 60
 	if (!squelette_obsolete($phpfile, $source)) {
@@ -67,7 +67,7 @@  discard block
 block discarded – undo
67 67
 		#}
68 68
 	}
69 69
 
70
-	if (file_exists($lib = $squelette . '_fonctions' . '.php')) {
70
+	if (file_exists($lib = $squelette.'_fonctions'.'.php')) {
71 71
 		include_once $lib;
72 72
 	}
73 73
 
@@ -105,7 +105,7 @@  discard block
 block discarded – undo
105 105
 			}
106 106
 		} catch (\ParseError $e) {
107 107
 			// Code syntaxiquement faux (critere etc mal programme')
108
-			$msg = _T('zbug_erreur_compilation') . ' | Line ' . $e->getLine() . ' : ' . $e->getMessage();
108
+			$msg = _T('zbug_erreur_compilation').' | Line '.$e->getLine().' : '.$e->getMessage();
109 109
 			erreur_squelette($msg, $boucle);
110 110
 			// continuer pour trouver d'autres fautes eventuelles
111 111
 			// mais prevenir que c'est mort
@@ -134,7 +134,7 @@  discard block
 block discarded – undo
134 134
 	if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
135 135
 
136 136
 		// Tracer ce qui vient d'etre compile
137
-		$GLOBALS['debug_objets']['code'][$nom . 'tout'] = $code;
137
+		$GLOBALS['debug_objets']['code'][$nom.'tout'] = $code;
138 138
 
139 139
 		// si c'est ce que demande le debusqueur, lui passer la main
140 140
 		if ($GLOBALS['debug_objets']['sourcefile']
@@ -156,13 +156,13 @@  discard block
 block discarded – undo
156 156
 		$code = "
157 157
 /*
158 158
  * Squelette : $sourcefile
159
- * Date :      " . gmdate("D, d M Y H:i:s", @filemtime($sourcefile)) . " GMT
160
- * Compile :   " . gmdate("D, d M Y H:i:s", time()) . " GMT
161
- * " . (!$boucles ? "Pas de boucle" : ("Boucles :   " . $noms)) . "
159
+ * Date :      ".gmdate("D, d M Y H:i:s", @filemtime($sourcefile))." GMT
160
+ * Compile :   " . gmdate("D, d M Y H:i:s", time())." GMT
161
+ * " . (!$boucles ? "Pas de boucle" : ("Boucles :   ".$noms))."
162 162
  */ ";
163 163
 	}
164 164
 
165
-	$code = '<' . "?php\n" . $code . join('', $boucles) . "\n?" . '>';
165
+	$code = '<'."?php\n".$code.join('', $boucles)."\n?".'>';
166 166
 	if (!defined('_VAR_NOCACHE') or !_VAR_NOCACHE) {
167 167
 		ecrire_fichier($phpfile, $code);
168 168
 	}
@@ -222,7 +222,7 @@  discard block
 block discarded – undo
222 222
 			$j = join('-', array_map('ucwords', explode('-', strtolower($r[2]))));
223 223
 
224 224
 			if ($j == 'X-Spip-Filtre' and isset($headers[$j])) {
225
-				$headers[$j] .= "|" . $r[3];
225
+				$headers[$j] .= "|".$r[3];
226 226
 			} else {
227 227
 				$headers[$j] = $r[3];
228 228
 			}
@@ -230,10 +230,10 @@  discard block
 block discarded – undo
230 230
 	}
231 231
 	// S'agit-il d'un resultat constant ou contenant du code php
232 232
 	$process_ins = (
233
-		strpos($corps, '<' . '?') === false
233
+		strpos($corps, '<'.'?') === false
234 234
 		or
235
-		(strpos($corps, '<' . '?xml') !== false and
236
-			strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false)
235
+		(strpos($corps, '<'.'?xml') !== false and
236
+			strpos(str_replace('<'.'?xml', '', $corps), '<'.'?') === false)
237 237
 	)
238 238
 		? 'html'
239 239
 		: 'php';
@@ -262,10 +262,10 @@  discard block
 block discarded – undo
262 262
 
263 263
 		if ($process_ins == 'html') {
264 264
 			$skel['process_ins'] = (
265
-				strpos($corps, '<' . '?') === false
265
+				strpos($corps, '<'.'?') === false
266 266
 				or
267
-				(strpos($corps, '<' . '?xml') !== false and
268
-					strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false)
267
+				(strpos($corps, '<'.'?xml') !== false and
268
+					strpos(str_replace('<'.'?xml', '', $corps), '<'.'?') === false)
269 269
 			)
270 270
 				? 'html'
271 271
 				: 'php';
@@ -283,7 +283,7 @@  discard block
 block discarded – undo
283 283
 //
284 284
 
285 285
 /** Code PHP pour inclure une balise dynamique à l'exécution d'une page */
286
-define('CODE_INCLURE_BALISE', '<' . '?php 
286
+define('CODE_INCLURE_BALISE', '<'.'?php 
287 287
 include_once("%s");
288 288
 if ($lang_select = "%s") $lang_select = lang_select($lang_select);
289 289
 inserer_balise_dynamique(balise_%s_dyn(%s), array(%s));
@@ -314,7 +314,7 @@  discard block
 block discarded – undo
314 314
 		// pas de lien symbolique sous Windows
315 315
 		and !(stristr(PHP_OS, 'WIN') and strpos($file, ':') !== false)
316 316
 	) {
317
-		$file = './" . _DIR_RACINE . "' . $file;
317
+		$file = './" . _DIR_RACINE . "'.$file;
318 318
 	}
319 319
 
320 320
 	$lang = $context_compil[4];
@@ -356,14 +356,14 @@  discard block
 block discarded – undo
356 356
 	if (is_object($v)) {
357 357
 		return var_export($v, true);
358 358
 	} elseif (!is_array($v)) {
359
-		return "'" . texte_script($v) . "'";
359
+		return "'".texte_script($v)."'";
360 360
 	} else {
361 361
 		$out = array();
362 362
 		foreach ($v as $k => $val) {
363
-			$out [] = argumenter_squelette($k) . '=>' . argumenter_squelette($val);
363
+			$out [] = argumenter_squelette($k).'=>'.argumenter_squelette($val);
364 364
 		}
365 365
 
366
-		return 'array(' . join(", ", $out) . ')';
366
+		return 'array('.join(", ", $out).')';
367 367
 	}
368 368
 }
369 369
 
@@ -439,7 +439,7 @@  discard block
 block discarded – undo
439 439
 	}
440 440
 
441 441
 	// Y a-t-il une fonction de traitement des arguments ?
442
-	$f = 'balise_' . $nom_balise . '_stat';
442
+	$f = 'balise_'.$nom_balise.'_stat';
443 443
 
444 444
 	$r = !function_exists($f) ? $args : $f($args, $context_compil);
445 445
 
@@ -449,18 +449,18 @@  discard block
 block discarded – undo
449 449
 
450 450
 	// verifier que la fonction dyn est la, 
451 451
 	// sinon se replier sur la generique si elle existe
452
-	if (!function_exists('balise_' . $nom_balise . '_dyn')) {
452
+	if (!function_exists('balise_'.$nom_balise.'_dyn')) {
453 453
 		if (
454 454
 			$balise_generique = chercher_balise_generique($nom)
455 455
 			and $nom_balise_generique = $balise_generique['nom_generique']
456
-			and $file = include_spip("balise/" . strtolower($nom_balise_generique))
457
-			and function_exists('balise_' . $nom_balise_generique . '_dyn')
456
+			and $file = include_spip("balise/".strtolower($nom_balise_generique))
457
+			and function_exists('balise_'.$nom_balise_generique.'_dyn')
458 458
 		) {
459 459
 			// et lui injecter en premier arg le nom de la balise 
460 460
 			array_unshift($r, $nom);
461 461
 			$nom_balise = $nom_balise_generique;
462 462
 			if (!_DIR_RESTREINT) {
463
-				$file = _DIR_RESTREINT_ABS . $file;
463
+				$file = _DIR_RESTREINT_ABS.$file;
464 464
 			}
465 465
 		} else {
466 466
 			$msg = array('zbug_balise_inexistante', array('from' => 'CVT', 'balise' => $nom));
@@ -561,7 +561,7 @@  discard block
 block discarded – undo
561 561
 		$n = '';
562 562
 		foreach (explode(',', $liste) as $val) {
563 563
 			if ($a = intval($val) and $val === strval($a)) {
564
-				$n .= ',' . $val;
564
+				$n .= ','.$val;
565 565
 			}
566 566
 		}
567 567
 		if (strlen($n)) {
@@ -740,14 +740,14 @@  discard block
 block discarded – undo
740 740
 			// on construit le where une fois, puis on ajoute les where complentaires si besoin, et on reconstruit le where en fonction
741 741
 			$i = 0;
742 742
 			do {
743
-				$where[$k] = remplace_sous_requete($w, "(" . calculer_select(
744
-						array($sous[1] . " AS id"),
743
+				$where[$k] = remplace_sous_requete($w, "(".calculer_select(
744
+						array($sous[1]." AS id"),
745 745
 						$from,
746 746
 						$from_type,
747 747
 						$wheresub,
748 748
 						$jsub,
749 749
 						array(), array(), '',
750
-						$having, $table, $id, $serveur, false) . ")");
750
+						$having, $table, $id, $serveur, false).")");
751 751
 				if (!$i) {
752 752
 					$i = 1;
753 753
 					$wherestring = calculer_where_to_string($where[$k]);
@@ -766,7 +766,7 @@  discard block
 block discarded – undo
766 766
 		if ($sous[0] == 'SUBSELECT') {
767 767
 			// c'est une sous requete explicite sous la forme identique a sql_select : (SUBSELECT,$select,$from,$where,$groupby,$orderby,$limit,$having)
768 768
 			array_push($where_simples, $sous[3]); // est-ce utile dans ce cas ?
769
-			$where[$k] = remplace_sous_requete($w, "(" . calculer_select(
769
+			$where[$k] = remplace_sous_requete($w, "(".calculer_select(
770 770
 					$sous[1], # select
771 771
 					$sous[2], #from
772 772
 					array(), #from_type
@@ -778,7 +778,7 @@  discard block
 block discarded – undo
778 778
 					$sous[6], #limit
779 779
 					$sous[7] ? $sous[7] : array(), #having
780 780
 					$table, $id, $serveur, false
781
-				) . ")");
781
+				).")");
782 782
 		}
783 783
 		array_pop($where_simples);
784 784
 	}
@@ -840,15 +840,15 @@  discard block
 block discarded – undo
840 840
 			// sans recours a preg_match
841 841
 			// un implode(' ',..) est fait dans reinjecte_joint un peu plus bas
842 842
 			$afrom[$t][$cle] = array(
843
-				"\n" .
844
-				(isset($from_type[$cle]) ? $from_type[$cle] : "INNER") . " JOIN",
843
+				"\n".
844
+				(isset($from_type[$cle]) ? $from_type[$cle] : "INNER")." JOIN",
845 845
 				$from[$cle],
846 846
 				"AS $cle",
847 847
 				"ON (",
848 848
 				"$cle.$c",
849 849
 				"=",
850 850
 				"$t.$carr",
851
-				($and ? "AND " . $and : "") .
851
+				($and ? "AND ".$and : "").
852 852
 				")"
853 853
 			);
854 854
 			if (isset($afrom[$cle])) {
@@ -886,7 +886,7 @@  discard block
 block discarded – undo
886 886
 		$t = key($from);
887 887
 		$c = current($from);
888 888
 		reset($from);
889
-		$e = '/\b(' . "$t\\." . join("|" . $t . '\.', $equiv) . ')\b/';
889
+		$e = '/\b('."$t\\.".join("|".$t.'\.', $equiv).')\b/';
890 890
 		if (!(strpos($t, ' ') or // jointure des le depart cf boucle_doc
891 891
 				calculer_jointnul($t, $select, $e) or
892 892
 				calculer_jointnul($t, $join, $e) or
@@ -903,7 +903,7 @@  discard block
 block discarded – undo
903 903
 			unset($afrom[$t][$nt]);
904 904
 			$afrom[$nt] = $afrom[$t];
905 905
 			unset($afrom[$t]);
906
-			$e = '/\b' . preg_quote($nfrom[6]) . '\b/';
906
+			$e = '/\b'.preg_quote($nfrom[6]).'\b/';
907 907
 			$t = $nfrom[4];
908 908
 			$alias = "";
909 909
 			// verifier que les deux cles sont homonymes, sinon installer un alias dans le select
@@ -914,14 +914,14 @@  discard block
 block discarded – undo
914 914
 			if ($newcle != $oldcle) {
915 915
 				// si l'ancienne cle etait deja dans le select avec un AS
916 916
 				// reprendre simplement ce AS
917
-				$as = '/\b' . preg_quote($nfrom[6]) . '\s+(AS\s+\w+)\b/';
917
+				$as = '/\b'.preg_quote($nfrom[6]).'\s+(AS\s+\w+)\b/';
918 918
 				if (preg_match($as, implode(',', $select), $m)) {
919 919
 					$alias = "";
920 920
 				} else {
921
-					$alias = ", " . $nfrom[4] . " AS $oldcle";
921
+					$alias = ", ".$nfrom[4]." AS $oldcle";
922 922
 				}
923 923
 			}
924
-			$select = remplacer_jointnul($t . $alias, $select, $e);
924
+			$select = remplacer_jointnul($t.$alias, $select, $e);
925 925
 			$join = remplacer_jointnul($t, $join, $e);
926 926
 			$where = remplacer_jointnul($t, $where, $e);
927 927
 			$having = remplacer_jointnul($t, $having, $e);
@@ -962,9 +962,9 @@  discard block
 block discarded – undo
962 962
 	} else {
963 963
 		$exp = "";
964 964
 		if (strtoupper($join) === 'AND') {
965
-			return $exp . join(" $join ", array_map('calculer_where_to_string', $v));
965
+			return $exp.join(" $join ", array_map('calculer_where_to_string', $v));
966 966
 		} else {
967
-			return $exp . join($join, $v);
967
+			return $exp.join($join, $v);
968 968
 		}
969 969
 	}
970 970
 }
@@ -1030,6 +1030,6 @@  discard block
 block discarded – undo
1030 1030
 	}
1031 1031
 
1032 1032
 	return $mime_type
1033
-	. (!$connect ? '' : preg_replace('/\W/', "_", $connect)) . '_'
1034
-	. md5($GLOBALS['spip_version_code'] . ' * ' . $skel . (isset($GLOBALS['marqueur_skel']) ? '*' . $GLOBALS['marqueur_skel'] : ''));
1033
+	. (!$connect ? '' : preg_replace('/\W/', "_", $connect)).'_'
1034
+	. md5($GLOBALS['spip_version_code'].' * '.$skel.(isset($GLOBALS['marqueur_skel']) ? '*'.$GLOBALS['marqueur_skel'] : ''));
1035 1035
 }
Please login to merge, or discard this patch.