Completed
Push — master ( feea64...6b28f6 )
by cam
01:26
created
ecrire/public/format_html.php 1 patch
Indentation   +92 added lines, -92 removed lines patch added patch discarded remove patch
@@ -11,129 +11,129 @@
 block discarded – undo
11 11
 \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
16 16
 
17 17
 function format_boucle_html($preaff, $avant, $nom, $type, $crit, $corps, $apres, $altern, $postaff, $prof) {
18
-	$preaff = $preaff ? "<BB$nom>$preaff" : '';
19
-	$avant = $avant ? "<B$nom>$avant" : '';
20
-	$apres = $apres ? "$apres</B$nom>" : '';
21
-	$altern = $altern ? "$altern<//B$nom>" : '';
22
-	$postaff = $postaff ? "$postaff</BB$nom>" : '';
23
-	if (!$corps) {
24
-		$corps = ' />';
25
-	} else {
26
-		$corps = ">$corps</BOUCLE$nom>";
27
-	}
28
-
29
-	return "$preaff$avant<BOUCLE$nom($type)$crit$corps$apres$altern$postaff";
18
+    $preaff = $preaff ? "<BB$nom>$preaff" : '';
19
+    $avant = $avant ? "<B$nom>$avant" : '';
20
+    $apres = $apres ? "$apres</B$nom>" : '';
21
+    $altern = $altern ? "$altern<//B$nom>" : '';
22
+    $postaff = $postaff ? "$postaff</BB$nom>" : '';
23
+    if (!$corps) {
24
+        $corps = ' />';
25
+    } else {
26
+        $corps = ">$corps</BOUCLE$nom>";
27
+    }
28
+
29
+    return "$preaff$avant<BOUCLE$nom($type)$crit$corps$apres$altern$postaff";
30 30
 }
31 31
 
32 32
 function format_inclure_html($file, $args, $prof) {
33
-	if (strpos($file, '#') === false) {
34
-		$t = $file ? ('(' . $file . ')') : '';
35
-	} else {
36
-		$t = '{fond=' . $file . '}';
37
-	}
38
-	$args = !$args ? '' : ('{' . join(', ', $args) . '}');
39
-
40
-	return ('<INCLURE' . $t . $args . '>');
33
+    if (strpos($file, '#') === false) {
34
+        $t = $file ? ('(' . $file . ')') : '';
35
+    } else {
36
+        $t = '{fond=' . $file . '}';
37
+    }
38
+    $args = !$args ? '' : ('{' . join(', ', $args) . '}');
39
+
40
+    return ('<INCLURE' . $t . $args . '>');
41 41
 }
42 42
 
43 43
 function format_polyglotte_html($args, $prof) {
44
-	$contenu = [];
45
-	foreach ($args as $l => $t) {
46
-		$contenu[] = ($l ? "[$l]" : '') . $t;
47
-	}
44
+    $contenu = [];
45
+    foreach ($args as $l => $t) {
46
+        $contenu[] = ($l ? "[$l]" : '') . $t;
47
+    }
48 48
 
49
-	return ('<multi>' . join(' ', $contenu) . '</multi>');
49
+    return ('<multi>' . join(' ', $contenu) . '</multi>');
50 50
 }
51 51
 
52 52
 function format_idiome_html($nom, $module, $args, $filtres, $prof) {
53
-	foreach ($args as $k => $v) {
54
-		$args[$k] = "$k=$v";
55
-	}
56
-	$args = (!$args ? '' : ('{' . join(',', $args) . '}'));
53
+    foreach ($args as $k => $v) {
54
+        $args[$k] = "$k=$v";
55
+    }
56
+    $args = (!$args ? '' : ('{' . join(',', $args) . '}'));
57 57
 
58
-	return ('<:' . ($module ? "$module:" : '') . $nom . $args . $filtres . ':>');
58
+    return ('<:' . ($module ? "$module:" : '') . $nom . $args . $filtres . ':>');
59 59
 }
60 60
 
61 61
 function format_champ_html($nom, $boucle, $etoile, $avant, $apres, $args, $filtres, $prof) {
62
-	$nom = '#'
63
-		. ($boucle ? ($boucle . ':') : '')
64
-		. $nom
65
-		. $etoile
66
-		. $args
67
-		. $filtres;
62
+    $nom = '#'
63
+        . ($boucle ? ($boucle . ':') : '')
64
+        . $nom
65
+        . $etoile
66
+        . $args
67
+        . $filtres;
68 68
 
69
-	// Determiner si c'est un champ etendu,
69
+    // Determiner si c'est un champ etendu,
70 70
 
71
-	$s = ($avant or $apres or $filtres
72
-		or (strpos($args, '(#') !== false));
71
+    $s = ($avant or $apres or $filtres
72
+        or (strpos($args, '(#') !== false));
73 73
 
74
-	return ($s ? "[$avant($nom)$apres]" : $nom);
74
+    return ($s ? "[$avant($nom)$apres]" : $nom);
75 75
 }
76 76
 
77 77
 function format_critere_html($critere) {
78
-	foreach ($critere as $k => $crit) {
79
-		$crit_s = '';
80
-		foreach ($crit as $operande) {
81
-			list($type, $valeur) = $operande;
82
-			if ($type == 'champ' and $valeur[0] == '[') {
83
-				$valeur = substr($valeur, 1, -1);
84
-				if (preg_match(',^[(](#[^|]*)[)]$,sS', $valeur)) {
85
-					$valeur = substr($valeur, 1, -1);
86
-				}
87
-			}
88
-			$crit_s .= $valeur;
89
-		}
90
-		$critere[$k] = $crit_s;
91
-	}
92
-
93
-	return (!$critere ? '' : ('{' . join(',', $critere) . '}'));
78
+    foreach ($critere as $k => $crit) {
79
+        $crit_s = '';
80
+        foreach ($crit as $operande) {
81
+            list($type, $valeur) = $operande;
82
+            if ($type == 'champ' and $valeur[0] == '[') {
83
+                $valeur = substr($valeur, 1, -1);
84
+                if (preg_match(',^[(](#[^|]*)[)]$,sS', $valeur)) {
85
+                    $valeur = substr($valeur, 1, -1);
86
+                }
87
+            }
88
+            $crit_s .= $valeur;
89
+        }
90
+        $critere[$k] = $crit_s;
91
+    }
92
+
93
+    return (!$critere ? '' : ('{' . join(',', $critere) . '}'));
94 94
 }
95 95
 
96 96
 function format_liste_html($fonc, $args, $prof) {
97
-	return ((($fonc !== '') ? "|$fonc" : $fonc)
98
-		. (!$args ? '' : ('{' . join(',', $args) . '}')));
97
+    return ((($fonc !== '') ? "|$fonc" : $fonc)
98
+        . (!$args ? '' : ('{' . join(',', $args) . '}')));
99 99
 }
100 100
 
101 101
 // Concatenation sans separateur: verifier qu'on ne cree pas de faux lexemes
102 102
 function format_suite_html($args) {
103
-	for ($i = 0; $i < count($args) - 1; $i++) {
104
-		list($texte, $type) = $args[$i];
105
-		list($texte2, $type2) = $args[$i + 1];
106
-		if (!$texte or !$texte2) {
107
-			continue;
108
-		}
109
-		$c1 = substr($texte, -1);
110
-		if ($type2 !== 'texte') {
111
-			// si un texte se termine par ( et est suivi d'un champ
112
-			// ou assimiles, forcer la notation pleine
113
-			if ($c1 == '(' and substr($texte2, 0, 1) == '#') {
114
-				$args[$i + 1][0] = '[(' . $texte2 . ')]';
115
-			}
116
-		} else {
117
-			if ($type == 'texte') {
118
-				continue;
119
-			}
120
-			// si un champ ou assimiles est suivi d'un texte
121
-			// et si celui-ci commence par un caractere de champ
122
-			// forcer la notation pleine
123
-			if (
124
-				($c1 == '}' and substr(ltrim($texte2), 0, 1) == '|')
125
-				or (preg_match('/[\w\d_*]/', $c1) and preg_match('/^[\w\d_*{|]/', $texte2))
126
-			) {
127
-				$args[$i][0] = '[(' . $texte . ')]';
128
-			}
129
-		}
130
-	}
131
-
132
-	return join('', array_map(function ($arg) {
133
- return reset($arg);
134
-	}, $args));
103
+    for ($i = 0; $i < count($args) - 1; $i++) {
104
+        list($texte, $type) = $args[$i];
105
+        list($texte2, $type2) = $args[$i + 1];
106
+        if (!$texte or !$texte2) {
107
+            continue;
108
+        }
109
+        $c1 = substr($texte, -1);
110
+        if ($type2 !== 'texte') {
111
+            // si un texte se termine par ( et est suivi d'un champ
112
+            // ou assimiles, forcer la notation pleine
113
+            if ($c1 == '(' and substr($texte2, 0, 1) == '#') {
114
+                $args[$i + 1][0] = '[(' . $texte2 . ')]';
115
+            }
116
+        } else {
117
+            if ($type == 'texte') {
118
+                continue;
119
+            }
120
+            // si un champ ou assimiles est suivi d'un texte
121
+            // et si celui-ci commence par un caractere de champ
122
+            // forcer la notation pleine
123
+            if (
124
+                ($c1 == '}' and substr(ltrim($texte2), 0, 1) == '|')
125
+                or (preg_match('/[\w\d_*]/', $c1) and preg_match('/^[\w\d_*{|]/', $texte2))
126
+            ) {
127
+                $args[$i][0] = '[(' . $texte . ')]';
128
+            }
129
+        }
130
+    }
131
+
132
+    return join('', array_map(function ($arg) {
133
+    return reset($arg);
134
+    }, $args));
135 135
 }
136 136
 
137 137
 function format_texte_html($texte) {
138
-	return $texte;
138
+    return $texte;
139 139
 }
Please login to merge, or discard this patch.
ecrire/public/styliser_par_z.php 1 patch
Indentation   +319 added lines, -319 removed lines patch added patch discarded remove patch
@@ -19,7 +19,7 @@  discard block
 block discarded – undo
19 19
  * @package SPIP\Core\Public\Styliser
20 20
  **/
21 21
 if (!defined('_ECRIRE_INC_VERSION')) {
22
-	return;
22
+    return;
23 23
 }
24 24
 
25 25
 /**
@@ -29,193 +29,193 @@  discard block
 block discarded – undo
29 29
  * @return array Données modifiées du pipeline
30 30
  */
31 31
 function public_styliser_par_z_dist($flux) {
32
-	static $prefix_path = null;
33
-	static $prefix_length;
34
-	static $z_blocs;
35
-	static $apl_constant;
36
-	static $page;
37
-	static $disponible = [];
38
-	static $echafauder;
39
-	static $prepend = '';
40
-
41
-	if (!isset($prefix_path)) {
42
-		$z_blocs = z_blocs(test_espace_prive());
43
-		if (test_espace_prive()) {
44
-			$prefix_path = 'prive/squelettes/';
45
-			$prefix_length = strlen($prefix_path);
46
-			$apl_constant = '_ECRIRE_AJAX_PARALLEL_LOAD';
47
-			$page = 'exec';
48
-			$echafauder = charger_fonction('echafauder', 'prive', true);
49
-			define('_ZCORE_EXCLURE_PATH', '');
50
-		} else {
51
-			$prefix_path = '';
52
-			$prefix_length = 0;
53
-			$apl_constant = '_Z_AJAX_PARALLEL_LOAD';
54
-			$page = _SPIP_PAGE;
55
-			$echafauder = charger_fonction('echafauder', 'public', true);
56
-			define('_ZCORE_EXCLURE_PATH', '\bprive|\bsquelettes-dist' . (defined('_DIR_PLUGIN_DIST') ? '|\b' . rtrim(
57
-				_DIR_PLUGIN_DIST,
58
-				'/'
59
-			) : ''));
60
-		}
61
-		$prepend = (defined('_Z_PREPEND_PATH') ? _Z_PREPEND_PATH : '');
62
-	}
63
-	$z_contenu = reset($z_blocs); // contenu par defaut
64
-
65
-	$fond = $flux['args']['fond'];
66
-
67
-	if ($prepend or strncmp($fond, $prefix_path, $prefix_length) == 0) {
68
-		$fond = substr($fond, $prefix_length);
69
-		$squelette = $flux['data'];
70
-		$ext = $flux['args']['ext'];
71
-		// Ajax Parallel loading : ne pas calculer le bloc, mais renvoyer un js qui le loadera en ajax
72
-		if (
73
-			defined('_Z_AJAX_PARALLEL_LOAD_OK')
74
-			and $dir = explode('/', $fond)
75
-			and count($dir) == 2 // pas un sous repertoire
76
-			and $dir = reset($dir)
77
-			and in_array($dir, $z_blocs) // verifier deja qu'on est dans un bloc Z
78
-			and defined($apl_constant)
79
-			and in_array($dir, explode(',', constant($apl_constant))) // et dans un demande en APL
80
-			and $pipe = z_trouver_bloc($prefix_path . $prepend, $dir, 'z_apl', $ext) // et qui contient le squelette APL
81
-		) {
82
-			$flux['data'] = $pipe;
83
-
84
-			return $flux;
85
-		}
86
-
87
-		// surcharger aussi les squelettes venant de squelettes-dist/
88
-		if ($squelette and !z_fond_valide($squelette)) {
89
-			$squelette = '';
90
-			$echafauder = '';
91
-		}
92
-		if ($prepend) {
93
-			$squelette = substr(find_in_path($prefix_path . $prepend . "$fond.$ext"), 0, -strlen(".$ext"));
94
-			if ($squelette) {
95
-				$flux['data'] = $squelette;
96
-			}
97
-		}
98
-
99
-		// gerer les squelettes non trouves
100
-		// -> router vers les /dist.html
101
-		// ou scaffolding ou page automatique les contenus
102
-		if (!$squelette) {
103
-			// si on est sur un ?page=XX non trouve
104
-			if (
105
-				(isset($flux['args']['contexte'][$page])
106
-					and $flux['args']['contexte'][$page] == $fond)
107
-				or (isset($flux['args']['contexte']['type-page'])
108
-					and $flux['args']['contexte']['type-page'] == $fond)
109
-				or ($fond == 'sommaire'
110
-					and (!isset($flux['args']['contexte'][$page]) or !$flux['args']['contexte'][$page]))
111
-			) {
112
-				// si on est sur un ?page=XX non trouve
113
-				// se brancher sur contenu/xx si il existe
114
-				// ou si c'est un objet spip, associe a une table, utiliser le fond homonyme
115
-				if (!isset($disponible[$fond])) {
116
-					$disponible[$fond] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $fond, $ext, $echafauder);
117
-				}
118
-
119
-				if ($disponible[$fond]) {
120
-					$flux['data'] = substr(find_in_path($prefix_path . "page.$ext"), 0, -strlen(".$ext"));
121
-				}
122
-			}
123
-
124
-			// echafaudage :
125
-			// si c'est un fond de contenu d'un objet en base
126
-			// generer un fond automatique a la volee pour les webmestres
127
-			elseif (strncmp($fond, "$z_contenu/", strlen($z_contenu) + 1) == 0) {
128
-				$type = substr($fond, strlen($z_contenu) + 1);
129
-				if (($type == 'page') and isset($flux['args']['contexte'][$page])) {
130
-					$type = $flux['args']['contexte'][$page];
131
-				}
132
-				if (!isset($disponible[$type])) {
133
-					$disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, $echafauder);
134
-				}
135
-				if (is_string($disponible[$type])) {
136
-					$flux['data'] = $disponible[$type];
137
-				} elseif (
138
-					$echafauder
139
-					and include_spip('inc/autoriser')
140
-					and isset($GLOBALS['visiteur_session']['statut']) // performance
141
-					and autoriser('echafauder', $type)
142
-					and $is = $disponible[$type]
143
-					and is_array($is)
144
-				) {
145
-					$flux['data'] = $echafauder($type, $is[0], $is[1], $is[2], $ext);
146
-				} else {
147
-					$flux['data'] = ($disponible['404'] = z_contenu_disponible(
148
-						$prefix_path . $prepend,
149
-						$z_contenu,
150
-						'404',
151
-						$ext,
152
-						$echafauder
153
-					));
154
-				}
155
-			}
156
-
157
-			// sinon, si on demande un fond non trouve dans un des autres blocs
158
-			// et si il y a bien un contenu correspondant ou echafaudable
159
-			// se rabbatre sur le dist.html du bloc concerne
160
-			else {
161
-				if (
162
-					$dir = explode('/', $fond)
163
-					and $dir = reset($dir)
164
-					and $dir !== $z_contenu
165
-					and in_array($dir, $z_blocs)
166
-				) {
167
-					$type = substr($fond, strlen("$dir/"));
168
-					if (($type == 'page') and isset($flux['args']['contexte'][$page])) {
169
-						$type = $flux['args']['contexte'][$page];
170
-					}
171
-					if ($type !== 'page' and !isset($disponible[$type])) {
172
-						$disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, $echafauder);
173
-					}
174
-					if ($type == 'page' or $disponible[$type]) {
175
-						$flux['data'] = z_trouver_bloc($prefix_path . $prepend, $dir, 'dist', $ext);
176
-					}
177
-				}
178
-			}
179
-			$squelette = $flux['data'];
180
-		}
181
-		// layout specifiques par type et compositions :
182
-		// body-article.html
183
-		// body-sommaire.html
184
-		// pour des raisons de perfo, les declinaisons doivent etre dans le
185
-		// meme dossier que body.html
186
-		if ($fond == 'body' and substr($squelette, -strlen($fond)) == $fond) {
187
-			if (
188
-				isset($flux['args']['contexte']['type-page'])
189
-				and (
190
-					(isset($flux['args']['contexte']['composition'])
191
-						and file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page'] . '-' . $flux['args']['contexte']['composition']) . ".$ext"))
192
-					or
193
-					file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page']) . ".$ext")
194
-				)
195
-			) {
196
-				$flux['data'] = $f;
197
-			}
198
-		} elseif (
199
-			$fond == 'structure'
200
-			and z_sanitize_var_zajax()
201
-			and $f = find_in_path($prefix_path . $prepend . 'ajax' . ".$ext")
202
-		) {
203
-			$flux['data'] = substr($f, 0, -strlen(".$ext"));
204
-		} // chercher le fond correspondant a la composition
205
-		elseif (
206
-			isset($flux['args']['contexte']['composition'])
207
-			and (basename($fond) == 'page' or ($squelette and substr($squelette, -strlen($fond)) == $fond))
208
-			and $dir = substr($fond, $prefix_length)
209
-			and $dir = explode('/', $dir)
210
-			and $dir = reset($dir)
211
-			and in_array($dir, $z_blocs)
212
-			and $f = find_in_path($prefix_path . $prepend . $fond . '-' . $flux['args']['contexte']['composition'] . ".$ext")
213
-		) {
214
-			$flux['data'] = substr($f, 0, -strlen(".$ext"));
215
-		}
216
-	}
217
-
218
-	return $flux;
32
+    static $prefix_path = null;
33
+    static $prefix_length;
34
+    static $z_blocs;
35
+    static $apl_constant;
36
+    static $page;
37
+    static $disponible = [];
38
+    static $echafauder;
39
+    static $prepend = '';
40
+
41
+    if (!isset($prefix_path)) {
42
+        $z_blocs = z_blocs(test_espace_prive());
43
+        if (test_espace_prive()) {
44
+            $prefix_path = 'prive/squelettes/';
45
+            $prefix_length = strlen($prefix_path);
46
+            $apl_constant = '_ECRIRE_AJAX_PARALLEL_LOAD';
47
+            $page = 'exec';
48
+            $echafauder = charger_fonction('echafauder', 'prive', true);
49
+            define('_ZCORE_EXCLURE_PATH', '');
50
+        } else {
51
+            $prefix_path = '';
52
+            $prefix_length = 0;
53
+            $apl_constant = '_Z_AJAX_PARALLEL_LOAD';
54
+            $page = _SPIP_PAGE;
55
+            $echafauder = charger_fonction('echafauder', 'public', true);
56
+            define('_ZCORE_EXCLURE_PATH', '\bprive|\bsquelettes-dist' . (defined('_DIR_PLUGIN_DIST') ? '|\b' . rtrim(
57
+                _DIR_PLUGIN_DIST,
58
+                '/'
59
+            ) : ''));
60
+        }
61
+        $prepend = (defined('_Z_PREPEND_PATH') ? _Z_PREPEND_PATH : '');
62
+    }
63
+    $z_contenu = reset($z_blocs); // contenu par defaut
64
+
65
+    $fond = $flux['args']['fond'];
66
+
67
+    if ($prepend or strncmp($fond, $prefix_path, $prefix_length) == 0) {
68
+        $fond = substr($fond, $prefix_length);
69
+        $squelette = $flux['data'];
70
+        $ext = $flux['args']['ext'];
71
+        // Ajax Parallel loading : ne pas calculer le bloc, mais renvoyer un js qui le loadera en ajax
72
+        if (
73
+            defined('_Z_AJAX_PARALLEL_LOAD_OK')
74
+            and $dir = explode('/', $fond)
75
+            and count($dir) == 2 // pas un sous repertoire
76
+            and $dir = reset($dir)
77
+            and in_array($dir, $z_blocs) // verifier deja qu'on est dans un bloc Z
78
+            and defined($apl_constant)
79
+            and in_array($dir, explode(',', constant($apl_constant))) // et dans un demande en APL
80
+            and $pipe = z_trouver_bloc($prefix_path . $prepend, $dir, 'z_apl', $ext) // et qui contient le squelette APL
81
+        ) {
82
+            $flux['data'] = $pipe;
83
+
84
+            return $flux;
85
+        }
86
+
87
+        // surcharger aussi les squelettes venant de squelettes-dist/
88
+        if ($squelette and !z_fond_valide($squelette)) {
89
+            $squelette = '';
90
+            $echafauder = '';
91
+        }
92
+        if ($prepend) {
93
+            $squelette = substr(find_in_path($prefix_path . $prepend . "$fond.$ext"), 0, -strlen(".$ext"));
94
+            if ($squelette) {
95
+                $flux['data'] = $squelette;
96
+            }
97
+        }
98
+
99
+        // gerer les squelettes non trouves
100
+        // -> router vers les /dist.html
101
+        // ou scaffolding ou page automatique les contenus
102
+        if (!$squelette) {
103
+            // si on est sur un ?page=XX non trouve
104
+            if (
105
+                (isset($flux['args']['contexte'][$page])
106
+                    and $flux['args']['contexte'][$page] == $fond)
107
+                or (isset($flux['args']['contexte']['type-page'])
108
+                    and $flux['args']['contexte']['type-page'] == $fond)
109
+                or ($fond == 'sommaire'
110
+                    and (!isset($flux['args']['contexte'][$page]) or !$flux['args']['contexte'][$page]))
111
+            ) {
112
+                // si on est sur un ?page=XX non trouve
113
+                // se brancher sur contenu/xx si il existe
114
+                // ou si c'est un objet spip, associe a une table, utiliser le fond homonyme
115
+                if (!isset($disponible[$fond])) {
116
+                    $disponible[$fond] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $fond, $ext, $echafauder);
117
+                }
118
+
119
+                if ($disponible[$fond]) {
120
+                    $flux['data'] = substr(find_in_path($prefix_path . "page.$ext"), 0, -strlen(".$ext"));
121
+                }
122
+            }
123
+
124
+            // echafaudage :
125
+            // si c'est un fond de contenu d'un objet en base
126
+            // generer un fond automatique a la volee pour les webmestres
127
+            elseif (strncmp($fond, "$z_contenu/", strlen($z_contenu) + 1) == 0) {
128
+                $type = substr($fond, strlen($z_contenu) + 1);
129
+                if (($type == 'page') and isset($flux['args']['contexte'][$page])) {
130
+                    $type = $flux['args']['contexte'][$page];
131
+                }
132
+                if (!isset($disponible[$type])) {
133
+                    $disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, $echafauder);
134
+                }
135
+                if (is_string($disponible[$type])) {
136
+                    $flux['data'] = $disponible[$type];
137
+                } elseif (
138
+                    $echafauder
139
+                    and include_spip('inc/autoriser')
140
+                    and isset($GLOBALS['visiteur_session']['statut']) // performance
141
+                    and autoriser('echafauder', $type)
142
+                    and $is = $disponible[$type]
143
+                    and is_array($is)
144
+                ) {
145
+                    $flux['data'] = $echafauder($type, $is[0], $is[1], $is[2], $ext);
146
+                } else {
147
+                    $flux['data'] = ($disponible['404'] = z_contenu_disponible(
148
+                        $prefix_path . $prepend,
149
+                        $z_contenu,
150
+                        '404',
151
+                        $ext,
152
+                        $echafauder
153
+                    ));
154
+                }
155
+            }
156
+
157
+            // sinon, si on demande un fond non trouve dans un des autres blocs
158
+            // et si il y a bien un contenu correspondant ou echafaudable
159
+            // se rabbatre sur le dist.html du bloc concerne
160
+            else {
161
+                if (
162
+                    $dir = explode('/', $fond)
163
+                    and $dir = reset($dir)
164
+                    and $dir !== $z_contenu
165
+                    and in_array($dir, $z_blocs)
166
+                ) {
167
+                    $type = substr($fond, strlen("$dir/"));
168
+                    if (($type == 'page') and isset($flux['args']['contexte'][$page])) {
169
+                        $type = $flux['args']['contexte'][$page];
170
+                    }
171
+                    if ($type !== 'page' and !isset($disponible[$type])) {
172
+                        $disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, $echafauder);
173
+                    }
174
+                    if ($type == 'page' or $disponible[$type]) {
175
+                        $flux['data'] = z_trouver_bloc($prefix_path . $prepend, $dir, 'dist', $ext);
176
+                    }
177
+                }
178
+            }
179
+            $squelette = $flux['data'];
180
+        }
181
+        // layout specifiques par type et compositions :
182
+        // body-article.html
183
+        // body-sommaire.html
184
+        // pour des raisons de perfo, les declinaisons doivent etre dans le
185
+        // meme dossier que body.html
186
+        if ($fond == 'body' and substr($squelette, -strlen($fond)) == $fond) {
187
+            if (
188
+                isset($flux['args']['contexte']['type-page'])
189
+                and (
190
+                    (isset($flux['args']['contexte']['composition'])
191
+                        and file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page'] . '-' . $flux['args']['contexte']['composition']) . ".$ext"))
192
+                    or
193
+                    file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page']) . ".$ext")
194
+                )
195
+            ) {
196
+                $flux['data'] = $f;
197
+            }
198
+        } elseif (
199
+            $fond == 'structure'
200
+            and z_sanitize_var_zajax()
201
+            and $f = find_in_path($prefix_path . $prepend . 'ajax' . ".$ext")
202
+        ) {
203
+            $flux['data'] = substr($f, 0, -strlen(".$ext"));
204
+        } // chercher le fond correspondant a la composition
205
+        elseif (
206
+            isset($flux['args']['contexte']['composition'])
207
+            and (basename($fond) == 'page' or ($squelette and substr($squelette, -strlen($fond)) == $fond))
208
+            and $dir = substr($fond, $prefix_length)
209
+            and $dir = explode('/', $dir)
210
+            and $dir = reset($dir)
211
+            and in_array($dir, $z_blocs)
212
+            and $f = find_in_path($prefix_path . $prepend . $fond . '-' . $flux['args']['contexte']['composition'] . ".$ext")
213
+        ) {
214
+            $flux['data'] = substr($f, 0, -strlen(".$ext"));
215
+        }
216
+    }
217
+
218
+    return $flux;
219 219
 }
220 220
 
221 221
 /**
@@ -225,18 +225,18 @@  discard block
 block discarded – undo
225 225
  * @return array
226 226
  */
227 227
 function z_blocs($espace_prive = false) {
228
-	if ($espace_prive) {
229
-		return (isset($GLOBALS['z_blocs_ecrire']) ? $GLOBALS['z_blocs_ecrire'] : [
230
-			'contenu',
231
-			'navigation',
232
-			'extra',
233
-			'head',
234
-			'hierarchie',
235
-			'top'
236
-		]);
237
-	}
238
-
239
-	return (isset($GLOBALS['z_blocs']) ? $GLOBALS['z_blocs'] : ['contenu']);
228
+    if ($espace_prive) {
229
+        return (isset($GLOBALS['z_blocs_ecrire']) ? $GLOBALS['z_blocs_ecrire'] : [
230
+            'contenu',
231
+            'navigation',
232
+            'extra',
233
+            'head',
234
+            'hierarchie',
235
+            'top'
236
+        ]);
237
+    }
238
+
239
+    return (isset($GLOBALS['z_blocs']) ? $GLOBALS['z_blocs'] : ['contenu']);
240 240
 }
241 241
 
242 242
 /**
@@ -251,11 +251,11 @@  discard block
 block discarded – undo
251 251
  * @return mixed
252 252
  */
253 253
 function z_contenu_disponible($prefix_path, $z_contenu, $type, $ext, $echafauder = true) {
254
-	if ($d = z_trouver_bloc($prefix_path, $z_contenu, $type, $ext)) {
255
-		return $d;
256
-	}
254
+    if ($d = z_trouver_bloc($prefix_path, $z_contenu, $type, $ext)) {
255
+        return $d;
256
+    }
257 257
 
258
-	return $echafauder ? z_echafaudable($type) : false;
258
+    return $echafauder ? z_echafaudable($type) : false;
259 259
 }
260 260
 
261 261
 /**
@@ -269,14 +269,14 @@  discard block
 block discarded – undo
269 269
  *   `true` si on peut l'utiliser, `false` sinon.
270 270
  **/
271 271
 function z_fond_valide($squelette) {
272
-	if (
273
-		!_ZCORE_EXCLURE_PATH
274
-		or !preg_match(',(' . _ZCORE_EXCLURE_PATH . ')/,', $squelette)
275
-	) {
276
-		return true;
277
-	}
278
-
279
-	return false;
272
+    if (
273
+        !_ZCORE_EXCLURE_PATH
274
+        or !preg_match(',(' . _ZCORE_EXCLURE_PATH . ')/,', $squelette)
275
+    ) {
276
+        return true;
277
+    }
278
+
279
+    return false;
280 280
 }
281 281
 
282 282
 /**
@@ -294,14 +294,14 @@  discard block
 block discarded – undo
294 294
  * @return string
295 295
  */
296 296
 function z_trouver_bloc($prefix_path, $bloc, $fond, $ext) {
297
-	if (
298
-		(defined('_ZCORE_BLOC_PREFIX_SKEL') and $f = find_in_path("$prefix_path$bloc/$bloc.$fond.$ext") and z_fond_valide($f))
299
-		or ($f = find_in_path("$prefix_path$bloc/$fond.$ext") and z_fond_valide($f))
300
-	) {
301
-		return substr($f, 0, -strlen(".$ext"));
302
-	}
303
-
304
-	return '';
297
+    if (
298
+        (defined('_ZCORE_BLOC_PREFIX_SKEL') and $f = find_in_path("$prefix_path$bloc/$bloc.$fond.$ext") and z_fond_valide($f))
299
+        or ($f = find_in_path("$prefix_path$bloc/$fond.$ext") and z_fond_valide($f))
300
+    ) {
301
+        return substr($f, 0, -strlen(".$ext"));
302
+    }
303
+
304
+    return '';
305 305
 }
306 306
 
307 307
 /**
@@ -313,52 +313,52 @@  discard block
 block discarded – undo
313 313
  * @return bool
314 314
  */
315 315
 function z_echafaudable($type) {
316
-	static $pages = null;
317
-	static $echafaudable = [];
318
-	if (isset($echafaudable[$type])) {
319
-		return $echafaudable[$type];
320
-	}
321
-	if (preg_match(',[^\w],', $type)) {
322
-		return $echafaudable[$type] = false;
323
-	}
324
-
325
-	if (test_espace_prive()) {
326
-		if (!function_exists('trouver_objet_exec')) {
327
-			include_spip('inc/pipelines_ecrire');
328
-		}
329
-		if ($e = trouver_objet_exec($type)) {
330
-			return $echafaudable[$type] = [$e['table'], $e['table_objet_sql'], $e];
331
-		} else {
332
-			// peut etre c'est un exec=types qui liste tous les objets "type"
333
-			if (
334
-				($t = objet_type($type, false)) !== $type
335
-				and $e = trouver_objet_exec($t)
336
-			) {
337
-				return $echafaudable[$type] = [$e['table'], $e['table_objet_sql'], $t];
338
-			}
339
-		}
340
-	} else {
341
-		if (is_null($pages)) {
342
-			$pages = [];
343
-			$liste = lister_tables_objets_sql();
344
-			foreach ($liste as $t => $d) {
345
-				if ($d['page']) {
346
-					$pages[$d['page']] = [$d['table_objet'], $t];
347
-				}
348
-			}
349
-		}
350
-		if (!isset($pages[$type])) {
351
-			return $echafaudable[$type] = false;
352
-		}
353
-		if (count($pages[$type]) == 2) {
354
-			$trouver_table = charger_fonction('trouver_table', 'base');
355
-			$pages[$type][] = $trouver_table(reset($pages[$type]));
356
-		}
357
-
358
-		return $echafaudable[$type] = $pages[$type];
359
-	}
360
-
361
-	return $echafaudable[$type] = false;
316
+    static $pages = null;
317
+    static $echafaudable = [];
318
+    if (isset($echafaudable[$type])) {
319
+        return $echafaudable[$type];
320
+    }
321
+    if (preg_match(',[^\w],', $type)) {
322
+        return $echafaudable[$type] = false;
323
+    }
324
+
325
+    if (test_espace_prive()) {
326
+        if (!function_exists('trouver_objet_exec')) {
327
+            include_spip('inc/pipelines_ecrire');
328
+        }
329
+        if ($e = trouver_objet_exec($type)) {
330
+            return $echafaudable[$type] = [$e['table'], $e['table_objet_sql'], $e];
331
+        } else {
332
+            // peut etre c'est un exec=types qui liste tous les objets "type"
333
+            if (
334
+                ($t = objet_type($type, false)) !== $type
335
+                and $e = trouver_objet_exec($t)
336
+            ) {
337
+                return $echafaudable[$type] = [$e['table'], $e['table_objet_sql'], $t];
338
+            }
339
+        }
340
+    } else {
341
+        if (is_null($pages)) {
342
+            $pages = [];
343
+            $liste = lister_tables_objets_sql();
344
+            foreach ($liste as $t => $d) {
345
+                if ($d['page']) {
346
+                    $pages[$d['page']] = [$d['table_objet'], $t];
347
+                }
348
+            }
349
+        }
350
+        if (!isset($pages[$type])) {
351
+            return $echafaudable[$type] = false;
352
+        }
353
+        if (count($pages[$type]) == 2) {
354
+            $trouver_table = charger_fonction('trouver_table', 'base');
355
+            $pages[$type][] = $trouver_table(reset($pages[$type]));
356
+        }
357
+
358
+        return $echafaudable[$type] = $pages[$type];
359
+    }
360
+
361
+    return $echafaudable[$type] = false;
362 362
 }
363 363
 
364 364
 
@@ -375,46 +375,46 @@  discard block
 block discarded – undo
375 375
  * @return string
376 376
  */
377 377
 function prive_echafauder_dist($exec, $table, $table_sql, $desc_exec, $ext) {
378
-	$scaffold = '';
379
-
380
-	// page objet ou objet_edit
381
-	if (is_array($desc_exec)) {
382
-		$type = $desc_exec['type'];
383
-		$primary = $desc_exec['id_table_objet'];
384
-
385
-		if ($desc_exec['edition'] === false) {
386
-			$fond = 'objet';
387
-		} else {
388
-			$trouver_table = charger_fonction('trouver_table', 'base');
389
-			$desc = $trouver_table($table_sql);
390
-			if (isset($desc['field']['id_rubrique'])) {
391
-				$fond = 'objet_edit';
392
-			} else {
393
-				$fond = 'objet_edit.sans_rubrique';
394
-			}
395
-		}
396
-		$dir = z_blocs(test_espace_prive());
397
-		$dir = reset($dir);
398
-		$scaffold = "<INCLURE{fond=prive/echafaudage/$dir/" . $fond . ',objet=' . $type . ',id_objet=#' . strtoupper($primary) . ',env}>';
399
-	} // page objets
400
-	elseif ($type = $desc_exec and strpos($type, '/') === false) {
401
-		$dir = z_blocs(test_espace_prive());
402
-		$dir = reset($dir);
403
-		$scaffold = "<INCLURE{fond=prive/echafaudage/$dir/objets,objet=" . $type . ',env} />';
404
-	}
405
-	// morceau d'objet : on fournit le fond de sibstitution dans $desc_exec
406
-	// et objet et tire de $table
407
-	elseif ($fond = $desc_exec) {
408
-		$dir = md5(dirname($fond));
409
-		$scaffold = "<INCLURE{fond=$fond,objet=" . objet_type($table) . ',env} />';
410
-	}
411
-
412
-	$base_dir = sous_repertoire(_DIR_CACHE, 'scaffold', false);
413
-	$base_dir = sous_repertoire($base_dir, $dir, false);
414
-	$f = $base_dir . "$exec";
415
-	ecrire_fichier("$f.$ext", $scaffold);
416
-
417
-	return $f;
378
+    $scaffold = '';
379
+
380
+    // page objet ou objet_edit
381
+    if (is_array($desc_exec)) {
382
+        $type = $desc_exec['type'];
383
+        $primary = $desc_exec['id_table_objet'];
384
+
385
+        if ($desc_exec['edition'] === false) {
386
+            $fond = 'objet';
387
+        } else {
388
+            $trouver_table = charger_fonction('trouver_table', 'base');
389
+            $desc = $trouver_table($table_sql);
390
+            if (isset($desc['field']['id_rubrique'])) {
391
+                $fond = 'objet_edit';
392
+            } else {
393
+                $fond = 'objet_edit.sans_rubrique';
394
+            }
395
+        }
396
+        $dir = z_blocs(test_espace_prive());
397
+        $dir = reset($dir);
398
+        $scaffold = "<INCLURE{fond=prive/echafaudage/$dir/" . $fond . ',objet=' . $type . ',id_objet=#' . strtoupper($primary) . ',env}>';
399
+    } // page objets
400
+    elseif ($type = $desc_exec and strpos($type, '/') === false) {
401
+        $dir = z_blocs(test_espace_prive());
402
+        $dir = reset($dir);
403
+        $scaffold = "<INCLURE{fond=prive/echafaudage/$dir/objets,objet=" . $type . ',env} />';
404
+    }
405
+    // morceau d'objet : on fournit le fond de sibstitution dans $desc_exec
406
+    // et objet et tire de $table
407
+    elseif ($fond = $desc_exec) {
408
+        $dir = md5(dirname($fond));
409
+        $scaffold = "<INCLURE{fond=$fond,objet=" . objet_type($table) . ',env} />';
410
+    }
411
+
412
+    $base_dir = sous_repertoire(_DIR_CACHE, 'scaffold', false);
413
+    $base_dir = sous_repertoire($base_dir, $dir, false);
414
+    $f = $base_dir . "$exec";
415
+    ecrire_fichier("$f.$ext", $scaffold);
416
+
417
+    return $f;
418 418
 }
419 419
 
420 420
 /**
@@ -423,17 +423,17 @@  discard block
 block discarded – undo
423 423
  * @return bool|string
424 424
  */
425 425
 function z_sanitize_var_zajax() {
426
-	$z_ajax = _request('var_zajax');
427
-	if (!$z_ajax) {
428
-		return false;
429
-	}
430
-	if (
431
-		!$z_blocs = z_blocs(test_espace_prive())
432
-		or !in_array($z_ajax, $z_blocs)
433
-	) {
434
-		set_request('var_zajax'); // enlever cette demande incongrue
435
-		$z_ajax = false;
436
-	}
437
-
438
-	return $z_ajax;
426
+    $z_ajax = _request('var_zajax');
427
+    if (!$z_ajax) {
428
+        return false;
429
+    }
430
+    if (
431
+        !$z_blocs = z_blocs(test_espace_prive())
432
+        or !in_array($z_ajax, $z_blocs)
433
+    ) {
434
+        set_request('var_zajax'); // enlever cette demande incongrue
435
+        $z_ajax = false;
436
+    }
437
+
438
+    return $z_ajax;
439 439
 }
Please login to merge, or discard this patch.
ecrire/public/evaluer_page.php 1 patch
Indentation   +58 added lines, -58 removed lines patch added patch discarded remove patch
@@ -11,7 +11,7 @@  discard block
 block discarded – undo
11 11
 \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
16 16
 
17 17
 /**
@@ -32,67 +32,67 @@  discard block
 block discarded – undo
32 32
 
33 33
 // Cas d'une page contenant du PHP :
34 34
 if (empty($page['process_ins']) or $page['process_ins'] != 'html') {
35
-	include_spip('inc/lang');
35
+    include_spip('inc/lang');
36 36
 
37
-	// restaurer l'etat des notes avant calcul
38
-	if (
39
-		isset($page['notes'])
40
-		and $page['notes']
41
-		and $notes = charger_fonction('notes', 'inc', true)
42
-	) {
43
-		$notes($page['notes'], 'restaurer_etat');
44
-	}
45
-	ob_start();
46
-	if (strpos($page['texte'], '?xml') !== false) {
47
-		$page['texte'] = str_replace('<' . '?xml', "<\1?xml", $page['texte']);
48
-	}
37
+    // restaurer l'etat des notes avant calcul
38
+    if (
39
+        isset($page['notes'])
40
+        and $page['notes']
41
+        and $notes = charger_fonction('notes', 'inc', true)
42
+    ) {
43
+        $notes($page['notes'], 'restaurer_etat');
44
+    }
45
+    ob_start();
46
+    if (strpos($page['texte'], '?xml') !== false) {
47
+        $page['texte'] = str_replace('<' . '?xml', "<\1?xml", $page['texte']);
48
+    }
49 49
 
50
-	try {
51
-		$res = eval('?' . '>' . $page['texte']);
52
-		// error catching 5.2<=PHP<7
53
-		if (
54
-			$res === false
55
-			and function_exists('error_get_last')
56
-			and ($erreur = error_get_last())
57
-		) {
58
-			$code = $page['texte'];
59
-			$GLOBALS['numero_ligne_php'] = 1;
60
-			if (!function_exists('numerote_ligne_php')) {
61
-				function numerote_ligne_php($match) {
62
-					$GLOBALS['numero_ligne_php']++;
63
-					return "\n/*" . str_pad($GLOBALS['numero_ligne_php'], 3, '0', STR_PAD_LEFT) . '*/';
64
-				}
65
-			}
66
-			$code = '/*001*/' . preg_replace_callback(",\n,", 'numerote_ligne_php', $code);
67
-			$code = trim(highlight_string($code, true));
68
-			erreur_squelette('L' . $erreur['line'] . ': ' . $erreur['message'] . '<br />' . $code, [$page['source'],'',$erreur['file'],'',$GLOBALS['spip_lang']]);
69
-			$page['texte'] = '<!-- Erreur -->';
70
-		}
71
-		else {
72
-			$page['texte'] = ob_get_contents();
73
-		}
74
-	}
75
-	catch (Exception $e) {
76
-		$code = $page['texte'];
77
-		$GLOBALS['numero_ligne_php'] = 1;
78
-		if (!function_exists('numerote_ligne_php')) {
79
-			function numerote_ligne_php($match) {
80
-				$GLOBALS['numero_ligne_php']++;
81
-				return "\n/*" . str_pad($GLOBALS['numero_ligne_php'], 3, '0', STR_PAD_LEFT) . '*/';
82
-			}
83
-		}
84
-		$code = '/*001*/' . preg_replace_callback(",\n,", 'numerote_ligne_php', $code);
85
-		$code = trim(highlight_string($code, true));
86
-		erreur_squelette('L' . $e->getLine() . ': ' . $e->getMessage() . '<br />' . $code, [$page['source'],'',$e->getFile(),'',$GLOBALS['spip_lang']]);
87
-		$page['texte'] = '<!-- Erreur -->';
88
-	}
89
-	ob_end_clean();
50
+    try {
51
+        $res = eval('?' . '>' . $page['texte']);
52
+        // error catching 5.2<=PHP<7
53
+        if (
54
+            $res === false
55
+            and function_exists('error_get_last')
56
+            and ($erreur = error_get_last())
57
+        ) {
58
+            $code = $page['texte'];
59
+            $GLOBALS['numero_ligne_php'] = 1;
60
+            if (!function_exists('numerote_ligne_php')) {
61
+                function numerote_ligne_php($match) {
62
+                    $GLOBALS['numero_ligne_php']++;
63
+                    return "\n/*" . str_pad($GLOBALS['numero_ligne_php'], 3, '0', STR_PAD_LEFT) . '*/';
64
+                }
65
+            }
66
+            $code = '/*001*/' . preg_replace_callback(",\n,", 'numerote_ligne_php', $code);
67
+            $code = trim(highlight_string($code, true));
68
+            erreur_squelette('L' . $erreur['line'] . ': ' . $erreur['message'] . '<br />' . $code, [$page['source'],'',$erreur['file'],'',$GLOBALS['spip_lang']]);
69
+            $page['texte'] = '<!-- Erreur -->';
70
+        }
71
+        else {
72
+            $page['texte'] = ob_get_contents();
73
+        }
74
+    }
75
+    catch (Exception $e) {
76
+        $code = $page['texte'];
77
+        $GLOBALS['numero_ligne_php'] = 1;
78
+        if (!function_exists('numerote_ligne_php')) {
79
+            function numerote_ligne_php($match) {
80
+                $GLOBALS['numero_ligne_php']++;
81
+                return "\n/*" . str_pad($GLOBALS['numero_ligne_php'], 3, '0', STR_PAD_LEFT) . '*/';
82
+            }
83
+        }
84
+        $code = '/*001*/' . preg_replace_callback(",\n,", 'numerote_ligne_php', $code);
85
+        $code = trim(highlight_string($code, true));
86
+        erreur_squelette('L' . $e->getLine() . ': ' . $e->getMessage() . '<br />' . $code, [$page['source'],'',$e->getFile(),'',$GLOBALS['spip_lang']]);
87
+        $page['texte'] = '<!-- Erreur -->';
88
+    }
89
+    ob_end_clean();
90 90
 
91
-	$page['process_ins'] = 'html';
91
+    $page['process_ins'] = 'html';
92 92
 
93
-	if (strpos($page['texte'], '?xml') !== false) {
94
-		$page['texte'] = str_replace("<\1?xml", '<' . '?xml', $page['texte']);
95
-	}
93
+    if (strpos($page['texte'], '?xml') !== false) {
94
+        $page['texte'] = str_replace("<\1?xml", '<' . '?xml', $page['texte']);
95
+    }
96 96
 }
97 97
 
98 98
 page_base_href($page['texte']);
Please login to merge, or discard this patch.
ecrire/public/balises.php 1 patch
Indentation   +951 added lines, -951 removed lines patch added patch discarded remove patch
@@ -26,7 +26,7 @@  discard block
 block discarded – undo
26 26
  **/
27 27
 
28 28
 if (!defined('_ECRIRE_INC_VERSION')) {
29
-	return;
29
+    return;
30 30
 }
31 31
 
32 32
 /**
@@ -48,16 +48,16 @@  discard block
 block discarded – undo
48 48
  *     Code PHP si cet argument est présent, sinon null
49 49
  **/
50 50
 function interprete_argument_balise($n, $p) {
51
-	if (($p->param) && (!$p->param[0][0]) && (count($p->param[0]) > $n)) {
52
-		return calculer_liste(
53
-			$p->param[0][$n],
54
-			$p->descr,
55
-			$p->boucles,
56
-			$p->id_boucle
57
-		);
58
-	} else {
59
-		return null;
60
-	}
51
+    if (($p->param) && (!$p->param[0][0]) && (count($p->param[0]) > $n)) {
52
+        return calculer_liste(
53
+            $p->param[0][$n],
54
+            $p->descr,
55
+            $p->boucles,
56
+            $p->id_boucle
57
+        );
58
+    } else {
59
+        return null;
60
+    }
61 61
 }
62 62
 
63 63
 
@@ -77,10 +77,10 @@  discard block
 block discarded – undo
77 77
  *     Pile complétée par le code à générer
78 78
  **/
79 79
 function balise_NOM_SITE_SPIP_dist($p) {
80
-	$p->code = "\$GLOBALS['meta']['nom_site']";
80
+    $p->code = "\$GLOBALS['meta']['nom_site']";
81 81
 
82
-	#$p->interdire_scripts = true;
83
-	return $p;
82
+    #$p->interdire_scripts = true;
83
+    return $p;
84 84
 }
85 85
 
86 86
 /**
@@ -96,10 +96,10 @@  discard block
 block discarded – undo
96 96
  *     Pile complétée par le code à générer
97 97
  **/
98 98
 function balise_EMAIL_WEBMASTER_dist($p) {
99
-	$p->code = "\$GLOBALS['meta']['email_webmaster']";
99
+    $p->code = "\$GLOBALS['meta']['email_webmaster']";
100 100
 
101
-	#$p->interdire_scripts = true;
102
-	return $p;
101
+    #$p->interdire_scripts = true;
102
+    return $p;
103 103
 }
104 104
 
105 105
 /**
@@ -115,10 +115,10 @@  discard block
 block discarded – undo
115 115
  *     Pile complétée par le code à générer
116 116
  **/
117 117
 function balise_DESCRIPTIF_SITE_SPIP_dist($p) {
118
-	$p->code = "\$GLOBALS['meta']['descriptif_site']";
118
+    $p->code = "\$GLOBALS['meta']['descriptif_site']";
119 119
 
120
-	#$p->interdire_scripts = true;
121
-	return $p;
120
+    #$p->interdire_scripts = true;
121
+    return $p;
122 122
 }
123 123
 
124 124
 
@@ -139,10 +139,10 @@  discard block
 block discarded – undo
139 139
  *     Pile complétée par le code à générer
140 140
  **/
141 141
 function balise_CHARSET_dist($p) {
142
-	$p->code = "\$GLOBALS['meta']['charset']";
142
+    $p->code = "\$GLOBALS['meta']['charset']";
143 143
 
144
-	#$p->interdire_scripts = true;
145
-	return $p;
144
+    #$p->interdire_scripts = true;
145
+    return $p;
146 146
 }
147 147
 
148 148
 /**
@@ -167,11 +167,11 @@  discard block
 block discarded – undo
167 167
  *     Pile complétée par le code à générer
168 168
  **/
169 169
 function balise_LANG_LEFT_dist($p) {
170
-	$_lang = champ_sql('lang', $p);
171
-	$p->code = "lang_dir($_lang, 'left','right')";
172
-	$p->interdire_scripts = false;
170
+    $_lang = champ_sql('lang', $p);
171
+    $p->code = "lang_dir($_lang, 'left','right')";
172
+    $p->interdire_scripts = false;
173 173
 
174
-	return $p;
174
+    return $p;
175 175
 }
176 176
 
177 177
 /**
@@ -191,11 +191,11 @@  discard block
 block discarded – undo
191 191
  *     Pile complétée par le code à générer
192 192
  **/
193 193
 function balise_LANG_RIGHT_dist($p) {
194
-	$_lang = champ_sql('lang', $p);
195
-	$p->code = "lang_dir($_lang, 'right','left')";
196
-	$p->interdire_scripts = false;
194
+    $_lang = champ_sql('lang', $p);
195
+    $p->code = "lang_dir($_lang, 'right','left')";
196
+    $p->interdire_scripts = false;
197 197
 
198
-	return $p;
198
+    return $p;
199 199
 }
200 200
 
201 201
 /**
@@ -220,11 +220,11 @@  discard block
 block discarded – undo
220 220
  *     Pile complétée par le code à générer
221 221
  **/
222 222
 function balise_LANG_DIR_dist($p) {
223
-	$_lang = champ_sql('lang', $p);
224
-	$p->code = "lang_dir($_lang, 'ltr','rtl')";
225
-	$p->interdire_scripts = false;
223
+    $_lang = champ_sql('lang', $p);
224
+    $p->code = "lang_dir($_lang, 'ltr','rtl')";
225
+    $p->interdire_scripts = false;
226 226
 
227
-	return $p;
227
+    return $p;
228 228
 }
229 229
 
230 230
 
@@ -241,10 +241,10 @@  discard block
 block discarded – undo
241 241
  *     Pile complétée par le code à générer
242 242
  **/
243 243
 function balise_PUCE_dist($p) {
244
-	$p->code = 'definir_puce()';
245
-	$p->interdire_scripts = false;
244
+    $p->code = 'definir_puce()';
245
+    $p->interdire_scripts = false;
246 246
 
247
-	return $p;
247
+    return $p;
248 248
 }
249 249
 
250 250
 
@@ -268,12 +268,12 @@  discard block
 block discarded – undo
268 268
  *     Pile completée du code PHP d'exécution de la balise
269 269
  */
270 270
 function balise_DATE_dist($p) {
271
-	$d = champ_sql('date', $p);
271
+    $d = champ_sql('date', $p);
272 272
 #	if ($d === "@\$Pile[0]['date']")
273 273
 #		$d = "isset(\$Pile[0]['date']) ? $d : time()";
274
-	$p->code = $d;
274
+    $p->code = $d;
275 275
 
276
-	return $p;
276
+    return $p;
277 277
 }
278 278
 
279 279
 
@@ -293,13 +293,13 @@  discard block
 block discarded – undo
293 293
  *     Pile completée du code PHP d'exécution de la balise
294 294
  */
295 295
 function balise_DATE_REDAC_dist($p) {
296
-	$d = champ_sql('date_redac', $p);
296
+    $d = champ_sql('date_redac', $p);
297 297
 #	if ($d === "@\$Pile[0]['date_redac']")
298 298
 #		$d = "isset(\$Pile[0]['date_redac']) ? $d : time()";
299
-	$p->code = $d;
300
-	$p->interdire_scripts = false;
299
+    $p->code = $d;
300
+    $p->interdire_scripts = false;
301 301
 
302
-	return $p;
302
+    return $p;
303 303
 }
304 304
 
305 305
 /**
@@ -318,10 +318,10 @@  discard block
 block discarded – undo
318 318
  *     Pile completée du code PHP d'exécution de la balise
319 319
  */
320 320
 function balise_DATE_MODIF_dist($p) {
321
-	$p->code = champ_sql('date_modif', $p);
322
-	$p->interdire_scripts = false;
321
+    $p->code = champ_sql('date_modif', $p);
322
+    $p->interdire_scripts = false;
323 323
 
324
-	return $p;
324
+    return $p;
325 325
 }
326 326
 
327 327
 /**
@@ -339,13 +339,13 @@  discard block
 block discarded – undo
339 339
  *     Pile completée du code PHP d'exécution de la balise
340 340
  */
341 341
 function balise_DATE_NOUVEAUTES_dist($p) {
342
-	$p->code = "((\$GLOBALS['meta']['quoi_de_neuf'] == 'oui'
342
+    $p->code = "((\$GLOBALS['meta']['quoi_de_neuf'] == 'oui'
343 343
 	AND isset(\$GLOBALS['meta']['dernier_envoi_neuf'])) ?
344 344
 	\$GLOBALS['meta']['dernier_envoi_neuf'] :
345 345
 	\"'0000-00-00'\")";
346
-	$p->interdire_scripts = false;
346
+    $p->interdire_scripts = false;
347 347
 
348
-	return $p;
348
+    return $p;
349 349
 }
350 350
 
351 351
 
@@ -363,11 +363,11 @@  discard block
 block discarded – undo
363 363
  *     Pile completée du code PHP d'exécution de la balise
364 364
  */
365 365
 function balise_DOSSIER_SQUELETTE_dist($p) {
366
-	$code = substr(addslashes(dirname($p->descr['sourcefile'])), strlen(_DIR_RACINE));
367
-	$p->code = "_DIR_RACINE . '$code'" .
368
-		$p->interdire_scripts = false;
366
+    $code = substr(addslashes(dirname($p->descr['sourcefile'])), strlen(_DIR_RACINE));
367
+    $p->code = "_DIR_RACINE . '$code'" .
368
+        $p->interdire_scripts = false;
369 369
 
370
-	return $p;
370
+    return $p;
371 371
 }
372 372
 
373 373
 /**
@@ -382,11 +382,11 @@  discard block
 block discarded – undo
382 382
  *     Pile completée du code PHP d'exécution de la balise
383 383
  */
384 384
 function balise_SQUELETTE_dist($p) {
385
-	$code = addslashes($p->descr['sourcefile']);
386
-	$p->code = "'$code'" .
387
-		$p->interdire_scripts = false;
385
+    $code = addslashes($p->descr['sourcefile']);
386
+    $p->code = "'$code'" .
387
+        $p->interdire_scripts = false;
388 388
 
389
-	return $p;
389
+    return $p;
390 390
 }
391 391
 
392 392
 /**
@@ -405,10 +405,10 @@  discard block
 block discarded – undo
405 405
  *     Pile completée du code PHP d'exécution de la balise
406 406
  */
407 407
 function balise_SPIP_VERSION_dist($p) {
408
-	$p->code = 'spip_version()';
409
-	$p->interdire_scripts = false;
408
+    $p->code = 'spip_version()';
409
+    $p->interdire_scripts = false;
410 410
 
411
-	return $p;
411
+    return $p;
412 412
 }
413 413
 
414 414
 
@@ -434,18 +434,18 @@  discard block
 block discarded – undo
434 434
  *     Pile complétée par le code à générer
435 435
  **/
436 436
 function balise_NOM_SITE_dist($p) {
437
-	if (!$p->etoile) {
438
-		$p->code = 'supprimer_numero(calculer_url(' .
439
-			champ_sql('url_site', $p) . ',' .
440
-			champ_sql('nom_site', $p) .
441
-			", 'titre', \$connect, false))";
442
-	} else {
443
-		$p->code = champ_sql('nom_site', $p);
444
-	}
437
+    if (!$p->etoile) {
438
+        $p->code = 'supprimer_numero(calculer_url(' .
439
+            champ_sql('url_site', $p) . ',' .
440
+            champ_sql('nom_site', $p) .
441
+            ", 'titre', \$connect, false))";
442
+    } else {
443
+        $p->code = champ_sql('nom_site', $p);
444
+    }
445 445
 
446
-	$p->interdire_scripts = true;
446
+    $p->interdire_scripts = true;
447 447
 
448
-	return $p;
448
+    return $p;
449 449
 }
450 450
 
451 451
 
@@ -462,11 +462,11 @@  discard block
 block discarded – undo
462 462
  *     Pile complétée par le code à générer
463 463
  **/
464 464
 function balise_NOTES_dist($p) {
465
-	// Recuperer les notes
466
-	$p->code = 'calculer_notes()';
465
+    // Recuperer les notes
466
+    $p->code = 'calculer_notes()';
467 467
 
468
-	#$p->interdire_scripts = true;
469
-	return $p;
468
+    #$p->interdire_scripts = true;
469
+    return $p;
470 470
 }
471 471
 
472 472
 
@@ -488,10 +488,10 @@  discard block
 block discarded – undo
488 488
  *     Pile complétée par le code à générer
489 489
  **/
490 490
 function balise_RECHERCHE_dist($p) {
491
-	$p->code = 'entites_html(_request("recherche"))';
492
-	$p->interdire_scripts = false;
491
+    $p->code = 'entites_html(_request("recherche"))';
492
+    $p->interdire_scripts = false;
493 493
 
494
-	return $p;
494
+    return $p;
495 495
 }
496 496
 
497 497
 
@@ -509,17 +509,17 @@  discard block
 block discarded – undo
509 509
  *     Pile complétée par le code à générer
510 510
  **/
511 511
 function balise_COMPTEUR_BOUCLE_dist($p) {
512
-	$b = index_boucle_mere($p);
513
-	if ($b === '') {
514
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
515
-		erreur_squelette($msg, $p);
516
-	} else {
517
-		$p->code = "\$Numrows['$b']['compteur_boucle']";
518
-		$p->boucles[$b]->cptrows = true;
519
-		$p->interdire_scripts = false;
512
+    $b = index_boucle_mere($p);
513
+    if ($b === '') {
514
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
515
+        erreur_squelette($msg, $p);
516
+    } else {
517
+        $p->code = "\$Numrows['$b']['compteur_boucle']";
518
+        $p->boucles[$b]->cptrows = true;
519
+        $p->interdire_scripts = false;
520 520
 
521
-		return $p;
522
-	}
521
+        return $p;
522
+    }
523 523
 }
524 524
 
525 525
 /**
@@ -537,17 +537,17 @@  discard block
 block discarded – undo
537 537
  *     Pile complétée par le code à générer
538 538
  **/
539 539
 function balise_TOTAL_BOUCLE_dist($p) {
540
-	$b = index_boucle_mere($p);
541
-	if ($b === '') {
542
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
543
-		erreur_squelette($msg, $p);
544
-	} else {
545
-		$p->code = "\$Numrows['$b']['total']";
546
-		$p->boucles[$b]->numrows = true;
547
-		$p->interdire_scripts = false;
548
-	}
540
+    $b = index_boucle_mere($p);
541
+    if ($b === '') {
542
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
543
+        erreur_squelette($msg, $p);
544
+    } else {
545
+        $p->code = "\$Numrows['$b']['total']";
546
+        $p->boucles[$b]->numrows = true;
547
+        $p->interdire_scripts = false;
548
+    }
549 549
 
550
-	return $p;
550
+    return $p;
551 551
 }
552 552
 
553 553
 
@@ -567,7 +567,7 @@  discard block
 block discarded – undo
567 567
  *     Pile complétée par le code à générer
568 568
  **/
569 569
 function balise_POINTS_dist($p) {
570
-	return rindex_pile($p, 'points', 'recherche');
570
+    return rindex_pile($p, 'points', 'recherche');
571 571
 }
572 572
 
573 573
 
@@ -588,12 +588,12 @@  discard block
 block discarded – undo
588 588
  *     Pile complétée par le code à générer
589 589
  **/
590 590
 function balise_POPULARITE_ABSOLUE_dist($p) {
591
-	$p->code = 'ceil(' .
592
-		champ_sql('popularite', $p) .
593
-		')';
594
-	$p->interdire_scripts = false;
591
+    $p->code = 'ceil(' .
592
+        champ_sql('popularite', $p) .
593
+        ')';
594
+    $p->interdire_scripts = false;
595 595
 
596
-	return $p;
596
+    return $p;
597 597
 }
598 598
 
599 599
 /**
@@ -613,10 +613,10 @@  discard block
 block discarded – undo
613 613
  *     Pile complétée par le code à générer
614 614
  **/
615 615
 function balise_POPULARITE_SITE_dist($p) {
616
-	$p->code = 'ceil($GLOBALS["meta"][\'popularite_total\'])';
617
-	$p->interdire_scripts = false;
616
+    $p->code = 'ceil($GLOBALS["meta"][\'popularite_total\'])';
617
+    $p->interdire_scripts = false;
618 618
 
619
-	return $p;
619
+    return $p;
620 620
 }
621 621
 
622 622
 /**
@@ -637,10 +637,10 @@  discard block
 block discarded – undo
637 637
  *     Pile complétée par le code à générer
638 638
  **/
639 639
 function balise_POPULARITE_MAX_dist($p) {
640
-	$p->code = 'ceil($GLOBALS["meta"][\'popularite_max\'])';
641
-	$p->interdire_scripts = false;
640
+    $p->code = 'ceil($GLOBALS["meta"][\'popularite_max\'])';
641
+    $p->interdire_scripts = false;
642 642
 
643
-	return $p;
643
+    return $p;
644 644
 }
645 645
 
646 646
 
@@ -666,15 +666,15 @@  discard block
 block discarded – undo
666 666
  *     Pile complétée par le code à générer
667 667
  **/
668 668
 function balise_VALEUR_dist($p) {
669
-	$b = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
670
-	$p->code = index_pile($p->id_boucle, 'valeur', $p->boucles, $b);
669
+    $b = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
670
+    $p->code = index_pile($p->id_boucle, 'valeur', $p->boucles, $b);
671 671
 ;
672
-	if (($v = interprete_argument_balise(1, $p)) !== null) {
673
-		$p->code = 'table_valeur(' . $p->code . ', ' . $v . ')';
674
-	}
675
-	$p->interdire_scripts = true;
672
+    if (($v = interprete_argument_balise(1, $p)) !== null) {
673
+        $p->code = 'table_valeur(' . $p->code . ', ' . $v . ')';
674
+    }
675
+    $p->interdire_scripts = true;
676 676
 
677
-	return $p;
677
+    return $p;
678 678
 }
679 679
 
680 680
 /**
@@ -703,16 +703,16 @@  discard block
 block discarded – undo
703 703
  *     Pile complétée par le code à générer
704 704
  **/
705 705
 function balise_EXPOSE_dist($p) {
706
-	$on = "'on'";
707
-	$off = "''";
708
-	if (($v = interprete_argument_balise(1, $p)) !== null) {
709
-		$on = $v;
710
-		if (($v = interprete_argument_balise(2, $p)) !== null) {
711
-			$off = $v;
712
-		}
713
-	}
706
+    $on = "'on'";
707
+    $off = "''";
708
+    if (($v = interprete_argument_balise(1, $p)) !== null) {
709
+        $on = $v;
710
+        if (($v = interprete_argument_balise(2, $p)) !== null) {
711
+            $off = $v;
712
+        }
713
+    }
714 714
 
715
-	return calculer_balise_expose($p, $on, $off);
715
+    return calculer_balise_expose($p, $on, $off);
716 716
 }
717 717
 
718 718
 /**
@@ -730,35 +730,35 @@  discard block
 block discarded – undo
730 730
  *     Pile complétée par le code à générer
731 731
  **/
732 732
 function calculer_balise_expose($p, $on, $off) {
733
-	$b = index_boucle($p);
734
-	if (empty($p->boucles[$b]->primary)) {
735
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
736
-		erreur_squelette($msg, $p);
737
-	} else {
738
-		$key = $p->boucles[$b]->primary;
739
-		$type = $p->boucles[$p->id_boucle]->primary;
740
-		$desc = $p->boucles[$b]->show;
741
-		$connect = sql_quote($p->boucles[$b]->sql_serveur);
733
+    $b = index_boucle($p);
734
+    if (empty($p->boucles[$b]->primary)) {
735
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
736
+        erreur_squelette($msg, $p);
737
+    } else {
738
+        $key = $p->boucles[$b]->primary;
739
+        $type = $p->boucles[$p->id_boucle]->primary;
740
+        $desc = $p->boucles[$b]->show;
741
+        $connect = sql_quote($p->boucles[$b]->sql_serveur);
742 742
 
743
-		// Ne pas utiliser champ_sql, on jongle avec le nom boucle explicite
744
-		$c = index_pile($p->id_boucle, $type, $p->boucles);
743
+        // Ne pas utiliser champ_sql, on jongle avec le nom boucle explicite
744
+        $c = index_pile($p->id_boucle, $type, $p->boucles);
745 745
 
746
-		if (isset($desc['field']['id_parent'])) {
747
-			$parent = 0; // pour if (!$parent) dans calculer_expose
748
-		} elseif (isset($desc['field']['id_rubrique'])) {
749
-			$parent = index_pile($p->id_boucle, 'id_rubrique', $p->boucles, $b);
750
-		} elseif (isset($desc['field']['id_groupe'])) {
751
-			$parent = index_pile($p->id_boucle, 'id_groupe', $p->boucles, $b);
752
-		} else {
753
-			$parent = "''";
754
-		}
746
+        if (isset($desc['field']['id_parent'])) {
747
+            $parent = 0; // pour if (!$parent) dans calculer_expose
748
+        } elseif (isset($desc['field']['id_rubrique'])) {
749
+            $parent = index_pile($p->id_boucle, 'id_rubrique', $p->boucles, $b);
750
+        } elseif (isset($desc['field']['id_groupe'])) {
751
+            $parent = index_pile($p->id_boucle, 'id_groupe', $p->boucles, $b);
752
+        } else {
753
+            $parent = "''";
754
+        }
755 755
 
756
-		$p->code = "(calcul_exposer($c, '$type', \$Pile[0], $parent, '$key', $connect) ? $on : $off)";
757
-	}
756
+        $p->code = "(calcul_exposer($c, '$type', \$Pile[0], $parent, '$key', $connect) ? $on : $off)";
757
+    }
758 758
 
759
-	$p->interdire_scripts = false;
759
+    $p->interdire_scripts = false;
760 760
 
761
-	return $p;
761
+    return $p;
762 762
 }
763 763
 
764 764
 
@@ -798,46 +798,46 @@  discard block
 block discarded – undo
798 798
  **/
799 799
 function balise_INTRODUCTION_dist($p) {
800 800
 
801
-	$type_objet = $p->type_requete;
802
-	$cle_objet = id_table_objet($type_objet);
803
-	$_id_objet = champ_sql($cle_objet, $p);
804
-
805
-	// Récupérer les valeurs sql nécessaires : descriptif, texte et chapo
806
-	// ainsi que le longueur d'introduction donnée dans la description de l'objet.
807
-	$_introduction_longueur = 'null';
808
-	$_ligne = 'array(';
809
-	$trouver_table = charger_fonction('trouver_table', 'base');
810
-	if ($desc = $trouver_table(table_objet_sql($type_objet))) {
811
-		if (isset($desc['field']['descriptif'])) {
812
-			$_ligne .= "'descriptif' => " . champ_sql('descriptif', $p) . ',';
813
-		}
814
-		if (isset($desc['field']['texte'])) {
815
-			$_ligne .= "'texte' => " . champ_sql('texte', $p) . ',';
816
-		}
817
-		if (isset($desc['field']['chapo'])) {
818
-			$_ligne .= "'chapo' => " . champ_sql('chapo', $p) . ',';
819
-		}
820
-		if (isset($desc['introduction_longueur'])) {
821
-			$_introduction_longueur = "'" . $desc['introduction_longueur'] . "'";
822
-		}
823
-	}
824
-	$_ligne .= ')';
825
-
826
-	// Récupérer la longueur et la suite passés en paramètres
827
-	$_longueur_ou_suite = 'null';
828
-	if (($v1 = interprete_argument_balise(1, $p)) !== null) {
829
-		$_longueur_ou_suite = $v1;
830
-	}
831
-	$_suite = 'null';
832
-	if (($v2 = interprete_argument_balise(2, $p)) !== null) {
833
-		$_suite = $v2;
834
-	}
835
-
836
-	$p->code = "generer_introduction_entite($_id_objet, '$type_objet', $_ligne, $_introduction_longueur, $_longueur_ou_suite, $_suite, \$connect)";
837
-
838
-	#$p->interdire_scripts = true;
839
-	$p->etoile = '*'; // propre est deja fait dans le calcul de l'intro
840
-	return $p;
801
+    $type_objet = $p->type_requete;
802
+    $cle_objet = id_table_objet($type_objet);
803
+    $_id_objet = champ_sql($cle_objet, $p);
804
+
805
+    // Récupérer les valeurs sql nécessaires : descriptif, texte et chapo
806
+    // ainsi que le longueur d'introduction donnée dans la description de l'objet.
807
+    $_introduction_longueur = 'null';
808
+    $_ligne = 'array(';
809
+    $trouver_table = charger_fonction('trouver_table', 'base');
810
+    if ($desc = $trouver_table(table_objet_sql($type_objet))) {
811
+        if (isset($desc['field']['descriptif'])) {
812
+            $_ligne .= "'descriptif' => " . champ_sql('descriptif', $p) . ',';
813
+        }
814
+        if (isset($desc['field']['texte'])) {
815
+            $_ligne .= "'texte' => " . champ_sql('texte', $p) . ',';
816
+        }
817
+        if (isset($desc['field']['chapo'])) {
818
+            $_ligne .= "'chapo' => " . champ_sql('chapo', $p) . ',';
819
+        }
820
+        if (isset($desc['introduction_longueur'])) {
821
+            $_introduction_longueur = "'" . $desc['introduction_longueur'] . "'";
822
+        }
823
+    }
824
+    $_ligne .= ')';
825
+
826
+    // Récupérer la longueur et la suite passés en paramètres
827
+    $_longueur_ou_suite = 'null';
828
+    if (($v1 = interprete_argument_balise(1, $p)) !== null) {
829
+        $_longueur_ou_suite = $v1;
830
+    }
831
+    $_suite = 'null';
832
+    if (($v2 = interprete_argument_balise(2, $p)) !== null) {
833
+        $_suite = $v2;
834
+    }
835
+
836
+    $p->code = "generer_introduction_entite($_id_objet, '$type_objet', $_ligne, $_introduction_longueur, $_longueur_ou_suite, $_suite, \$connect)";
837
+
838
+    #$p->interdire_scripts = true;
839
+    $p->etoile = '*'; // propre est deja fait dans le calcul de l'intro
840
+    return $p;
841 841
 }
842 842
 
843 843
 
@@ -857,15 +857,15 @@  discard block
 block discarded – undo
857 857
  *     Pile complétée par le code à générer
858 858
  **/
859 859
 function balise_LANG_dist($p) {
860
-	$_lang = champ_sql('lang', $p);
861
-	if (!$p->etoile) {
862
-		$p->code = "spip_htmlentities($_lang ? $_lang : \$GLOBALS['spip_lang'])";
863
-	} else {
864
-		$p->code = "spip_htmlentities($_lang)";
865
-	}
866
-	$p->interdire_scripts = false;
860
+    $_lang = champ_sql('lang', $p);
861
+    if (!$p->etoile) {
862
+        $p->code = "spip_htmlentities($_lang ? $_lang : \$GLOBALS['spip_lang'])";
863
+    } else {
864
+        $p->code = "spip_htmlentities($_lang)";
865
+    }
866
+    $p->interdire_scripts = false;
867 867
 
868
-	return $p;
868
+    return $p;
869 869
 }
870 870
 
871 871
 /**
@@ -887,48 +887,48 @@  discard block
 block discarded – undo
887 887
  *     Pile complétée par le code à générer
888 888
  */
889 889
 function balise_LESAUTEURS_dist($p) {
890
-	// Cherche le champ 'lesauteurs' dans la pile
891
-	$_lesauteurs = champ_sql('lesauteurs', $p, false);
892
-
893
-	// Si le champ n'existe pas (cas de spip_articles), on applique
894
-	// le modele lesauteurs.html en passant id_article dans le contexte;
895
-	// dans le cas contraire on prend le champ 'lesauteurs'
896
-	// (cf extension sites/)
897
-	if (
898
-		$_lesauteurs
899
-		and $_lesauteurs != '@$Pile[0][\'lesauteurs\']'
900
-	) {
901
-		$p->code = "safehtml($_lesauteurs)";
902
-		// $p->interdire_scripts = true;
903
-	} else {
904
-		if (!$p->id_boucle) {
905
-			$connect = '';
906
-			$objet = 'article';
907
-			$id_table_objet = 'id_article';
908
-		} else {
909
-			$b = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
910
-			$connect = $p->boucles[$b]->sql_serveur;
911
-			$type_boucle = $p->boucles[$b]->type_requete;
912
-			$objet = objet_type($type_boucle);
913
-			$id_table_objet = id_table_objet($type_boucle);
914
-		}
915
-		$c = memoriser_contexte_compil($p);
916
-
917
-		$p->code = sprintf(
918
-			CODE_RECUPERER_FOND,
919
-			"'modeles/lesauteurs'",
920
-			"array('objet'=>'" . $objet .
921
-			"','id_objet' => " . champ_sql($id_table_objet, $p) .
922
-			",'$id_table_objet' => " . champ_sql($id_table_objet, $p) .
923
-			($objet == 'article' ? '' : ",'id_article' => " . champ_sql('id_article', $p)) .
924
-			')',
925
-			"'trim'=>true, 'compil'=>array($c)",
926
-			_q($connect)
927
-		);
928
-		$p->interdire_scripts = false; // securite apposee par recuperer_fond()
929
-	}
930
-
931
-	return $p;
890
+    // Cherche le champ 'lesauteurs' dans la pile
891
+    $_lesauteurs = champ_sql('lesauteurs', $p, false);
892
+
893
+    // Si le champ n'existe pas (cas de spip_articles), on applique
894
+    // le modele lesauteurs.html en passant id_article dans le contexte;
895
+    // dans le cas contraire on prend le champ 'lesauteurs'
896
+    // (cf extension sites/)
897
+    if (
898
+        $_lesauteurs
899
+        and $_lesauteurs != '@$Pile[0][\'lesauteurs\']'
900
+    ) {
901
+        $p->code = "safehtml($_lesauteurs)";
902
+        // $p->interdire_scripts = true;
903
+    } else {
904
+        if (!$p->id_boucle) {
905
+            $connect = '';
906
+            $objet = 'article';
907
+            $id_table_objet = 'id_article';
908
+        } else {
909
+            $b = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
910
+            $connect = $p->boucles[$b]->sql_serveur;
911
+            $type_boucle = $p->boucles[$b]->type_requete;
912
+            $objet = objet_type($type_boucle);
913
+            $id_table_objet = id_table_objet($type_boucle);
914
+        }
915
+        $c = memoriser_contexte_compil($p);
916
+
917
+        $p->code = sprintf(
918
+            CODE_RECUPERER_FOND,
919
+            "'modeles/lesauteurs'",
920
+            "array('objet'=>'" . $objet .
921
+            "','id_objet' => " . champ_sql($id_table_objet, $p) .
922
+            ",'$id_table_objet' => " . champ_sql($id_table_objet, $p) .
923
+            ($objet == 'article' ? '' : ",'id_article' => " . champ_sql('id_article', $p)) .
924
+            ')',
925
+            "'trim'=>true, 'compil'=>array($c)",
926
+            _q($connect)
927
+        );
928
+        $p->interdire_scripts = false; // securite apposee par recuperer_fond()
929
+    }
930
+
931
+    return $p;
932 932
 }
933 933
 
934 934
 
@@ -955,76 +955,76 @@  discard block
 block discarded – undo
955 955
  *     Pile complétée par le code à générer
956 956
  */
957 957
 function balise_RANG_dist($p) {
958
-	$b = index_boucle($p);
959
-	if ($b === '') {
960
-		$msg = [
961
-			'zbug_champ_hors_boucle',
962
-			['champ' => '#RANG']
963
-		];
964
-		erreur_squelette($msg, $p);
965
-	} else {
966
-		// chercher d'abord un champ sql rang (mais pas dans le env : defaut '' si on trouve pas de champ sql)
967
-		// dans la boucle immediatement englobante uniquement
968
-		// sinon on compose le champ calcule
969
-		$_rang = champ_sql('rang', $p, '', false);
970
-
971
-		// si pas trouve de champ sql rang :
972
-		if (!$_rang or $_rang == "''") {
973
-			$boucle = &$p->boucles[$b];
974
-
975
-			// on gere le cas ou #RANG est une extraction du numero dans le titre
976
-			$trouver_table = charger_fonction('trouver_table', 'base');
977
-			$desc = $trouver_table($boucle->id_table);
978
-			$_titre = ''; # où extraire le numero ?
979
-
980
-			if (isset($desc['titre'])) {
981
-				$t = $desc['titre'];
982
-				if (
983
-					// Soit on trouve avec la déclaration de la lang AVANT
984
-					preg_match(';(?:lang\s*,)\s*(.*?titre)\s*(,|$);', $t, $m)
985
-					// Soit on prend depuis le début
986
-					or preg_match(';^(.*?titre)\s*(,|$);', $t, $m)
987
-				) {
988
-					$m = preg_replace(',as\s+titre$,i', '', $m[1]);
989
-					$m = trim($m);
990
-					if ($m != "''") {
991
-						if (!preg_match(',\W,', $m)) {
992
-							$m = $boucle->id_table . ".$m";
993
-						}
994
-
995
-						$m .= ' AS titre_rang';
996
-
997
-						$boucle->select[] = $m;
998
-						$_titre = '$Pile[$SP][\'titre_rang\']';
999
-					}
1000
-				}
1001
-			}
1002
-
1003
-			// si on n'a rien trouvé, on utilise le champ titre classique
1004
-			if (!$_titre) {
1005
-				$_titre = champ_sql('titre', $p);
1006
-			}
1007
-
1008
-			// et on recupere aussi les infos de liaison si on est en train d'editer les liens justement
1009
-			// cas des formulaires xxx_lies utilises par #FORMULAIRE_EDITER_LIENS
1010
-			$type_boucle = $boucle->type_requete;
1011
-			$objet = objet_type($type_boucle);
1012
-			$id_table_objet = id_table_objet($type_boucle);
1013
-			$_primary = champ_sql($id_table_objet, $p, '', false);
1014
-			$_env = '$Pile[0]';
1015
-
1016
-			if (!$_titre) {$_titre = "''";
1017
-			}
1018
-			if (!$_primary) {$_primary = "''";
1019
-			}
1020
-			$_rang = "calculer_rang_smart($_titre, '$objet', $_primary, $_env)";
1021
-		}
1022
-
1023
-		$p->code = $_rang;
1024
-		$p->interdire_scripts = false;
1025
-	}
1026
-
1027
-	return $p;
958
+    $b = index_boucle($p);
959
+    if ($b === '') {
960
+        $msg = [
961
+            'zbug_champ_hors_boucle',
962
+            ['champ' => '#RANG']
963
+        ];
964
+        erreur_squelette($msg, $p);
965
+    } else {
966
+        // chercher d'abord un champ sql rang (mais pas dans le env : defaut '' si on trouve pas de champ sql)
967
+        // dans la boucle immediatement englobante uniquement
968
+        // sinon on compose le champ calcule
969
+        $_rang = champ_sql('rang', $p, '', false);
970
+
971
+        // si pas trouve de champ sql rang :
972
+        if (!$_rang or $_rang == "''") {
973
+            $boucle = &$p->boucles[$b];
974
+
975
+            // on gere le cas ou #RANG est une extraction du numero dans le titre
976
+            $trouver_table = charger_fonction('trouver_table', 'base');
977
+            $desc = $trouver_table($boucle->id_table);
978
+            $_titre = ''; # où extraire le numero ?
979
+
980
+            if (isset($desc['titre'])) {
981
+                $t = $desc['titre'];
982
+                if (
983
+                    // Soit on trouve avec la déclaration de la lang AVANT
984
+                    preg_match(';(?:lang\s*,)\s*(.*?titre)\s*(,|$);', $t, $m)
985
+                    // Soit on prend depuis le début
986
+                    or preg_match(';^(.*?titre)\s*(,|$);', $t, $m)
987
+                ) {
988
+                    $m = preg_replace(',as\s+titre$,i', '', $m[1]);
989
+                    $m = trim($m);
990
+                    if ($m != "''") {
991
+                        if (!preg_match(',\W,', $m)) {
992
+                            $m = $boucle->id_table . ".$m";
993
+                        }
994
+
995
+                        $m .= ' AS titre_rang';
996
+
997
+                        $boucle->select[] = $m;
998
+                        $_titre = '$Pile[$SP][\'titre_rang\']';
999
+                    }
1000
+                }
1001
+            }
1002
+
1003
+            // si on n'a rien trouvé, on utilise le champ titre classique
1004
+            if (!$_titre) {
1005
+                $_titre = champ_sql('titre', $p);
1006
+            }
1007
+
1008
+            // et on recupere aussi les infos de liaison si on est en train d'editer les liens justement
1009
+            // cas des formulaires xxx_lies utilises par #FORMULAIRE_EDITER_LIENS
1010
+            $type_boucle = $boucle->type_requete;
1011
+            $objet = objet_type($type_boucle);
1012
+            $id_table_objet = id_table_objet($type_boucle);
1013
+            $_primary = champ_sql($id_table_objet, $p, '', false);
1014
+            $_env = '$Pile[0]';
1015
+
1016
+            if (!$_titre) {$_titre = "''";
1017
+            }
1018
+            if (!$_primary) {$_primary = "''";
1019
+            }
1020
+            $_rang = "calculer_rang_smart($_titre, '$objet', $_primary, $_env)";
1021
+        }
1022
+
1023
+        $p->code = $_rang;
1024
+        $p->interdire_scripts = false;
1025
+    }
1026
+
1027
+    return $p;
1028 1028
 }
1029 1029
 
1030 1030
 
@@ -1046,12 +1046,12 @@  discard block
 block discarded – undo
1046 1046
  *     Pile complétée par le code à générer
1047 1047
  **/
1048 1048
 function balise_POPULARITE_dist($p) {
1049
-	$_popularite = champ_sql('popularite', $p);
1050
-	$p->code = "(ceil(min(100, 100 * $_popularite
1049
+    $_popularite = champ_sql('popularite', $p);
1050
+    $p->code = "(ceil(min(100, 100 * $_popularite
1051 1051
 	/ max(1 , 0 + \$GLOBALS['meta']['popularite_max']))))";
1052
-	$p->interdire_scripts = false;
1052
+    $p->interdire_scripts = false;
1053 1053
 
1054
-	return $p;
1054
+    return $p;
1055 1055
 }
1056 1056
 
1057 1057
 /**
@@ -1062,8 +1062,8 @@  discard block
 block discarded – undo
1062 1062
  * l'absence peut-être due à une faute de frappe dans le contexte inclus.
1063 1063
  */
1064 1064
 define(
1065
-	'CODE_PAGINATION',
1066
-	'%s($Numrows["%s"]["grand_total"],
1065
+    'CODE_PAGINATION',
1066
+    '%s($Numrows["%s"]["grand_total"],
1067 1067
  		%s,
1068 1068
 		isset($Pile[0][%4$s])?$Pile[0][%4$s]:intval(_request(%4$s)),
1069 1069
 		%5$s, %6$s, %7$s, %8$s, array(%9$s))'
@@ -1100,75 +1100,75 @@  discard block
 block discarded – undo
1100 1100
  *     Pile complétée par le code à générer
1101 1101
  */
1102 1102
 function balise_PAGINATION_dist($p, $liste = 'true') {
1103
-	$b = index_boucle_mere($p);
1104
-
1105
-	// s'il n'y a pas de nom de boucle, on ne peut pas paginer
1106
-	if ($b === '') {
1107
-		$msg = [
1108
-			'zbug_champ_hors_boucle',
1109
-			['champ' => $liste ? 'PAGINATION' : 'ANCRE_PAGINATION']
1110
-		];
1111
-		erreur_squelette($msg, $p);
1112
-
1113
-		return $p;
1114
-	}
1115
-
1116
-	// s'il n'y a pas de mode_partie, c'est qu'on se trouve
1117
-	// dans un boucle recursive ou qu'on a oublie le critere {pagination}
1118
-	if (!$p->boucles[$b]->mode_partie) {
1119
-		if (!$p->boucles[$b]->table_optionnelle) {
1120
-			$msg = [
1121
-				'zbug_pagination_sans_critere',
1122
-				['champ' => '#PAGINATION']
1123
-			];
1124
-			erreur_squelette($msg, $p);
1125
-		}
1126
-
1127
-		return $p;
1128
-	}
1129
-
1130
-	// a priori true
1131
-	// si false, le compilo va bloquer sur des syntaxes avec un filtre sans argument qui suit la balise
1132
-	// si true, les arguments simples (sans truc=chose) vont degager
1133
-	$_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false, false);
1134
-	if (count($_contexte)) {
1135
-		$key = key($_contexte);
1136
-		if (is_numeric($key)) {
1137
-			array_shift($_contexte);
1138
-			$__modele = interprete_argument_balise(1, $p);
1139
-		}
1140
-	}
1141
-
1142
-	if (count($_contexte)) {
1143
-		$code_contexte = implode(',', $_contexte);
1144
-	} else {
1145
-		$code_contexte = '';
1146
-	}
1147
-
1148
-	$connect = $p->boucles[$b]->sql_serveur;
1149
-	$pas = $p->boucles[$b]->total_parties;
1150
-	$f_pagination = chercher_filtre('pagination');
1151
-	$type = $p->boucles[$b]->modificateur['debut_nom'];
1152
-	$modif = ($type[0] !== "'") ? "'debut'.$type"
1153
-		: ("'debut" . substr($type, 1));
1154
-
1155
-	$p->code = sprintf(
1156
-		CODE_PAGINATION,
1157
-		$f_pagination,
1158
-		$b,
1159
-		$type,
1160
-		$modif,
1161
-		$pas,
1162
-		$liste,
1163
-		((isset($__modele) and $__modele) ? $__modele : "''"),
1164
-		_q($connect),
1165
-		$code_contexte
1166
-	);
1167
-
1168
-	$p->boucles[$b]->numrows = true;
1169
-	$p->interdire_scripts = false;
1170
-
1171
-	return $p;
1103
+    $b = index_boucle_mere($p);
1104
+
1105
+    // s'il n'y a pas de nom de boucle, on ne peut pas paginer
1106
+    if ($b === '') {
1107
+        $msg = [
1108
+            'zbug_champ_hors_boucle',
1109
+            ['champ' => $liste ? 'PAGINATION' : 'ANCRE_PAGINATION']
1110
+        ];
1111
+        erreur_squelette($msg, $p);
1112
+
1113
+        return $p;
1114
+    }
1115
+
1116
+    // s'il n'y a pas de mode_partie, c'est qu'on se trouve
1117
+    // dans un boucle recursive ou qu'on a oublie le critere {pagination}
1118
+    if (!$p->boucles[$b]->mode_partie) {
1119
+        if (!$p->boucles[$b]->table_optionnelle) {
1120
+            $msg = [
1121
+                'zbug_pagination_sans_critere',
1122
+                ['champ' => '#PAGINATION']
1123
+            ];
1124
+            erreur_squelette($msg, $p);
1125
+        }
1126
+
1127
+        return $p;
1128
+    }
1129
+
1130
+    // a priori true
1131
+    // si false, le compilo va bloquer sur des syntaxes avec un filtre sans argument qui suit la balise
1132
+    // si true, les arguments simples (sans truc=chose) vont degager
1133
+    $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false, false);
1134
+    if (count($_contexte)) {
1135
+        $key = key($_contexte);
1136
+        if (is_numeric($key)) {
1137
+            array_shift($_contexte);
1138
+            $__modele = interprete_argument_balise(1, $p);
1139
+        }
1140
+    }
1141
+
1142
+    if (count($_contexte)) {
1143
+        $code_contexte = implode(',', $_contexte);
1144
+    } else {
1145
+        $code_contexte = '';
1146
+    }
1147
+
1148
+    $connect = $p->boucles[$b]->sql_serveur;
1149
+    $pas = $p->boucles[$b]->total_parties;
1150
+    $f_pagination = chercher_filtre('pagination');
1151
+    $type = $p->boucles[$b]->modificateur['debut_nom'];
1152
+    $modif = ($type[0] !== "'") ? "'debut'.$type"
1153
+        : ("'debut" . substr($type, 1));
1154
+
1155
+    $p->code = sprintf(
1156
+        CODE_PAGINATION,
1157
+        $f_pagination,
1158
+        $b,
1159
+        $type,
1160
+        $modif,
1161
+        $pas,
1162
+        $liste,
1163
+        ((isset($__modele) and $__modele) ? $__modele : "''"),
1164
+        _q($connect),
1165
+        $code_contexte
1166
+    );
1167
+
1168
+    $p->boucles[$b]->numrows = true;
1169
+    $p->interdire_scripts = false;
1170
+
1171
+    return $p;
1172 1172
 }
1173 1173
 
1174 1174
 
@@ -1195,11 +1195,11 @@  discard block
 block discarded – undo
1195 1195
  *     Pile complétée par le code à générer
1196 1196
  **/
1197 1197
 function balise_ANCRE_PAGINATION_dist($p) {
1198
-	if ($f = charger_fonction('PAGINATION', 'balise', true)) {
1199
-		return $f($p, $liste = 'false');
1200
-	} else {
1201
-		return null;
1202
-	} // ou une erreur ?
1198
+    if ($f = charger_fonction('PAGINATION', 'balise', true)) {
1199
+        return $f($p, $liste = 'false');
1200
+    } else {
1201
+        return null;
1202
+    } // ou une erreur ?
1203 1203
 }
1204 1204
 
1205 1205
 
@@ -1220,18 +1220,18 @@  discard block
 block discarded – undo
1220 1220
  *     Pile complétée par le code à générer
1221 1221
  **/
1222 1222
 function balise_GRAND_TOTAL_dist($p) {
1223
-	$b = index_boucle_mere($p);
1224
-	if ($b === '') {
1225
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
1226
-		erreur_squelette($msg, $p);
1227
-	} else {
1228
-		$p->code = "(isset(\$Numrows['$b']['grand_total'])
1223
+    $b = index_boucle_mere($p);
1224
+    if ($b === '') {
1225
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
1226
+        erreur_squelette($msg, $p);
1227
+    } else {
1228
+        $p->code = "(isset(\$Numrows['$b']['grand_total'])
1229 1229
 			? \$Numrows['$b']['grand_total'] : \$Numrows['$b']['total'])";
1230
-		$p->boucles[$b]->numrows = true;
1231
-		$p->interdire_scripts = false;
1232
-	}
1230
+        $p->boucles[$b]->numrows = true;
1231
+        $p->interdire_scripts = false;
1232
+    }
1233 1233
 
1234
-	return $p;
1234
+    return $p;
1235 1235
 }
1236 1236
 
1237 1237
 
@@ -1259,10 +1259,10 @@  discard block
 block discarded – undo
1259 1259
  *     Pile complétée par le code à générer
1260 1260
  **/
1261 1261
 function balise_SELF_dist($p) {
1262
-	$p->code = 'self()';
1263
-	$p->interdire_scripts = false;
1262
+    $p->code = 'self()';
1263
+    $p->interdire_scripts = false;
1264 1264
 
1265
-	return $p;
1265
+    return $p;
1266 1266
 }
1267 1267
 
1268 1268
 
@@ -1289,17 +1289,17 @@  discard block
 block discarded – undo
1289 1289
  *     Pile complétée par le code à générer
1290 1290
  **/
1291 1291
 function balise_CHEMIN_dist($p) {
1292
-	$arg = interprete_argument_balise(1, $p);
1293
-	if (!$arg) {
1294
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN']];
1295
-		erreur_squelette($msg, $p);
1296
-	} else {
1297
-		$p->code = 'find_in_path(' . $arg . ')';
1298
-	}
1292
+    $arg = interprete_argument_balise(1, $p);
1293
+    if (!$arg) {
1294
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN']];
1295
+        erreur_squelette($msg, $p);
1296
+    } else {
1297
+        $p->code = 'find_in_path(' . $arg . ')';
1298
+    }
1299 1299
 
1300
-	$p->interdire_scripts = false;
1300
+    $p->interdire_scripts = false;
1301 1301
 
1302
-	return $p;
1302
+    return $p;
1303 1303
 }
1304 1304
 
1305 1305
 /**
@@ -1324,16 +1324,16 @@  discard block
 block discarded – undo
1324 1324
  *     Pile complétée par le code à générer
1325 1325
  **/
1326 1326
 function balise_CHEMIN_IMAGE_dist($p) {
1327
-	$arg = interprete_argument_balise(1, $p);
1328
-	if (!$arg) {
1329
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN_IMAGE']];
1330
-		erreur_squelette($msg, $p);
1331
-	} else {
1332
-		$p->code = 'chemin_image(' . $arg . ')';
1333
-	}
1327
+    $arg = interprete_argument_balise(1, $p);
1328
+    if (!$arg) {
1329
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN_IMAGE']];
1330
+        erreur_squelette($msg, $p);
1331
+    } else {
1332
+        $p->code = 'chemin_image(' . $arg . ')';
1333
+    }
1334 1334
 
1335
-	$p->interdire_scripts = false;
1336
-	return $p;
1335
+    $p->interdire_scripts = false;
1336
+    return $p;
1337 1337
 }
1338 1338
 
1339 1339
 
@@ -1371,36 +1371,36 @@  discard block
 block discarded – undo
1371 1371
  **/
1372 1372
 function balise_ENV_dist($p, $src = null) {
1373 1373
 
1374
-	// cle du tableau desiree
1375
-	$_nom = interprete_argument_balise(1, $p);
1376
-	// valeur par defaut
1377
-	$_sinon = interprete_argument_balise(2, $p);
1374
+    // cle du tableau desiree
1375
+    $_nom = interprete_argument_balise(1, $p);
1376
+    // valeur par defaut
1377
+    $_sinon = interprete_argument_balise(2, $p);
1378 1378
 
1379
-	// $src est un tableau de donnees sources eventuellement transmis
1380
-	// en absence, on utilise l'environnement du squelette $Pile[0]
1379
+    // $src est un tableau de donnees sources eventuellement transmis
1380
+    // en absence, on utilise l'environnement du squelette $Pile[0]
1381 1381
 
1382
-	if (!$_nom) {
1383
-		// cas de #ENV sans argument : on retourne le serialize() du tableau
1384
-		// une belle fonction [(#ENV|affiche_env)] serait pratique
1385
-		if ($src) {
1386
-			$p->code = '(is_array($a = (' . $src . ')) ? serialize($a) : "")';
1387
-		} else {
1388
-			$p->code = 'serialize($Pile[0]??[])';
1389
-		}
1390
-	} else {
1391
-		if (!$src) {
1392
-			$src = '$Pile[0]??[]';
1393
-		}
1394
-		if ($_sinon) {
1395
-			$p->code = "sinon(table_valeur($src, (string)$_nom, null), $_sinon)";
1396
-		} else {
1397
-			$p->code = "table_valeur($src, (string)$_nom, null)";
1398
-		}
1399
-	}
1382
+    if (!$_nom) {
1383
+        // cas de #ENV sans argument : on retourne le serialize() du tableau
1384
+        // une belle fonction [(#ENV|affiche_env)] serait pratique
1385
+        if ($src) {
1386
+            $p->code = '(is_array($a = (' . $src . ')) ? serialize($a) : "")';
1387
+        } else {
1388
+            $p->code = 'serialize($Pile[0]??[])';
1389
+        }
1390
+    } else {
1391
+        if (!$src) {
1392
+            $src = '$Pile[0]??[]';
1393
+        }
1394
+        if ($_sinon) {
1395
+            $p->code = "sinon(table_valeur($src, (string)$_nom, null), $_sinon)";
1396
+        } else {
1397
+            $p->code = "table_valeur($src, (string)$_nom, null)";
1398
+        }
1399
+    }
1400 1400
 
1401
-	#$p->interdire_scripts = true;
1401
+    #$p->interdire_scripts = true;
1402 1402
 
1403
-	return $p;
1403
+    return $p;
1404 1404
 }
1405 1405
 
1406 1406
 /**
@@ -1430,16 +1430,16 @@  discard block
 block discarded – undo
1430 1430
  *     Pile completée du code PHP d'exécution de la balise
1431 1431
  */
1432 1432
 function balise_CONFIG_dist($p) {
1433
-	if (!$arg = interprete_argument_balise(1, $p)) {
1434
-		$arg = "''";
1435
-	}
1436
-	$_sinon = interprete_argument_balise(2, $p);
1437
-	$_unserialize = sinon(interprete_argument_balise(3, $p), 'false');
1433
+    if (!$arg = interprete_argument_balise(1, $p)) {
1434
+        $arg = "''";
1435
+    }
1436
+    $_sinon = interprete_argument_balise(2, $p);
1437
+    $_unserialize = sinon(interprete_argument_balise(3, $p), 'false');
1438 1438
 
1439
-	$p->code = '(include_spip(\'inc/config\')?lire_config(' . $arg . ',' .
1440
-		($_sinon && $_sinon != "''" ? $_sinon : 'null') . ',' . $_unserialize . "):'')";
1439
+    $p->code = '(include_spip(\'inc/config\')?lire_config(' . $arg . ',' .
1440
+        ($_sinon && $_sinon != "''" ? $_sinon : 'null') . ',' . $_unserialize . "):'')";
1441 1441
 
1442
-	return $p;
1442
+    return $p;
1443 1443
 }
1444 1444
 
1445 1445
 
@@ -1462,10 +1462,10 @@  discard block
 block discarded – undo
1462 1462
  *     Pile completée du code PHP d'exécution de la balise
1463 1463
  */
1464 1464
 function balise_CONNECT_dist($p) {
1465
-	$p->code = '($connect ? $connect : NULL)';
1466
-	$p->interdire_scripts = false;
1465
+    $p->code = '($connect ? $connect : NULL)';
1466
+    $p->interdire_scripts = false;
1467 1467
 
1468
-	return $p;
1468
+    return $p;
1469 1469
 }
1470 1470
 
1471 1471
 
@@ -1493,15 +1493,15 @@  discard block
 block discarded – undo
1493 1493
  *     Pile completée du code PHP d'exécution de la balise
1494 1494
  **/
1495 1495
 function balise_SESSION_dist($p) {
1496
-	$p->descr['session'] = true;
1496
+    $p->descr['session'] = true;
1497 1497
 
1498
-	$f = function_exists('balise_ENV')
1499
-		? 'balise_ENV'
1500
-		: 'balise_ENV_dist';
1498
+    $f = function_exists('balise_ENV')
1499
+        ? 'balise_ENV'
1500
+        : 'balise_ENV_dist';
1501 1501
 
1502
-	$p = $f($p, '$GLOBALS["visiteur_session"]??[]');
1502
+    $p = $f($p, '$GLOBALS["visiteur_session"]??[]');
1503 1503
 
1504
-	return $p;
1504
+    return $p;
1505 1505
 }
1506 1506
 
1507 1507
 
@@ -1524,18 +1524,18 @@  discard block
 block discarded – undo
1524 1524
  *     Pile completée du code PHP d'exécution de la balise
1525 1525
  **/
1526 1526
 function balise_SESSION_SET_dist($p) {
1527
-	$_nom = interprete_argument_balise(1, $p);
1528
-	$_val = interprete_argument_balise(2, $p);
1529
-	if (!$_nom or !$_val) {
1530
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SESSION_SET']];
1531
-		erreur_squelette($err_b_s_a, $p);
1532
-	} else {
1533
-		$p->code = '(include_spip("inc/session") AND session_set(' . $_nom . ',' . $_val . '))';
1534
-	}
1527
+    $_nom = interprete_argument_balise(1, $p);
1528
+    $_val = interprete_argument_balise(2, $p);
1529
+    if (!$_nom or !$_val) {
1530
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SESSION_SET']];
1531
+        erreur_squelette($err_b_s_a, $p);
1532
+    } else {
1533
+        $p->code = '(include_spip("inc/session") AND session_set(' . $_nom . ',' . $_val . '))';
1534
+    }
1535 1535
 
1536
-	$p->interdire_scripts = false;
1536
+    $p->interdire_scripts = false;
1537 1537
 
1538
-	return $p;
1538
+    return $p;
1539 1539
 }
1540 1540
 
1541 1541
 
@@ -1566,30 +1566,30 @@  discard block
 block discarded – undo
1566 1566
  *     Pile completée du code PHP d'exécution de la balise
1567 1567
  **/
1568 1568
 function balise_EVAL_dist($p) {
1569
-	$php = interprete_argument_balise(1, $p);
1570
-	if ($php) {
1571
-		# optimisation sur les #EVAL{une expression sans #BALISE}
1572
-		# attention au commentaire "// x signes" qui precede
1573
-		if (
1574
-			preg_match(
1575
-				",^([[:space:]]*//[^\n]*\n)'([^']+)'$,ms",
1576
-				$php,
1577
-				$r
1578
-			)
1579
-		) {
1580
-			$p->code = /* $r[1]. */
1581
-				'(' . $r[2] . ')';
1582
-		} else {
1583
-			$p->code = "eval('return '.$php.';')";
1584
-		}
1585
-	} else {
1586
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' EVAL']];
1587
-		erreur_squelette($msg, $p);
1588
-	}
1589
-
1590
-	#$p->interdire_scripts = true;
1591
-
1592
-	return $p;
1569
+    $php = interprete_argument_balise(1, $p);
1570
+    if ($php) {
1571
+        # optimisation sur les #EVAL{une expression sans #BALISE}
1572
+        # attention au commentaire "// x signes" qui precede
1573
+        if (
1574
+            preg_match(
1575
+                ",^([[:space:]]*//[^\n]*\n)'([^']+)'$,ms",
1576
+                $php,
1577
+                $r
1578
+            )
1579
+        ) {
1580
+            $p->code = /* $r[1]. */
1581
+                '(' . $r[2] . ')';
1582
+        } else {
1583
+            $p->code = "eval('return '.$php.';')";
1584
+        }
1585
+    } else {
1586
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' EVAL']];
1587
+        erreur_squelette($msg, $p);
1588
+    }
1589
+
1590
+    #$p->interdire_scripts = true;
1591
+
1592
+    return $p;
1593 1593
 }
1594 1594
 
1595 1595
 
@@ -1619,19 +1619,19 @@  discard block
 block discarded – undo
1619 1619
  **/
1620 1620
 function balise_CHAMP_SQL_dist($p) {
1621 1621
 
1622
-	if (
1623
-		$p->param
1624
-		and isset($p->param[0][1][0])
1625
-		and $champ = ($p->param[0][1][0]->texte)
1626
-	) {
1627
-		$p->code = champ_sql($champ, $p);
1628
-	} else {
1629
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => ' CHAMP_SQL']];
1630
-		erreur_squelette($err_b_s_a, $p);
1631
-	}
1622
+    if (
1623
+        $p->param
1624
+        and isset($p->param[0][1][0])
1625
+        and $champ = ($p->param[0][1][0]->texte)
1626
+    ) {
1627
+        $p->code = champ_sql($champ, $p);
1628
+    } else {
1629
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => ' CHAMP_SQL']];
1630
+        erreur_squelette($err_b_s_a, $p);
1631
+    }
1632 1632
 
1633
-	#$p->interdire_scripts = true;
1634
-	return $p;
1633
+    #$p->interdire_scripts = true;
1634
+    return $p;
1635 1635
 }
1636 1636
 
1637 1637
 /**
@@ -1657,13 +1657,13 @@  discard block
 block discarded – undo
1657 1657
  *     Pile complétée par le code à générer
1658 1658
  **/
1659 1659
 function balise_VAL_dist($p) {
1660
-	$p->code = interprete_argument_balise(1, $p);
1661
-	if (!strlen($p->code)) {
1662
-		$p->code = "''";
1663
-	}
1664
-	$p->interdire_scripts = false;
1660
+    $p->code = interprete_argument_balise(1, $p);
1661
+    if (!strlen($p->code)) {
1662
+        $p->code = "''";
1663
+    }
1664
+    $p->interdire_scripts = false;
1665 1665
 
1666
-	return $p;
1666
+    return $p;
1667 1667
 }
1668 1668
 
1669 1669
 /**
@@ -1692,10 +1692,10 @@  discard block
 block discarded – undo
1692 1692
  *     Pile complétée par le code à générer
1693 1693
  **/
1694 1694
 function balise_REM_dist($p) {
1695
-	$p->code = "''";
1696
-	$p->interdire_scripts = false;
1695
+    $p->code = "''";
1696
+    $p->interdire_scripts = false;
1697 1697
 
1698
-	return $p;
1698
+    return $p;
1699 1699
 }
1700 1700
 
1701 1701
 /**
@@ -1705,10 +1705,10 @@  discard block
 block discarded – undo
1705 1705
  * @return mixed
1706 1706
  */
1707 1707
 function balise_NULL_dist($p) {
1708
-	$p->code = 'null';
1709
-	$p->interdire_scripts = false;
1708
+    $p->code = 'null';
1709
+    $p->interdire_scripts = false;
1710 1710
 
1711
-	return $p;
1711
+    return $p;
1712 1712
 }
1713 1713
 
1714 1714
 
@@ -1732,18 +1732,18 @@  discard block
 block discarded – undo
1732 1732
  **/
1733 1733
 function balise_HTTP_HEADER_dist($p) {
1734 1734
 
1735
-	$header = interprete_argument_balise(1, $p);
1736
-	if (!$header) {
1737
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'HTTP_HEADER']];
1738
-		erreur_squelette($err_b_s_a, $p);
1739
-	} else {
1740
-		$p->code = "'<'.'?php header(' . _q("
1741
-			. $header
1742
-			. ") . '); ?'.'>'";
1743
-	}
1744
-	$p->interdire_scripts = false;
1735
+    $header = interprete_argument_balise(1, $p);
1736
+    if (!$header) {
1737
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'HTTP_HEADER']];
1738
+        erreur_squelette($err_b_s_a, $p);
1739
+    } else {
1740
+        $p->code = "'<'.'?php header(' . _q("
1741
+            . $header
1742
+            . ") . '); ?'.'>'";
1743
+    }
1744
+    $p->interdire_scripts = false;
1745 1745
 
1746
-	return $p;
1746
+    return $p;
1747 1747
 }
1748 1748
 
1749 1749
 
@@ -1768,20 +1768,20 @@  discard block
 block discarded – undo
1768 1768
  *     Pile complétée par le code à générer
1769 1769
  **/
1770 1770
 function balise_FILTRE_dist($p) {
1771
-	if ($p->param) {
1772
-		$args = [];
1773
-		foreach ($p->param as $i => $ignore) {
1774
-			$args[] = interprete_argument_balise($i + 1, $p);
1775
-		}
1776
-		$p->code = "'<' . '"
1777
-			. '?php header("X-Spip-Filtre: \'.'
1778
-			. join('.\'|\'.', $args)
1779
-			. " . '\"); ?'.'>'";
1771
+    if ($p->param) {
1772
+        $args = [];
1773
+        foreach ($p->param as $i => $ignore) {
1774
+            $args[] = interprete_argument_balise($i + 1, $p);
1775
+        }
1776
+        $p->code = "'<' . '"
1777
+            . '?php header("X-Spip-Filtre: \'.'
1778
+            . join('.\'|\'.', $args)
1779
+            . " . '\"); ?'.'>'";
1780 1780
 
1781
-		$p->interdire_scripts = false;
1781
+        $p->interdire_scripts = false;
1782 1782
 
1783
-		return $p;
1784
-	}
1783
+        return $p;
1784
+    }
1785 1785
 }
1786 1786
 
1787 1787
 
@@ -1817,55 +1817,55 @@  discard block
 block discarded – undo
1817 1817
  **/
1818 1818
 function balise_CACHE_dist($p) {
1819 1819
 
1820
-	if ($p->param) {
1821
-		$duree = valeur_numerique($p->param[0][1][0]->texte);
1822
-
1823
-		// noter la duree du cache dans un entete proprietaire
1824
-
1825
-		$code = "'<'.'" . '?php header("X-Spip-Cache: '
1826
-			. $duree
1827
-			. '"); ?' . "'.'>'";
1828
-
1829
-		// Remplir le header Cache-Control
1830
-		// cas #CACHE{0}
1831
-		if ($duree == 0) {
1832
-			$code .= ".'<'.'"
1833
-				. '?php header("Cache-Control: no-cache, must-revalidate"); ?'
1834
-				. "'.'><'.'"
1835
-				. '?php header("Pragma: no-cache"); ?'
1836
-				. "'.'>'";
1837
-		}
1838
-
1839
-		// recuperer les parametres suivants
1840
-		$i = 1;
1841
-		while (isset($p->param[0][++$i])) {
1842
-			$pa = ($p->param[0][$i][0]->texte);
1843
-
1844
-			if (
1845
-				$pa == 'cache-client'
1846
-				and $duree > 0
1847
-			) {
1848
-				$code .= ".'<'.'" . '?php header("Cache-Control: max-age='
1849
-					. $duree
1850
-					. '"); ?' . "'.'>'";
1851
-				// il semble logique, si on cache-client, de ne pas invalider
1852
-				$pa = 'statique';
1853
-			}
1854
-
1855
-			if (
1856
-				$pa == 'statique'
1857
-				and $duree > 0
1858
-			) {
1859
-				$code .= ".'<'.'" . '?php header("X-Spip-Statique: oui"); ?' . "'.'>'";
1860
-			}
1861
-		}
1862
-	} else {
1863
-		$code = "''";
1864
-	}
1865
-	$p->code = $code;
1866
-	$p->interdire_scripts = false;
1867
-
1868
-	return $p;
1820
+    if ($p->param) {
1821
+        $duree = valeur_numerique($p->param[0][1][0]->texte);
1822
+
1823
+        // noter la duree du cache dans un entete proprietaire
1824
+
1825
+        $code = "'<'.'" . '?php header("X-Spip-Cache: '
1826
+            . $duree
1827
+            . '"); ?' . "'.'>'";
1828
+
1829
+        // Remplir le header Cache-Control
1830
+        // cas #CACHE{0}
1831
+        if ($duree == 0) {
1832
+            $code .= ".'<'.'"
1833
+                . '?php header("Cache-Control: no-cache, must-revalidate"); ?'
1834
+                . "'.'><'.'"
1835
+                . '?php header("Pragma: no-cache"); ?'
1836
+                . "'.'>'";
1837
+        }
1838
+
1839
+        // recuperer les parametres suivants
1840
+        $i = 1;
1841
+        while (isset($p->param[0][++$i])) {
1842
+            $pa = ($p->param[0][$i][0]->texte);
1843
+
1844
+            if (
1845
+                $pa == 'cache-client'
1846
+                and $duree > 0
1847
+            ) {
1848
+                $code .= ".'<'.'" . '?php header("Cache-Control: max-age='
1849
+                    . $duree
1850
+                    . '"); ?' . "'.'>'";
1851
+                // il semble logique, si on cache-client, de ne pas invalider
1852
+                $pa = 'statique';
1853
+            }
1854
+
1855
+            if (
1856
+                $pa == 'statique'
1857
+                and $duree > 0
1858
+            ) {
1859
+                $code .= ".'<'.'" . '?php header("X-Spip-Statique: oui"); ?' . "'.'>'";
1860
+            }
1861
+        }
1862
+    } else {
1863
+        $code = "''";
1864
+    }
1865
+    $p->code = $code;
1866
+    $p->interdire_scripts = false;
1867
+
1868
+    return $p;
1869 1869
 }
1870 1870
 
1871 1871
 
@@ -1897,13 +1897,13 @@  discard block
 block discarded – undo
1897 1897
  *     Pile complétée par le code à générer
1898 1898
  */
1899 1899
 function balise_INSERT_HEAD_dist($p) {
1900
-	$p->code = "'<'.'"
1901
-		. '?php header("X-Spip-Filtre: insert_head_css_conditionnel"); ?'
1902
-		. "'.'>'";
1903
-	$p->code .= ". pipeline('insert_head','<!-- insert_head -->')";
1904
-	$p->interdire_scripts = false;
1900
+    $p->code = "'<'.'"
1901
+        . '?php header("X-Spip-Filtre: insert_head_css_conditionnel"); ?'
1902
+        . "'.'>'";
1903
+    $p->code .= ". pipeline('insert_head','<!-- insert_head -->')";
1904
+    $p->interdire_scripts = false;
1905 1905
 
1906
-	return $p;
1906
+    return $p;
1907 1907
 }
1908 1908
 
1909 1909
 /**
@@ -1921,10 +1921,10 @@  discard block
 block discarded – undo
1921 1921
  *     Pile complétée par le code à générer
1922 1922
  */
1923 1923
 function balise_INSERT_HEAD_CSS_dist($p) {
1924
-	$p->code = "pipeline('insert_head_css','<!-- insert_head_css -->')";
1925
-	$p->interdire_scripts = false;
1924
+    $p->code = "pipeline('insert_head_css','<!-- insert_head_css -->')";
1925
+    $p->interdire_scripts = false;
1926 1926
 
1927
-	return $p;
1927
+    return $p;
1928 1928
 }
1929 1929
 
1930 1930
 /**
@@ -1939,11 +1939,11 @@  discard block
 block discarded – undo
1939 1939
  *     Pile complétée par le code à générer
1940 1940
  **/
1941 1941
 function balise_INCLUDE_dist($p) {
1942
-	if (function_exists('balise_INCLURE')) {
1943
-		return balise_INCLURE($p);
1944
-	} else {
1945
-		return balise_INCLURE_dist($p);
1946
-	}
1942
+    if (function_exists('balise_INCLURE')) {
1943
+        return balise_INCLURE($p);
1944
+    } else {
1945
+        return balise_INCLURE_dist($p);
1946
+    }
1947 1947
 }
1948 1948
 
1949 1949
 /**
@@ -1977,66 +1977,66 @@  discard block
 block discarded – undo
1977 1977
  *     Pile complétée par le code à générer
1978 1978
  **/
1979 1979
 function balise_INCLURE_dist($p) {
1980
-	$id_boucle = $p->id_boucle;
1981
-	// la lang n'est pas passe de facon automatique par argumenter
1982
-	// mais le sera pas recuperer_fond, sauf si etoile=>true est passe
1983
-	// en option
1984
-
1985
-	$_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $id_boucle, false, false);
1986
-
1987
-	// erreur de syntaxe = fond absent
1988
-	// (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
1989
-	if (!$_contexte) {
1990
-		$contexte = [];
1991
-	}
1992
-
1993
-	if (isset($_contexte['fond'])) {
1994
-		$f = $_contexte['fond'];
1995
-		// toujours vrai :
1996
-		if (preg_match('/^.fond.\s*=>(.*)$/s', $f, $r)) {
1997
-			$f = $r[1];
1998
-			unset($_contexte['fond']);
1999
-		} else {
2000
-			spip_log('compilation de #INCLURE a revoir');
2001
-		}
2002
-
2003
-		// #INCLURE{doublons}
2004
-		if (isset($_contexte['doublons'])) {
2005
-			$_contexte['doublons'] = "'doublons' => \$doublons";
2006
-		}
2007
-
2008
-		// Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
2009
-		$flag_env = false;
2010
-		if (isset($_contexte['env']) or isset($_contexte['self'])) {
2011
-			$flag_env = true;
2012
-			unset($_contexte['env']);
2013
-		}
2014
-
2015
-		$_options = [];
2016
-		if (isset($_contexte['ajax'])) {
2017
-			$_options[] = preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2018
-			unset($_contexte['ajax']);
2019
-		}
2020
-		if ($p->etoile) {
2021
-			$_options[] = "'etoile'=>true";
2022
-		}
2023
-		$_options[] = "'compil'=>array(" . memoriser_contexte_compil($p) . ')';
2024
-
2025
-		$_l = 'array(' . join(",\n\t", $_contexte) . ')';
2026
-		if ($flag_env) {
2027
-			$_l = "array_merge(\$Pile[0],$_l)";
2028
-		}
2029
-
2030
-		$p->code = sprintf(CODE_RECUPERER_FOND, $f, $_l, join(',', $_options), "_request('connect')");
2031
-	} elseif (!isset($_contexte[1])) {
2032
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' INCLURE']];
2033
-		erreur_squelette($msg, $p);
2034
-	} else {
2035
-		$p->code = 'charge_scripts(' . $_contexte[1] . ',false)';
2036
-	}
2037
-
2038
-	$p->interdire_scripts = false; // la securite est assuree par recuperer_fond
2039
-	return $p;
1980
+    $id_boucle = $p->id_boucle;
1981
+    // la lang n'est pas passe de facon automatique par argumenter
1982
+    // mais le sera pas recuperer_fond, sauf si etoile=>true est passe
1983
+    // en option
1984
+
1985
+    $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $id_boucle, false, false);
1986
+
1987
+    // erreur de syntaxe = fond absent
1988
+    // (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
1989
+    if (!$_contexte) {
1990
+        $contexte = [];
1991
+    }
1992
+
1993
+    if (isset($_contexte['fond'])) {
1994
+        $f = $_contexte['fond'];
1995
+        // toujours vrai :
1996
+        if (preg_match('/^.fond.\s*=>(.*)$/s', $f, $r)) {
1997
+            $f = $r[1];
1998
+            unset($_contexte['fond']);
1999
+        } else {
2000
+            spip_log('compilation de #INCLURE a revoir');
2001
+        }
2002
+
2003
+        // #INCLURE{doublons}
2004
+        if (isset($_contexte['doublons'])) {
2005
+            $_contexte['doublons'] = "'doublons' => \$doublons";
2006
+        }
2007
+
2008
+        // Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
2009
+        $flag_env = false;
2010
+        if (isset($_contexte['env']) or isset($_contexte['self'])) {
2011
+            $flag_env = true;
2012
+            unset($_contexte['env']);
2013
+        }
2014
+
2015
+        $_options = [];
2016
+        if (isset($_contexte['ajax'])) {
2017
+            $_options[] = preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2018
+            unset($_contexte['ajax']);
2019
+        }
2020
+        if ($p->etoile) {
2021
+            $_options[] = "'etoile'=>true";
2022
+        }
2023
+        $_options[] = "'compil'=>array(" . memoriser_contexte_compil($p) . ')';
2024
+
2025
+        $_l = 'array(' . join(",\n\t", $_contexte) . ')';
2026
+        if ($flag_env) {
2027
+            $_l = "array_merge(\$Pile[0],$_l)";
2028
+        }
2029
+
2030
+        $p->code = sprintf(CODE_RECUPERER_FOND, $f, $_l, join(',', $_options), "_request('connect')");
2031
+    } elseif (!isset($_contexte[1])) {
2032
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' INCLURE']];
2033
+        erreur_squelette($msg, $p);
2034
+    } else {
2035
+        $p->code = 'charge_scripts(' . $_contexte[1] . ',false)';
2036
+    }
2037
+
2038
+    $p->interdire_scripts = false; // la securite est assuree par recuperer_fond
2039
+    return $p;
2040 2040
 }
2041 2041
 
2042 2042
 
@@ -2064,69 +2064,69 @@  discard block
 block discarded – undo
2064 2064
  **/
2065 2065
 function balise_MODELE_dist($p) {
2066 2066
 
2067
-	$_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false);
2068
-
2069
-	// erreur de syntaxe = fond absent
2070
-	// (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
2071
-	if (!$_contexte) {
2072
-		$_contexte = [];
2073
-	}
2074
-
2075
-	if (!isset($_contexte[1])) {
2076
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' MODELE']];
2077
-		erreur_squelette($msg, $p);
2078
-	} else {
2079
-		$nom = $_contexte[1];
2080
-		unset($_contexte[1]);
2081
-
2082
-		if (preg_match("/^\s*'[^']*'/s", $nom)) {
2083
-			$nom = "'modeles/" . substr($nom, 1);
2084
-		} else {
2085
-			$nom = "'modeles/' . $nom";
2086
-		}
2087
-
2088
-		$flag_env = false;
2089
-		if (isset($_contexte['env'])) {
2090
-			$flag_env = true;
2091
-			unset($_contexte['env']);
2092
-		}
2093
-
2094
-		// Incoherence dans la syntaxe du contexte. A revoir.
2095
-		// Reserver la cle primaire de la boucle courante si elle existe
2096
-		if (isset($p->boucles[$p->id_boucle]->primary)) {
2097
-			$primary = $p->boucles[$p->id_boucle]->primary;
2098
-			if (!strpos($primary, ',')) {
2099
-				$id = champ_sql($primary, $p);
2100
-				$_contexte[] = "'$primary'=>" . $id;
2101
-				$_contexte[] = "'id'=>" . $id;
2102
-			}
2103
-		}
2104
-		$_contexte[] = "'recurs'=>(++\$recurs)";
2105
-		$connect = '';
2106
-		if (isset($p->boucles[$p->id_boucle])) {
2107
-			$connect = $p->boucles[$p->id_boucle]->sql_serveur;
2108
-		}
2109
-
2110
-		$_options = memoriser_contexte_compil($p);
2111
-		$_options = "'compil'=>array($_options), 'trim'=>true";
2112
-		if (isset($_contexte['ajax'])) {
2113
-			$_options .= ', ' . preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2114
-			unset($_contexte['ajax']);
2115
-		}
2116
-
2117
-		$_l = 'array(' . join(",\n\t", $_contexte) . ')';
2118
-		if ($flag_env) {
2119
-			$_l = "array_merge(\$Pile[0],$_l)";
2120
-		}
2121
-
2122
-		$page = sprintf(CODE_RECUPERER_FOND, $nom, $_l, $_options, _q($connect));
2123
-
2124
-		$p->code = "\n\t(((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))>=5)? '' :\n\t$page)\n";
2125
-
2126
-		$p->interdire_scripts = false; // securite assuree par le squelette
2127
-	}
2128
-
2129
-	return $p;
2067
+    $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false);
2068
+
2069
+    // erreur de syntaxe = fond absent
2070
+    // (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
2071
+    if (!$_contexte) {
2072
+        $_contexte = [];
2073
+    }
2074
+
2075
+    if (!isset($_contexte[1])) {
2076
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' MODELE']];
2077
+        erreur_squelette($msg, $p);
2078
+    } else {
2079
+        $nom = $_contexte[1];
2080
+        unset($_contexte[1]);
2081
+
2082
+        if (preg_match("/^\s*'[^']*'/s", $nom)) {
2083
+            $nom = "'modeles/" . substr($nom, 1);
2084
+        } else {
2085
+            $nom = "'modeles/' . $nom";
2086
+        }
2087
+
2088
+        $flag_env = false;
2089
+        if (isset($_contexte['env'])) {
2090
+            $flag_env = true;
2091
+            unset($_contexte['env']);
2092
+        }
2093
+
2094
+        // Incoherence dans la syntaxe du contexte. A revoir.
2095
+        // Reserver la cle primaire de la boucle courante si elle existe
2096
+        if (isset($p->boucles[$p->id_boucle]->primary)) {
2097
+            $primary = $p->boucles[$p->id_boucle]->primary;
2098
+            if (!strpos($primary, ',')) {
2099
+                $id = champ_sql($primary, $p);
2100
+                $_contexte[] = "'$primary'=>" . $id;
2101
+                $_contexte[] = "'id'=>" . $id;
2102
+            }
2103
+        }
2104
+        $_contexte[] = "'recurs'=>(++\$recurs)";
2105
+        $connect = '';
2106
+        if (isset($p->boucles[$p->id_boucle])) {
2107
+            $connect = $p->boucles[$p->id_boucle]->sql_serveur;
2108
+        }
2109
+
2110
+        $_options = memoriser_contexte_compil($p);
2111
+        $_options = "'compil'=>array($_options), 'trim'=>true";
2112
+        if (isset($_contexte['ajax'])) {
2113
+            $_options .= ', ' . preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2114
+            unset($_contexte['ajax']);
2115
+        }
2116
+
2117
+        $_l = 'array(' . join(",\n\t", $_contexte) . ')';
2118
+        if ($flag_env) {
2119
+            $_l = "array_merge(\$Pile[0],$_l)";
2120
+        }
2121
+
2122
+        $page = sprintf(CODE_RECUPERER_FOND, $nom, $_l, $_options, _q($connect));
2123
+
2124
+        $p->code = "\n\t(((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))>=5)? '' :\n\t$page)\n";
2125
+
2126
+        $p->interdire_scripts = false; // securite assuree par le squelette
2127
+    }
2128
+
2129
+    return $p;
2130 2130
 }
2131 2131
 
2132 2132
 
@@ -2150,21 +2150,21 @@  discard block
 block discarded – undo
2150 2150
  *     Pile complétée par le code à générer
2151 2151
  **/
2152 2152
 function balise_SET_dist($p) {
2153
-	$_nom = interprete_argument_balise(1, $p);
2154
-	$_val = interprete_argument_balise(2, $p);
2153
+    $_nom = interprete_argument_balise(1, $p);
2154
+    $_val = interprete_argument_balise(2, $p);
2155 2155
 
2156
-	if (!$_nom or !$_val) {
2157
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SET']];
2158
-		erreur_squelette($err_b_s_a, $p);
2159
-	}
2160
-	// affectation $_zzz inutile, mais permet de contourner un bug OpCode cache sous PHP 5.5.4
2161
-	// cf https://bugs.php.net/bug.php?id=65845
2162
-	else {
2163
-		$p->code = "vide(\$Pile['vars'][\$_zzz=(string)$_nom] = $_val)";
2164
-	}
2156
+    if (!$_nom or !$_val) {
2157
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SET']];
2158
+        erreur_squelette($err_b_s_a, $p);
2159
+    }
2160
+    // affectation $_zzz inutile, mais permet de contourner un bug OpCode cache sous PHP 5.5.4
2161
+    // cf https://bugs.php.net/bug.php?id=65845
2162
+    else {
2163
+        $p->code = "vide(\$Pile['vars'][\$_zzz=(string)$_nom] = $_val)";
2164
+    }
2165 2165
 
2166
-	$p->interdire_scripts = false; // la balise ne renvoie rien
2167
-	return $p;
2166
+    $p->interdire_scripts = false; // la balise ne renvoie rien
2167
+    return $p;
2168 2168
 }
2169 2169
 
2170 2170
 
@@ -2194,12 +2194,12 @@  discard block
 block discarded – undo
2194 2194
  *     Pile complétée par le code à générer
2195 2195
  **/
2196 2196
 function balise_GET_dist($p) {
2197
-	$p->interdire_scripts = false; // le contenu vient de #SET, donc il est de confiance
2198
-	if (function_exists('balise_ENV')) {
2199
-		return balise_ENV($p, '$Pile["vars"]??[]');
2200
-	} else {
2201
-		return balise_ENV_dist($p, '$Pile["vars"]??[]');
2202
-	}
2197
+    $p->interdire_scripts = false; // le contenu vient de #SET, donc il est de confiance
2198
+    if (function_exists('balise_ENV')) {
2199
+        return balise_ENV($p, '$Pile["vars"]??[]');
2200
+    } else {
2201
+        return balise_ENV_dist($p, '$Pile["vars"]??[]');
2202
+    }
2203 2203
 }
2204 2204
 
2205 2205
 
@@ -2222,22 +2222,22 @@  discard block
 block discarded – undo
2222 2222
  *     Pile complétée par le code à générer
2223 2223
  **/
2224 2224
 function balise_DOUBLONS_dist($p) {
2225
-	if ($type = interprete_argument_balise(1, $p)) {
2226
-		if ($famille = interprete_argument_balise(2, $p)) {
2227
-			$type .= '.' . $famille;
2228
-		}
2229
-		$p->code = '(isset($doublons[' . $type . ']) ? $doublons[' . $type . '] : "")';
2230
-		if (!$p->etoile) {
2231
-			$p->code = 'array_filter(array_map("intval",explode(",",'
2232
-				. $p->code . ')))';
2233
-		}
2234
-	} else {
2235
-		$p->code = '$doublons';
2236
-	}
2225
+    if ($type = interprete_argument_balise(1, $p)) {
2226
+        if ($famille = interprete_argument_balise(2, $p)) {
2227
+            $type .= '.' . $famille;
2228
+        }
2229
+        $p->code = '(isset($doublons[' . $type . ']) ? $doublons[' . $type . '] : "")';
2230
+        if (!$p->etoile) {
2231
+            $p->code = 'array_filter(array_map("intval",explode(",",'
2232
+                . $p->code . ')))';
2233
+        }
2234
+    } else {
2235
+        $p->code = '$doublons';
2236
+    }
2237 2237
 
2238
-	$p->interdire_scripts = false;
2238
+    $p->interdire_scripts = false;
2239 2239
 
2240
-	return $p;
2240
+    return $p;
2241 2241
 }
2242 2242
 
2243 2243
 
@@ -2260,18 +2260,18 @@  discard block
 block discarded – undo
2260 2260
  *     Pile complétée par le code à générer
2261 2261
  **/
2262 2262
 function balise_PIPELINE_dist($p) {
2263
-	$_pipe = interprete_argument_balise(1, $p);
2264
-	if (!$_pipe) {
2265
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'PIPELINE']];
2266
-		erreur_squelette($err_b_s_a, $p);
2267
-	} else {
2268
-		$_flux = interprete_argument_balise(2, $p);
2269
-		$_flux = $_flux ? $_flux : "''";
2270
-		$p->code = "pipeline( $_pipe , $_flux )";
2271
-		$p->interdire_scripts = false;
2272
-	}
2263
+    $_pipe = interprete_argument_balise(1, $p);
2264
+    if (!$_pipe) {
2265
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'PIPELINE']];
2266
+        erreur_squelette($err_b_s_a, $p);
2267
+    } else {
2268
+        $_flux = interprete_argument_balise(2, $p);
2269
+        $_flux = $_flux ? $_flux : "''";
2270
+        $p->code = "pipeline( $_pipe , $_flux )";
2271
+        $p->interdire_scripts = false;
2272
+    }
2273 2273
 
2274
-	return $p;
2274
+    return $p;
2275 2275
 }
2276 2276
 
2277 2277
 
@@ -2296,10 +2296,10 @@  discard block
 block discarded – undo
2296 2296
  *     Pile complétée par le code à générer
2297 2297
  **/
2298 2298
 function balise_EDIT_dist($p) {
2299
-	$p->code = "''";
2300
-	$p->interdire_scripts = false;
2299
+    $p->code = "''";
2300
+    $p->interdire_scripts = false;
2301 2301
 
2302
-	return $p;
2302
+    return $p;
2303 2303
 }
2304 2304
 
2305 2305
 
@@ -2322,11 +2322,11 @@  discard block
 block discarded – undo
2322 2322
  *     Pile complétée par le code à générer
2323 2323
  **/
2324 2324
 function balise_TOTAL_UNIQUE_dist($p) {
2325
-	$_famille = interprete_argument_balise(1, $p);
2326
-	$_famille = $_famille ? $_famille : "''";
2327
-	$p->code = "unique('', $_famille, true)";
2325
+    $_famille = interprete_argument_balise(1, $p);
2326
+    $_famille = $_famille ? $_famille : "''";
2327
+    $p->code = "unique('', $_famille, true)";
2328 2328
 
2329
-	return $p;
2329
+    return $p;
2330 2330
 }
2331 2331
 
2332 2332
 /**
@@ -2349,19 +2349,19 @@  discard block
 block discarded – undo
2349 2349
  *     Pile complétée par le code à générer
2350 2350
  **/
2351 2351
 function balise_ARRAY_dist($p) {
2352
-	$_code = [];
2353
-	$n = 1;
2354
-	do {
2355
-		$_key = interprete_argument_balise($n++, $p);
2356
-		$_val = interprete_argument_balise($n++, $p);
2357
-		if ($_key and $_val) {
2358
-			$_code[] = "$_key => $_val";
2359
-		}
2360
-	} while ($_key && $_val);
2361
-	$p->code = 'array(' . join(', ', $_code) . ')';
2362
-	$p->interdire_scripts = false;
2352
+    $_code = [];
2353
+    $n = 1;
2354
+    do {
2355
+        $_key = interprete_argument_balise($n++, $p);
2356
+        $_val = interprete_argument_balise($n++, $p);
2357
+        if ($_key and $_val) {
2358
+            $_code[] = "$_key => $_val";
2359
+        }
2360
+    } while ($_key && $_val);
2361
+    $p->code = 'array(' . join(', ', $_code) . ')';
2362
+    $p->interdire_scripts = false;
2363 2363
 
2364
-	return $p;
2364
+    return $p;
2365 2365
 }
2366 2366
 
2367 2367
 /**
@@ -2380,15 +2380,15 @@  discard block
 block discarded – undo
2380 2380
  *     Pile complétée par le code à générer
2381 2381
  */
2382 2382
 function balise_LISTE_dist($p) {
2383
-	$_code = [];
2384
-	$n = 1;
2385
-	while ($_val = interprete_argument_balise($n++, $p)) {
2386
-		$_code[] = $_val;
2387
-	}
2388
-	$p->code = 'array(' . join(', ', $_code) . ')';
2389
-	$p->interdire_scripts = false;
2383
+    $_code = [];
2384
+    $n = 1;
2385
+    while ($_val = interprete_argument_balise($n++, $p)) {
2386
+        $_code[] = $_val;
2387
+    }
2388
+    $p->code = 'array(' . join(', ', $_code) . ')';
2389
+    $p->interdire_scripts = false;
2390 2390
 
2391
-	return $p;
2391
+    return $p;
2392 2392
 }
2393 2393
 
2394 2394
 
@@ -2422,21 +2422,21 @@  discard block
 block discarded – undo
2422 2422
  *     Pile complétée par le code à générer
2423 2423
  **/
2424 2424
 function balise_AUTORISER_dist($p) {
2425
-	$_code = [];
2426
-	$p->descr['session'] = true; // faire un cache par session
2425
+    $_code = [];
2426
+    $p->descr['session'] = true; // faire un cache par session
2427 2427
 
2428
-	$n = 1;
2429
-	while ($_v = interprete_argument_balise($n++, $p)) {
2430
-		$_code[] = $_v;
2431
-	}
2428
+    $n = 1;
2429
+    while ($_v = interprete_argument_balise($n++, $p)) {
2430
+        $_code[] = $_v;
2431
+    }
2432 2432
 
2433
-	$p->code = '((function_exists("autoriser")||include_spip("inc/autoriser"))&&autoriser(' . join(
2434
-		', ',
2435
-		$_code
2436
-	) . ')?" ":"")';
2437
-	$p->interdire_scripts = false;
2433
+    $p->code = '((function_exists("autoriser")||include_spip("inc/autoriser"))&&autoriser(' . join(
2434
+        ', ',
2435
+        $_code
2436
+    ) . ')?" ":"")';
2437
+    $p->interdire_scripts = false;
2438 2438
 
2439
-	return $p;
2439
+    return $p;
2440 2440
 }
2441 2441
 
2442 2442
 
@@ -2460,15 +2460,15 @@  discard block
 block discarded – undo
2460 2460
  *     Pile complétée par le code à générer
2461 2461
  **/
2462 2462
 function balise_PLUGIN_dist($p) {
2463
-	$plugin = interprete_argument_balise(1, $p);
2464
-	$plugin = isset($plugin) ? str_replace('\'', '"', $plugin) : '""';
2465
-	$type_info = interprete_argument_balise(2, $p);
2466
-	$type_info = isset($type_info) ? str_replace('\'', '"', $type_info) : '"est_actif"';
2463
+    $plugin = interprete_argument_balise(1, $p);
2464
+    $plugin = isset($plugin) ? str_replace('\'', '"', $plugin) : '""';
2465
+    $type_info = interprete_argument_balise(2, $p);
2466
+    $type_info = isset($type_info) ? str_replace('\'', '"', $type_info) : '"est_actif"';
2467 2467
 
2468
-	$f = chercher_filtre('info_plugin');
2469
-	$p->code = $f . '(' . $plugin . ', ' . $type_info . ')';
2468
+    $f = chercher_filtre('info_plugin');
2469
+    $p->code = $f . '(' . $plugin . ', ' . $type_info . ')';
2470 2470
 
2471
-	return $p;
2471
+    return $p;
2472 2472
 }
2473 2473
 
2474 2474
 /**
@@ -2489,9 +2489,9 @@  discard block
 block discarded – undo
2489 2489
  *     Pile complétée par le code à générer
2490 2490
  **/
2491 2491
 function balise_AIDER_dist($p) {
2492
-	$_motif = interprete_argument_balise(1, $p);
2493
-	$p->code = "((\$aider=charger_fonction('aide','inc',true))?\$aider($_motif):'')";
2494
-	return $p;
2492
+    $_motif = interprete_argument_balise(1, $p);
2493
+    $p->code = "((\$aider=charger_fonction('aide','inc',true))?\$aider($_motif):'')";
2494
+    return $p;
2495 2495
 }
2496 2496
 
2497 2497
 /**
@@ -2517,16 +2517,16 @@  discard block
 block discarded – undo
2517 2517
  *     Pile complétée par le code à générer
2518 2518
  **/
2519 2519
 function balise_ACTION_FORMULAIRE($p) {
2520
-	if (!$_url = interprete_argument_balise(1, $p)) {
2521
-		$_url = "@\$Pile[0]['action']";
2522
-	}
2523
-	if (!$_form = interprete_argument_balise(2, $p)) {
2524
-		$_form = "@\$Pile[0]['form']";
2525
-	}
2526
-
2527
-	// envoyer le nom du formulaire que l'on traite
2528
-	// transmettre les eventuels args de la balise formulaire
2529
-	$p->code = "	'<span class=\"form-hidden\">' .
2520
+    if (!$_url = interprete_argument_balise(1, $p)) {
2521
+        $_url = "@\$Pile[0]['action']";
2522
+    }
2523
+    if (!$_form = interprete_argument_balise(2, $p)) {
2524
+        $_form = "@\$Pile[0]['form']";
2525
+    }
2526
+
2527
+    // envoyer le nom du formulaire que l'on traite
2528
+    // transmettre les eventuels args de la balise formulaire
2529
+    $p->code = "	'<span class=\"form-hidden\">' .
2530 2530
 	form_hidden($_url) .
2531 2531
 	'<input name=\'formulaire_action\' type=\'hidden\'
2532 2532
 		value=\'' . $_form . '\' />' .
@@ -2535,9 +2535,9 @@  discard block
 block discarded – undo
2535 2535
 	(!empty(\$Pile[0]['_hidden']) ? @\$Pile[0]['_hidden'] : '') .
2536 2536
 	'</span>'";
2537 2537
 
2538
-	$p->interdire_scripts = false;
2538
+    $p->interdire_scripts = false;
2539 2539
 
2540
-	return $p;
2540
+    return $p;
2541 2541
 }
2542 2542
 
2543 2543
 
@@ -2578,25 +2578,25 @@  discard block
 block discarded – undo
2578 2578
  */
2579 2579
 function balise_BOUTON_ACTION_dist($p) {
2580 2580
 
2581
-	$args = [];
2582
-	for ($k = 1; $k <= 6; $k++) {
2583
-		$_a = interprete_argument_balise($k, $p);
2584
-		if (!$_a) {
2585
-			$_a = "''";
2586
-		}
2587
-		$args[] = $_a;
2588
-	}
2589
-	// supprimer les args vides
2590
-	while (end($args) == "''" and count($args) > 2) {
2591
-		array_pop($args);
2592
-	}
2593
-	$args = implode(',', $args);
2581
+    $args = [];
2582
+    for ($k = 1; $k <= 6; $k++) {
2583
+        $_a = interprete_argument_balise($k, $p);
2584
+        if (!$_a) {
2585
+            $_a = "''";
2586
+        }
2587
+        $args[] = $_a;
2588
+    }
2589
+    // supprimer les args vides
2590
+    while (end($args) == "''" and count($args) > 2) {
2591
+        array_pop($args);
2592
+    }
2593
+    $args = implode(',', $args);
2594 2594
 
2595
-	$bouton_action = chercher_filtre('bouton_action');
2596
-	$p->code = "$bouton_action($args)";
2597
-	$p->interdire_scripts = false;
2595
+    $bouton_action = chercher_filtre('bouton_action');
2596
+    $p->code = "$bouton_action($args)";
2597
+    $p->interdire_scripts = false;
2598 2598
 
2599
-	return $p;
2599
+    return $p;
2600 2600
 }
2601 2601
 
2602 2602
 
@@ -2615,10 +2615,10 @@  discard block
 block discarded – undo
2615 2615
  *     Pile complétée par le code à générer
2616 2616
  */
2617 2617
 function balise_SLOGAN_SITE_SPIP_dist($p) {
2618
-	$p->code = "\$GLOBALS['meta']['slogan_site']";
2618
+    $p->code = "\$GLOBALS['meta']['slogan_site']";
2619 2619
 
2620
-	#$p->interdire_scripts = true;
2621
-	return $p;
2620
+    #$p->interdire_scripts = true;
2621
+    return $p;
2622 2622
 }
2623 2623
 
2624 2624
 
@@ -2642,10 +2642,10 @@  discard block
 block discarded – undo
2642 2642
  *     Pile complétée par le code à générer
2643 2643
  */
2644 2644
 function balise_HTML5_dist($p) {
2645
-	$p->code = html5_permis() ? "' '" : "''";
2646
-	$p->interdire_scripts = false;
2645
+    $p->code = html5_permis() ? "' '" : "''";
2646
+    $p->interdire_scripts = false;
2647 2647
 
2648
-	return $p;
2648
+    return $p;
2649 2649
 }
2650 2650
 
2651 2651
 
@@ -2671,61 +2671,61 @@  discard block
 block discarded – undo
2671 2671
  *     Pile complétée par le code à générer
2672 2672
  */
2673 2673
 function balise_TRI_dist($p, $liste = 'true') {
2674
-	$b = index_boucle_mere($p);
2675
-	// s'il n'y a pas de nom de boucle, on ne peut pas trier
2676
-	if ($b === '') {
2677
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
2678
-		erreur_squelette($msg, $p);
2679
-		$p->code = "''";
2674
+    $b = index_boucle_mere($p);
2675
+    // s'il n'y a pas de nom de boucle, on ne peut pas trier
2676
+    if ($b === '') {
2677
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
2678
+        erreur_squelette($msg, $p);
2679
+        $p->code = "''";
2680 2680
 
2681
-		return $p;
2682
-	}
2683
-	$boucle = $p->boucles[$b];
2681
+        return $p;
2682
+    }
2683
+    $boucle = $p->boucles[$b];
2684 2684
 
2685
-	// s'il n'y a pas de tri_champ, c'est qu'on se trouve
2686
-	// dans un boucle recursive ou qu'on a oublie le critere {tri}
2687
-	if (!isset($boucle->modificateur['tri_champ'])) {
2688
-		$msg = ['zbug_champ_hors_critere', [
2689
-			'champ' => zbug_presenter_champ($p),
2690
-			'critere' => 'tri'
2691
-		]];
2692
-		erreur_squelette($msg, $p);
2693
-		$p->code = "''";
2685
+    // s'il n'y a pas de tri_champ, c'est qu'on se trouve
2686
+    // dans un boucle recursive ou qu'on a oublie le critere {tri}
2687
+    if (!isset($boucle->modificateur['tri_champ'])) {
2688
+        $msg = ['zbug_champ_hors_critere', [
2689
+            'champ' => zbug_presenter_champ($p),
2690
+            'critere' => 'tri'
2691
+        ]];
2692
+        erreur_squelette($msg, $p);
2693
+        $p->code = "''";
2694 2694
 
2695
-		return $p;
2696
-	}
2695
+        return $p;
2696
+    }
2697 2697
 
2698
-	$_champ = interprete_argument_balise(1, $p);
2699
-	// si pas de champ, renvoyer le critere de tri utilise
2700
-	if (!$_champ) {
2701
-		$p->code = $boucle->modificateur['tri_champ'];
2698
+    $_champ = interprete_argument_balise(1, $p);
2699
+    // si pas de champ, renvoyer le critere de tri utilise
2700
+    if (!$_champ) {
2701
+        $p->code = $boucle->modificateur['tri_champ'];
2702 2702
 
2703
-		return $p;
2704
-	}
2705
-	// forcer la jointure si besoin, et si le champ est statique
2706
-	if (preg_match(",^'([\w.]+)'$,i", $_champ, $m)) {
2707
-		index_pile($b, $m[1], $p->boucles, '', null, true, false);
2708
-	}
2703
+        return $p;
2704
+    }
2705
+    // forcer la jointure si besoin, et si le champ est statique
2706
+    if (preg_match(",^'([\w.]+)'$,i", $_champ, $m)) {
2707
+        index_pile($b, $m[1], $p->boucles, '', null, true, false);
2708
+    }
2709 2709
 
2710
-	$_libelle = interprete_argument_balise(2, $p);
2711
-	$_libelle = $_libelle ? $_libelle : $_champ;
2710
+    $_libelle = interprete_argument_balise(2, $p);
2711
+    $_libelle = $_libelle ? $_libelle : $_champ;
2712 2712
 
2713
-	$_class = interprete_argument_balise(3, $p);
2714
-	// si champ = ">" c'est un lien vers le tri croissant : de gauche a droite ==> 1
2715
-	// si champ = "<" c'est un lien vers le tri decroissant : (sens inverse) == -1
2716
-	$_issens = "in_array($_champ,array('>','<'))";
2717
-	$_sens = "(strpos('< >',$_champ)-1)";
2713
+    $_class = interprete_argument_balise(3, $p);
2714
+    // si champ = ">" c'est un lien vers le tri croissant : de gauche a droite ==> 1
2715
+    // si champ = "<" c'est un lien vers le tri decroissant : (sens inverse) == -1
2716
+    $_issens = "in_array($_champ,array('>','<'))";
2717
+    $_sens = "(strpos('< >',$_champ)-1)";
2718 2718
 
2719
-	$_variable = "((\$s=$_issens)?'sens':'tri')." . $boucle->modificateur['tri_nom'];
2720
-	$_url = "parametre_url(self(),$_variable,\$s?$_sens:$_champ)";
2721
-	$_url = "parametre_url($_url,'var_memotri',strncmp(" . $boucle->modificateur['tri_nom'] . ",'session',7)==0?$_variable:'')";
2722
-	$_on = '$s?(' . $boucle->modificateur['tri_sens'] . "==$_sens" . '):(' . $boucle->modificateur['tri_champ'] . "==$_champ)";
2719
+    $_variable = "((\$s=$_issens)?'sens':'tri')." . $boucle->modificateur['tri_nom'];
2720
+    $_url = "parametre_url(self(),$_variable,\$s?$_sens:$_champ)";
2721
+    $_url = "parametre_url($_url,'var_memotri',strncmp(" . $boucle->modificateur['tri_nom'] . ",'session',7)==0?$_variable:'')";
2722
+    $_on = '$s?(' . $boucle->modificateur['tri_sens'] . "==$_sens" . '):(' . $boucle->modificateur['tri_champ'] . "==$_champ)";
2723 2723
 
2724
-	$p->code = "lien_ou_expose($_url,$_libelle,$_on" . ($_class ? ",$_class" : '') . ')';
2725
-	//$p->code = "''";
2726
-	$p->interdire_scripts = false;
2724
+    $p->code = "lien_ou_expose($_url,$_libelle,$_on" . ($_class ? ",$_class" : '') . ')';
2725
+    //$p->code = "''";
2726
+    $p->interdire_scripts = false;
2727 2727
 
2728
-	return $p;
2728
+    return $p;
2729 2729
 }
2730 2730
 
2731 2731
 
@@ -2746,22 +2746,22 @@  discard block
 block discarded – undo
2746 2746
  *     Pile complétée par le code à générer
2747 2747
  */
2748 2748
 function balise_SAUTER_dist($p) {
2749
-	$id_boucle = $p->id_boucle;
2749
+    $id_boucle = $p->id_boucle;
2750 2750
 
2751
-	if (empty($p->boucles[$id_boucle])) {
2752
-		$msg = ['zbug_champ_hors_boucle', ['champ' => '#SAUTER']];
2753
-		erreur_squelette($msg, $p);
2754
-	} else {
2755
-		$boucle = $p->boucles[$id_boucle];
2756
-		$_saut = interprete_argument_balise(1, $p);
2757
-		$_compteur = "\$Numrows['$id_boucle']['compteur_boucle']";
2758
-		$_total = "\$Numrows['$id_boucle']['total']";
2751
+    if (empty($p->boucles[$id_boucle])) {
2752
+        $msg = ['zbug_champ_hors_boucle', ['champ' => '#SAUTER']];
2753
+        erreur_squelette($msg, $p);
2754
+    } else {
2755
+        $boucle = $p->boucles[$id_boucle];
2756
+        $_saut = interprete_argument_balise(1, $p);
2757
+        $_compteur = "\$Numrows['$id_boucle']['compteur_boucle']";
2758
+        $_total = "\$Numrows['$id_boucle']['total']";
2759 2759
 
2760
-		$p->code = "vide($_compteur=\$iter->skip($_saut,$_total))";
2761
-	}
2762
-	$p->interdire_scripts = false;
2760
+        $p->code = "vide($_compteur=\$iter->skip($_saut,$_total))";
2761
+    }
2762
+    $p->interdire_scripts = false;
2763 2763
 
2764
-	return $p;
2764
+    return $p;
2765 2765
 }
2766 2766
 
2767 2767
 
@@ -2783,22 +2783,22 @@  discard block
 block discarded – undo
2783 2783
  *     Pile complétée par le code à générer
2784 2784
  */
2785 2785
 function balise_PUBLIE_dist($p) {
2786
-	if (!$_type = interprete_argument_balise(1, $p)) {
2787
-		$_type = _q($p->type_requete);
2788
-		$_id = champ_sql($p->boucles[$p->id_boucle]->primary, $p);
2789
-	} else {
2790
-		$_id = interprete_argument_balise(2, $p);
2791
-	}
2786
+    if (!$_type = interprete_argument_balise(1, $p)) {
2787
+        $_type = _q($p->type_requete);
2788
+        $_id = champ_sql($p->boucles[$p->id_boucle]->primary, $p);
2789
+    } else {
2790
+        $_id = interprete_argument_balise(2, $p);
2791
+    }
2792 2792
 
2793
-	$connect = '';
2794
-	if (isset($p->boucles[$p->id_boucle])) {
2795
-		$connect = $p->boucles[$p->id_boucle]->sql_serveur;
2796
-	}
2793
+    $connect = '';
2794
+    if (isset($p->boucles[$p->id_boucle])) {
2795
+        $connect = $p->boucles[$p->id_boucle]->sql_serveur;
2796
+    }
2797 2797
 
2798
-	$p->code = '(objet_test_si_publie(' . $_type . ',intval(' . $_id . '),' . _q($connect) . ")?' ':'')";
2799
-	$p->interdire_scripts = false;
2798
+    $p->code = '(objet_test_si_publie(' . $_type . ',intval(' . $_id . '),' . _q($connect) . ")?' ':'')";
2799
+    $p->interdire_scripts = false;
2800 2800
 
2801
-	return $p;
2801
+    return $p;
2802 2802
 }
2803 2803
 
2804 2804
 /**
@@ -2827,12 +2827,12 @@  discard block
 block discarded – undo
2827 2827
  *     Pile complétée par le code à générer
2828 2828
  */
2829 2829
 function balise_PRODUIRE_dist($p) {
2830
-	$balise_inclure = charger_fonction('INCLURE', 'balise');
2831
-	$p = $balise_inclure($p);
2830
+    $balise_inclure = charger_fonction('INCLURE', 'balise');
2831
+    $p = $balise_inclure($p);
2832 2832
 
2833
-	$p->code = str_replace('recuperer_fond(', 'produire_fond_statique(', $p->code);
2833
+    $p->code = str_replace('recuperer_fond(', 'produire_fond_statique(', $p->code);
2834 2834
 
2835
-	return $p;
2835
+    return $p;
2836 2836
 }
2837 2837
 
2838 2838
 /**
@@ -2851,13 +2851,13 @@  discard block
 block discarded – undo
2851 2851
  *     Pile complétée par le code à générer
2852 2852
  */
2853 2853
 function balise_LARGEUR_ECRAN_dist($p) {
2854
-	$_class = interprete_argument_balise(1, $p);
2855
-	if (!$_class) {
2856
-		$_class = 'null';
2857
-	}
2858
-	$p->code = "(is_string($_class)?vide(\$GLOBALS['largeur_ecran']=$_class):(isset(\$GLOBALS['largeur_ecran'])?\$GLOBALS['largeur_ecran']:''))";
2854
+    $_class = interprete_argument_balise(1, $p);
2855
+    if (!$_class) {
2856
+        $_class = 'null';
2857
+    }
2858
+    $p->code = "(is_string($_class)?vide(\$GLOBALS['largeur_ecran']=$_class):(isset(\$GLOBALS['largeur_ecran'])?\$GLOBALS['largeur_ecran']:''))";
2859 2859
 
2860
-	return $p;
2860
+    return $p;
2861 2861
 }
2862 2862
 
2863 2863
 
@@ -2873,14 +2873,14 @@  discard block
 block discarded – undo
2873 2873
  *     Pile complétée par le code à générer
2874 2874
  **/
2875 2875
 function balise_CONST_dist($p) {
2876
-	$_const = interprete_argument_balise(1, $p);
2877
-	if (!strlen($_const)) {
2878
-		$p->code = "''";
2879
-	}
2880
-	else {
2881
-		$p->code = "(defined($_const)?constant($_const):'')";
2882
-	}
2883
-	$p->interdire_scripts = false;
2884
-
2885
-	return $p;
2876
+    $_const = interprete_argument_balise(1, $p);
2877
+    if (!strlen($_const)) {
2878
+        $p->code = "''";
2879
+    }
2880
+    else {
2881
+        $p->code = "(defined($_const)?constant($_const):'')";
2882
+    }
2883
+    $p->interdire_scripts = false;
2884
+
2885
+    return $p;
2886 2886
 }
Please login to merge, or discard this patch.
ecrire/public/fonctions.php 1 patch
Indentation   +298 added lines, -298 removed lines patch added patch discarded remove patch
@@ -23,7 +23,7 @@  discard block
 block discarded – undo
23 23
  **/
24 24
 
25 25
 if (!defined('_ECRIRE_INC_VERSION')) {
26
-	return;
26
+    return;
27 27
 }
28 28
 
29 29
 
@@ -52,75 +52,75 @@  discard block
 block discarded – undo
52 52
  *     Introduction calculée
53 53
  **/
54 54
 function filtre_introduction_dist($descriptif, $texte, $longueur, $connect, $suite = null) {
55
-	// Si un descriptif est envoye, on l'utilise directement
56
-	if (strlen($descriptif)) {
57
-		return appliquer_traitement_champ($descriptif, 'introduction', '', [], $connect);
58
-	}
59
-
60
-	// De preference ce qui est marque <intro>...</intro>
61
-	$intro = '';
62
-	$texte = preg_replace(',(</?)intro>,i', "\\1intro>", $texte); // minuscules
63
-	while ($fin = strpos($texte, '</intro>')) {
64
-		$zone = substr($texte, 0, $fin);
65
-		$texte = substr($texte, $fin + strlen('</intro>'));
66
-		if ($deb = strpos($zone, '<intro>') or substr($zone, 0, 7) == '<intro>') {
67
-			$zone = substr($zone, $deb + 7);
68
-		}
69
-		$intro .= $zone;
70
-	}
71
-
72
-	// [12025] On ne *PEUT* pas couper simplement ici car c'est du texte brut,
73
-	// qui inclus raccourcis et modeles
74
-	// un simple <articlexx> peut etre ensuite transforme en 1000 lignes ...
75
-	// par ailleurs le nettoyage des raccourcis ne tient pas compte
76
-	// des surcharges et enrichissement de propre
77
-	// couper doit se faire apres propre
78
-	//$texte = nettoyer_raccourcis_typo($intro ? $intro : $texte, $connect);
79
-
80
-	// Cependant pour des questions de perfs on coupe quand meme, en prenant
81
-	// large et en se mefiant des tableaux #1323
82
-
83
-	if (strlen($intro)) {
84
-		$texte = $intro;
85
-	} else {
86
-		if (
87
-			strpos("\n" . $texte, "\n|") === false
88
-			and strlen($texte) > 2.5 * $longueur
89
-		) {
90
-			if (strpos($texte, '<multi') !== false) {
91
-				$texte = extraire_multi($texte);
92
-			}
93
-			$texte = couper($texte, 2 * $longueur);
94
-		}
95
-	}
96
-
97
-	// ne pas tenir compte des notes
98
-	if ($notes = charger_fonction('notes', 'inc', true)) {
99
-		$notes('', 'empiler');
100
-	}
101
-	// Supprimer les modèles avant le propre afin d'éviter qu'ils n'ajoutent du texte indésirable
102
-	// dans l'introduction.
103
-	$texte = supprime_img($texte, '');
104
-	$texte = appliquer_traitement_champ($texte, 'introduction', '', [], $connect);
105
-
106
-	if ($notes) {
107
-		$notes('', 'depiler');
108
-	}
109
-
110
-	if (is_null($suite) and defined('_INTRODUCTION_SUITE')) {
111
-		$suite = _INTRODUCTION_SUITE;
112
-	}
113
-	$texte = couper($texte, $longueur, $suite);
114
-	// comme on a coupe il faut repasser la typo (on a perdu les insecables)
115
-	$texte = typo($texte, true, $connect, []);
116
-
117
-	// et reparagrapher si necessaire (coherence avec le cas descriptif)
118
-	// une introduction a tojours un <p>
119
-	if ($GLOBALS['toujours_paragrapher']) { // Fermer les paragraphes
120
-	$texte = paragrapher($texte, $GLOBALS['toujours_paragrapher']);
121
-	}
122
-
123
-	return $texte;
55
+    // Si un descriptif est envoye, on l'utilise directement
56
+    if (strlen($descriptif)) {
57
+        return appliquer_traitement_champ($descriptif, 'introduction', '', [], $connect);
58
+    }
59
+
60
+    // De preference ce qui est marque <intro>...</intro>
61
+    $intro = '';
62
+    $texte = preg_replace(',(</?)intro>,i', "\\1intro>", $texte); // minuscules
63
+    while ($fin = strpos($texte, '</intro>')) {
64
+        $zone = substr($texte, 0, $fin);
65
+        $texte = substr($texte, $fin + strlen('</intro>'));
66
+        if ($deb = strpos($zone, '<intro>') or substr($zone, 0, 7) == '<intro>') {
67
+            $zone = substr($zone, $deb + 7);
68
+        }
69
+        $intro .= $zone;
70
+    }
71
+
72
+    // [12025] On ne *PEUT* pas couper simplement ici car c'est du texte brut,
73
+    // qui inclus raccourcis et modeles
74
+    // un simple <articlexx> peut etre ensuite transforme en 1000 lignes ...
75
+    // par ailleurs le nettoyage des raccourcis ne tient pas compte
76
+    // des surcharges et enrichissement de propre
77
+    // couper doit se faire apres propre
78
+    //$texte = nettoyer_raccourcis_typo($intro ? $intro : $texte, $connect);
79
+
80
+    // Cependant pour des questions de perfs on coupe quand meme, en prenant
81
+    // large et en se mefiant des tableaux #1323
82
+
83
+    if (strlen($intro)) {
84
+        $texte = $intro;
85
+    } else {
86
+        if (
87
+            strpos("\n" . $texte, "\n|") === false
88
+            and strlen($texte) > 2.5 * $longueur
89
+        ) {
90
+            if (strpos($texte, '<multi') !== false) {
91
+                $texte = extraire_multi($texte);
92
+            }
93
+            $texte = couper($texte, 2 * $longueur);
94
+        }
95
+    }
96
+
97
+    // ne pas tenir compte des notes
98
+    if ($notes = charger_fonction('notes', 'inc', true)) {
99
+        $notes('', 'empiler');
100
+    }
101
+    // Supprimer les modèles avant le propre afin d'éviter qu'ils n'ajoutent du texte indésirable
102
+    // dans l'introduction.
103
+    $texte = supprime_img($texte, '');
104
+    $texte = appliquer_traitement_champ($texte, 'introduction', '', [], $connect);
105
+
106
+    if ($notes) {
107
+        $notes('', 'depiler');
108
+    }
109
+
110
+    if (is_null($suite) and defined('_INTRODUCTION_SUITE')) {
111
+        $suite = _INTRODUCTION_SUITE;
112
+    }
113
+    $texte = couper($texte, $longueur, $suite);
114
+    // comme on a coupe il faut repasser la typo (on a perdu les insecables)
115
+    $texte = typo($texte, true, $connect, []);
116
+
117
+    // et reparagrapher si necessaire (coherence avec le cas descriptif)
118
+    // une introduction a tojours un <p>
119
+    if ($GLOBALS['toujours_paragrapher']) { // Fermer les paragraphes
120
+    $texte = paragrapher($texte, $GLOBALS['toujours_paragrapher']);
121
+    }
122
+
123
+    return $texte;
124 124
 }
125 125
 
126 126
 
@@ -155,73 +155,73 @@  discard block
 block discarded – undo
155 155
  *     Code HTML de la pagination
156 156
  **/
157 157
 function filtre_pagination_dist(
158
-	$total,
159
-	$nom,
160
-	$position,
161
-	$pas,
162
-	$liste = true,
163
-	$modele = '',
164
-	$connect = '',
165
-	$env = []
158
+    $total,
159
+    $nom,
160
+    $position,
161
+    $pas,
162
+    $liste = true,
163
+    $modele = '',
164
+    $connect = '',
165
+    $env = []
166 166
 ) {
167
-	static $ancres = [];
168
-	if ($pas < 1) {
169
-		return '';
170
-	}
171
-	$ancre = 'pagination' . $nom; // #pagination_articles
172
-	$debut = 'debut' . $nom; // 'debut_articles'
173
-
174
-	// n'afficher l'ancre qu'une fois
175
-	if (!isset($ancres[$ancre])) {
176
-		$bloc_ancre = $ancres[$ancre] = "<a id='" . $ancre . "' class='pagination_ancre'></a>";
177
-	} else {
178
-		$bloc_ancre = '';
179
-	}
180
-	// liste = false : on ne veut que l'ancre
181
-	if (!$liste) {
182
-		return $ancres[$ancre];
183
-	}
184
-
185
-	$self = (empty($env['self']) ? self() : $env['self']);
186
-	$pagination = [
187
-		'debut' => $debut,
188
-		'url' => parametre_url($self, 'fragment', ''), // nettoyer l'id ahah eventuel
189
-		'total' => $total,
190
-		'position' => intval($position),
191
-		'pas' => $pas,
192
-		'nombre_pages' => floor(($total - 1) / $pas) + 1,
193
-		'page_courante' => floor(intval($position) / $pas) + 1,
194
-		'ancre' => $ancre,
195
-		'bloc_ancre' => $bloc_ancre
196
-	];
197
-	if (is_array($env)) {
198
-		$pagination = array_merge($env, $pagination);
199
-	}
200
-
201
-	// Pas de pagination
202
-	if ($pagination['nombre_pages'] <= 1) {
203
-		return '';
204
-	}
205
-
206
-	if ($modele) {
207
-		$pagination['type_pagination'] = $modele;
208
-		if (trouver_fond('pagination_' . $modele, 'modeles')) {
209
-			$modele = '_' . $modele;
210
-		}
211
-		else {
212
-			$modele = '';
213
-		}
214
-	}
215
-
216
-	if (!defined('_PAGINATION_NOMBRE_LIENS_MAX')) {
217
-		define('_PAGINATION_NOMBRE_LIENS_MAX', 10);
218
-	}
219
-	if (!defined('_PAGINATION_NOMBRE_LIENS_MAX_ECRIRE')) {
220
-		define('_PAGINATION_NOMBRE_LIENS_MAX_ECRIRE', 5);
221
-	}
222
-
223
-
224
-	return recuperer_fond("modeles/pagination$modele", $pagination, ['trim' => true], $connect);
167
+    static $ancres = [];
168
+    if ($pas < 1) {
169
+        return '';
170
+    }
171
+    $ancre = 'pagination' . $nom; // #pagination_articles
172
+    $debut = 'debut' . $nom; // 'debut_articles'
173
+
174
+    // n'afficher l'ancre qu'une fois
175
+    if (!isset($ancres[$ancre])) {
176
+        $bloc_ancre = $ancres[$ancre] = "<a id='" . $ancre . "' class='pagination_ancre'></a>";
177
+    } else {
178
+        $bloc_ancre = '';
179
+    }
180
+    // liste = false : on ne veut que l'ancre
181
+    if (!$liste) {
182
+        return $ancres[$ancre];
183
+    }
184
+
185
+    $self = (empty($env['self']) ? self() : $env['self']);
186
+    $pagination = [
187
+        'debut' => $debut,
188
+        'url' => parametre_url($self, 'fragment', ''), // nettoyer l'id ahah eventuel
189
+        'total' => $total,
190
+        'position' => intval($position),
191
+        'pas' => $pas,
192
+        'nombre_pages' => floor(($total - 1) / $pas) + 1,
193
+        'page_courante' => floor(intval($position) / $pas) + 1,
194
+        'ancre' => $ancre,
195
+        'bloc_ancre' => $bloc_ancre
196
+    ];
197
+    if (is_array($env)) {
198
+        $pagination = array_merge($env, $pagination);
199
+    }
200
+
201
+    // Pas de pagination
202
+    if ($pagination['nombre_pages'] <= 1) {
203
+        return '';
204
+    }
205
+
206
+    if ($modele) {
207
+        $pagination['type_pagination'] = $modele;
208
+        if (trouver_fond('pagination_' . $modele, 'modeles')) {
209
+            $modele = '_' . $modele;
210
+        }
211
+        else {
212
+            $modele = '';
213
+        }
214
+    }
215
+
216
+    if (!defined('_PAGINATION_NOMBRE_LIENS_MAX')) {
217
+        define('_PAGINATION_NOMBRE_LIENS_MAX', 10);
218
+    }
219
+    if (!defined('_PAGINATION_NOMBRE_LIENS_MAX_ECRIRE')) {
220
+        define('_PAGINATION_NOMBRE_LIENS_MAX_ECRIRE', 5);
221
+    }
222
+
223
+
224
+    return recuperer_fond("modeles/pagination$modele", $pagination, ['trim' => true], $connect);
225 225
 }
226 226
 
227 227
 
@@ -240,44 +240,44 @@  discard block
 block discarded – undo
240 240
  *     Liste (première page, dernière page).
241 241
  **/
242 242
 function filtre_bornes_pagination_dist($courante, $nombre, $max = 10) {
243
-	if ($max <= 0 or $max >= $nombre) {
244
-		return [1, $nombre];
245
-	}
246
-	if ($max <= 1) {
247
-		return [$courante, $courante];
248
-	}
249
-
250
-	$premiere = max(1, $courante - floor(($max - 1) / 2));
251
-	$derniere = min($nombre, $premiere + $max - 2);
252
-	$premiere = $derniere == $nombre ? $derniere - $max + 1 : $premiere;
253
-
254
-	return [$premiere, $derniere];
243
+    if ($max <= 0 or $max >= $nombre) {
244
+        return [1, $nombre];
245
+    }
246
+    if ($max <= 1) {
247
+        return [$courante, $courante];
248
+    }
249
+
250
+    $premiere = max(1, $courante - floor(($max - 1) / 2));
251
+    $derniere = min($nombre, $premiere + $max - 2);
252
+    $premiere = $derniere == $nombre ? $derniere - $max + 1 : $premiere;
253
+
254
+    return [$premiere, $derniere];
255 255
 }
256 256
 
257 257
 function filtre_pagination_affiche_texte_lien_page_dist($type_pagination, $numero_page, $rang_item) {
258
-	if ($numero_page === 'tous') {
259
-		return '&#8734;';
260
-	}
261
-	if ($numero_page === 'prev') {
262
-		return '&lt;';
263
-	}
264
-	if ($numero_page === 'next') {
265
-		return '&gt;';
266
-	}
267
-
268
-	switch ($type_pagination) {
269
-		case 'resultats':
270
-			return $rang_item + 1; // 1 11 21 31...
271
-		case 'naturel':
272
-			return $rang_item ? $rang_item : 1; // 1 10 20 30...
273
-		case 'rang':
274
-			return $rang_item; // 0 10 20 30...
275
-
276
-		case 'page':
277
-		case 'prive':
278
-		default:
279
-			return $numero_page; // 1 2 3 4 5...
280
-	}
258
+    if ($numero_page === 'tous') {
259
+        return '&#8734;';
260
+    }
261
+    if ($numero_page === 'prev') {
262
+        return '&lt;';
263
+    }
264
+    if ($numero_page === 'next') {
265
+        return '&gt;';
266
+    }
267
+
268
+    switch ($type_pagination) {
269
+        case 'resultats':
270
+            return $rang_item + 1; // 1 11 21 31...
271
+        case 'naturel':
272
+            return $rang_item ? $rang_item : 1; // 1 10 20 30...
273
+        case 'rang':
274
+            return $rang_item; // 0 10 20 30...
275
+
276
+        case 'page':
277
+        case 'prive':
278
+        default:
279
+            return $numero_page; // 1 2 3 4 5...
280
+    }
281 281
 }
282 282
 
283 283
 /**
@@ -290,15 +290,15 @@  discard block
 block discarded – undo
290 290
  **/
291 291
 function lister_objets_avec_logos($type) {
292 292
 
293
-	$objet = objet_type($type);
294
-	$ids = sql_allfetsel('L.id_objet', 'spip_documents AS D JOIN spip_documents_liens AS L ON L.id_document=D.id_document', 'D.mode=' . sql_quote('logoon') . ' AND L.objet=' . sql_quote($objet));
295
-	if ($ids) {
296
-		$ids = array_column($ids, 'id_objet');
297
-		return implode(',', $ids);
298
-	}
299
-	else {
300
-		return '0';
301
-	}
293
+    $objet = objet_type($type);
294
+    $ids = sql_allfetsel('L.id_objet', 'spip_documents AS D JOIN spip_documents_liens AS L ON L.id_document=D.id_document', 'D.mode=' . sql_quote('logoon') . ' AND L.objet=' . sql_quote($objet));
295
+    if ($ids) {
296
+        $ids = array_column($ids, 'id_objet');
297
+        return implode(',', $ids);
298
+    }
299
+    else {
300
+        return '0';
301
+    }
302 302
 }
303 303
 
304 304
 
@@ -314,14 +314,14 @@  discard block
 block discarded – undo
314 314
  *     Code HTML des notes
315 315
  **/
316 316
 function calculer_notes() {
317
-	$r = '';
318
-	if ($notes = charger_fonction('notes', 'inc', true)) {
319
-		$r = $notes([]);
320
-		$notes('', 'depiler');
321
-		$notes('', 'empiler');
322
-	}
323
-
324
-	return $r;
317
+    $r = '';
318
+    if ($notes = charger_fonction('notes', 'inc', true)) {
319
+        $r = $notes([]);
320
+        $notes('', 'depiler');
321
+        $notes('', 'empiler');
322
+    }
323
+
324
+    return $r;
325 325
 }
326 326
 
327 327
 
@@ -338,10 +338,10 @@  discard block
 block discarded – undo
338 338
  * @return string
339 339
  */
340 340
 function retrouver_rang_lien($objet_source, $ids, $objet_lie, $idl, $objet_lien) {
341
-	$res = lister_objets_liens($objet_source, $objet_lie, $idl, $objet_lien);
342
-	$res = array_column($res, 'rang_lien', $objet_source);
341
+    $res = lister_objets_liens($objet_source, $objet_lie, $idl, $objet_lien);
342
+    $res = array_column($res, 'rang_lien', $objet_source);
343 343
 
344
-	return (isset($res[$ids]) ? $res[$ids] : '');
344
+    return (isset($res[$ids]) ? $res[$ids] : '');
345 345
 }
346 346
 
347 347
 
@@ -358,19 +358,19 @@  discard block
 block discarded – undo
358 358
  * @private
359 359
  */
360 360
 function lister_objets_liens($objet_source, $objet, $id_objet, $objet_lien) {
361
-	static $liens = [];
362
-	if (!isset($liens["$objet_source-$objet-$id_objet-$objet_lien"])) {
363
-		include_spip('action/editer_liens');
364
-		// quand $objet == $objet_lien == $objet_source on reste sur le cas par defaut de $objet_lien == $objet_source
365
-		if ($objet_lien == $objet and $objet_lien !== $objet_source) {
366
-			$res = objet_trouver_liens([$objet => $id_objet], [$objet_source => '*']);
367
-		} else {
368
-			$res = objet_trouver_liens([$objet_source => '*'], [$objet => $id_objet]);
369
-		}
370
-
371
-		$liens["$objet_source-$objet-$id_objet-$objet_lien"] = $res;
372
-	}
373
-	return $liens["$objet_source-$objet-$id_objet-$objet_lien"];
361
+    static $liens = [];
362
+    if (!isset($liens["$objet_source-$objet-$id_objet-$objet_lien"])) {
363
+        include_spip('action/editer_liens');
364
+        // quand $objet == $objet_lien == $objet_source on reste sur le cas par defaut de $objet_lien == $objet_source
365
+        if ($objet_lien == $objet and $objet_lien !== $objet_source) {
366
+            $res = objet_trouver_liens([$objet => $id_objet], [$objet_source => '*']);
367
+        } else {
368
+            $res = objet_trouver_liens([$objet_source => '*'], [$objet => $id_objet]);
369
+        }
370
+
371
+        $liens["$objet_source-$objet-$id_objet-$objet_lien"] = $res;
372
+    }
373
+    return $liens["$objet_source-$objet-$id_objet-$objet_lien"];
374 374
 }
375 375
 
376 376
 /**
@@ -384,24 +384,24 @@  discard block
 block discarded – undo
384 384
  * @return int|string
385 385
  */
386 386
 function calculer_rang_smart($titre, $objet_source, $id, $env) {
387
-	// Cas du #RANG utilisé dans #FORMULAIRE_EDITER_LIENS -> attraper le rang du lien
388
-	// permet de voir le rang du lien si il y en a un en base, meme avant un squelette xxxx-lies.html ne gerant pas les liens
389
-	if (
390
-		isset($env['form']) and $env['form']
391
-		and isset($env['_objet_lien']) and $env['_objet_lien']
392
-		and (function_exists('lien_triables') or include_spip('action/editer_liens'))
393
-		and $r = objet_associable($env['_objet_lien'])
394
-		and list($p, $table_lien) = $r
395
-		and lien_triables($table_lien)
396
-		and isset($env['objet']) and $env['objet']
397
-		and isset($env['id_objet']) and $env['id_objet']
398
-		and $objet_source
399
-		and $id = intval($id)
400
-	) {
401
-		$rang = retrouver_rang_lien($objet_source, $id, $env['objet'], $env['id_objet'], $env['_objet_lien']);
402
-		return ($rang ? $rang : '');
403
-	}
404
-	return recuperer_numero($titre);
387
+    // Cas du #RANG utilisé dans #FORMULAIRE_EDITER_LIENS -> attraper le rang du lien
388
+    // permet de voir le rang du lien si il y en a un en base, meme avant un squelette xxxx-lies.html ne gerant pas les liens
389
+    if (
390
+        isset($env['form']) and $env['form']
391
+        and isset($env['_objet_lien']) and $env['_objet_lien']
392
+        and (function_exists('lien_triables') or include_spip('action/editer_liens'))
393
+        and $r = objet_associable($env['_objet_lien'])
394
+        and list($p, $table_lien) = $r
395
+        and lien_triables($table_lien)
396
+        and isset($env['objet']) and $env['objet']
397
+        and isset($env['id_objet']) and $env['id_objet']
398
+        and $objet_source
399
+        and $id = intval($id)
400
+    ) {
401
+        $rang = retrouver_rang_lien($objet_source, $id, $env['objet'], $env['id_objet'], $env['_objet_lien']);
402
+        return ($rang ? $rang : '');
403
+    }
404
+    return recuperer_numero($titre);
405 405
 }
406 406
 
407 407
 
@@ -417,7 +417,7 @@  discard block
 block discarded – undo
417 417
  * @return string
418 418
  */
419 419
 function tri_protege_champ($t) {
420
-	return preg_replace(',[^\s\w.+\[\]],', '', $t);
420
+    return preg_replace(',[^\s\w.+\[\]],', '', $t);
421 421
 }
422 422
 
423 423
 /**
@@ -430,43 +430,43 @@  discard block
 block discarded – undo
430 430
  * @return string
431 431
  */
432 432
 function tri_champ_order($t, $from = null, $senstri = '') {
433
-	if (strncmp($t, 'multi ', 6) == 0) {
434
-		return 'multi';
435
-	}
436
-
437
-	$champ = $t;
438
-
439
-	$prefixe = '';
440
-	foreach (['num ', 'sinum '] as $p) {
441
-		if (strpos($t, $p) === 0) {
442
-			$champ = substr($t, strlen($p));
443
-			$prefixe = $p;
444
-		}
445
-	}
446
-
447
-	// enlever les autres espaces non evacues par tri_protege_champ
448
-	$champ = preg_replace(',\s,', '', $champ);
449
-
450
-	if (is_array($from)) {
451
-		$trouver_table = charger_fonction('trouver_table', 'base');
452
-		foreach ($from as $idt => $table_sql) {
453
-			if (
454
-				$desc = $trouver_table($table_sql)
455
-				and isset($desc['field'][$champ])
456
-			) {
457
-				$champ = "$idt.$champ";
458
-				break;
459
-			}
460
-		}
461
-	}
462
-	switch ($prefixe) {
463
-		case 'num ':
464
-			return "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}, 0+$champ{$senstri}";
465
-		case 'sinum ':
466
-			return "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}";
467
-		default:
468
-			return $champ . $senstri;
469
-	}
433
+    if (strncmp($t, 'multi ', 6) == 0) {
434
+        return 'multi';
435
+    }
436
+
437
+    $champ = $t;
438
+
439
+    $prefixe = '';
440
+    foreach (['num ', 'sinum '] as $p) {
441
+        if (strpos($t, $p) === 0) {
442
+            $champ = substr($t, strlen($p));
443
+            $prefixe = $p;
444
+        }
445
+    }
446
+
447
+    // enlever les autres espaces non evacues par tri_protege_champ
448
+    $champ = preg_replace(',\s,', '', $champ);
449
+
450
+    if (is_array($from)) {
451
+        $trouver_table = charger_fonction('trouver_table', 'base');
452
+        foreach ($from as $idt => $table_sql) {
453
+            if (
454
+                $desc = $trouver_table($table_sql)
455
+                and isset($desc['field'][$champ])
456
+            ) {
457
+                $champ = "$idt.$champ";
458
+                break;
459
+            }
460
+        }
461
+    }
462
+    switch ($prefixe) {
463
+        case 'num ':
464
+            return "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}, 0+$champ{$senstri}";
465
+        case 'sinum ':
466
+            return "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}";
467
+        default:
468
+            return $champ . $senstri;
469
+    }
470 470
 }
471 471
 
472 472
 /**
@@ -480,18 +480,18 @@  discard block
 block discarded – undo
480 480
  * @return string
481 481
  */
482 482
 function tri_champ_select($t) {
483
-	if (strncmp($t, 'multi ', 6) == 0) {
484
-		$t = substr($t, 6);
485
-		$t = preg_replace(',\s,', '', $t);
486
-		$t = sql_multi($t, $GLOBALS['spip_lang']);
487
-
488
-		return $t;
489
-	}
490
-	if (trim($t) == 'hasard') {
491
-		return 'rand() AS hasard';
492
-	}
493
-
494
-	return "''";
483
+    if (strncmp($t, 'multi ', 6) == 0) {
484
+        $t = substr($t, 6);
485
+        $t = preg_replace(',\s,', '', $t);
486
+        $t = sql_multi($t, $GLOBALS['spip_lang']);
487
+
488
+        return $t;
489
+    }
490
+    if (trim($t) == 'hasard') {
491
+        return 'rand() AS hasard';
492
+    }
493
+
494
+    return "''";
495 495
 }
496 496
 
497 497
 /**
@@ -503,16 +503,16 @@  discard block
 block discarded – undo
503 503
  * @return string
504 504
  */
505 505
 function formate_liste_critere_par_ordre_liste($valeurs, $serveur = '') {
506
-	if (!is_array($valeurs)) {
507
-		return '';
508
-	}
509
-	$f = sql_serveur('quote', $serveur, true);
510
-	if (!is_string($f) or !$f) {
511
-		return '';
512
-	}
513
-	$valeurs = implode(',', array_map($f, array_unique($valeurs)));
514
-
515
-	return $valeurs;
506
+    if (!is_array($valeurs)) {
507
+        return '';
508
+    }
509
+    $f = sql_serveur('quote', $serveur, true);
510
+    if (!is_string($f) or !$f) {
511
+        return '';
512
+    }
513
+    $valeurs = implode(',', array_map($f, array_unique($valeurs)));
514
+
515
+    return $valeurs;
516 516
 }
517 517
 
518 518
 /**
@@ -535,20 +535,20 @@  discard block
 block discarded – undo
535 535
  *     Valeur $defaut sinon.
536 536
  **/
537 537
 function appliquer_filtre_sinon($arg, $filtre, $args, $defaut = '') {
538
-	// Si c'est un filtre d'image, on utilise image_filtrer()
539
-	// Attention : les 2 premiers arguments sont inversés dans ce cas
540
-	if (trouver_filtre_matrice($filtre) and substr($filtre, 0, 6) == 'image_') {
541
-		$args[1] = $args[0];
542
-		$args[0] = $filtre;
543
-		return image_graver(image_filtrer($args));
544
-	}
545
-
546
-	$f = chercher_filtre($filtre);
547
-	if (!$f) {
548
-		return $defaut;
549
-	}
550
-	array_shift($args); // enlever $arg
551
-	array_shift($args); // enlever $filtre
552
-	array_unshift($args, $arg); // remettre $arg
553
-	return call_user_func_array($f, $args);
538
+    // Si c'est un filtre d'image, on utilise image_filtrer()
539
+    // Attention : les 2 premiers arguments sont inversés dans ce cas
540
+    if (trouver_filtre_matrice($filtre) and substr($filtre, 0, 6) == 'image_') {
541
+        $args[1] = $args[0];
542
+        $args[0] = $filtre;
543
+        return image_graver(image_filtrer($args));
544
+    }
545
+
546
+    $f = chercher_filtre($filtre);
547
+    if (!$f) {
548
+        return $defaut;
549
+    }
550
+    array_shift($args); // enlever $arg
551
+    array_shift($args); // enlever $filtre
552
+    array_unshift($args, $arg); // remettre $arg
553
+    return call_user_func_array($f, $args);
554 554
 }
Please login to merge, or discard this patch.
ecrire/public/assembler.php 1 patch
Indentation   +625 added lines, -625 removed lines patch added patch discarded remove patch
@@ -20,178 +20,178 @@  discard block
 block discarded – undo
20 20
  **/
21 21
 
22 22
 if (!defined('_ECRIRE_INC_VERSION')) {
23
-	return;
23
+    return;
24 24
 }
25 25
 
26 26
 // En cas de modification, il faut aussi actualiser la regexp de nettoyer_uri_var() dans inc/utils.php
27 27
 if (!defined('_CONTEXTE_IGNORE_VARIABLES')) {
28
-	define('_CONTEXTE_IGNORE_VARIABLES', '/(^var_|^PHPSESSID$|^fbclid$|^utm_)/');
28
+    define('_CONTEXTE_IGNORE_VARIABLES', '/(^var_|^PHPSESSID$|^fbclid$|^utm_)/');
29 29
 }
30 30
 
31 31
 // https://code.spip.net/@assembler
32 32
 function assembler($fond, $connect = '') {
33 33
 
34
-	// flag_preserver est modifie ici, et utilise en globale
35
-	// use_cache sert a informer le bouton d'admin pr savoir s'il met un *
36
-	// contexte est utilise en globale dans le formulaire d'admin
37
-
38
-	$GLOBALS['contexte'] = calculer_contexte();
39
-	$page = ['contexte_implicite' => calculer_contexte_implicite()];
40
-	$page['contexte_implicite']['cache'] = $fond . preg_replace(
41
-		',\.[a-zA-Z0-9]*$,',
42
-		'',
43
-		preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI'])
44
-	);
45
-	// Cette fonction est utilisee deux fois
46
-	$cacher = charger_fonction('cacher', 'public', true);
47
-	// Les quatre derniers parametres sont modifies par la fonction:
48
-	// emplacement, validite, et, s'il est valide, contenu & age
49
-	if ($cacher) {
50
-		$res = $cacher($GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, $page, $lastmodified);
51
-	} else {
52
-		$GLOBALS['use_cache'] = -1;
53
-	}
54
-	// Si un resultat est retourne, c'est un message d'impossibilite
55
-	if ($res) {
56
-		return ['texte' => $res];
57
-	}
58
-
59
-	if (!$chemin_cache || !$lastmodified) {
60
-		$lastmodified = time();
61
-	}
62
-
63
-	$headers_only = ($_SERVER['REQUEST_METHOD'] == 'HEAD');
64
-	$calculer_page = true;
65
-
66
-	// Pour les pages non-dynamiques (indiquees par #CACHE{duree,cache-client})
67
-	// une perennite valide a meme reponse qu'une requete HEAD (par defaut les
68
-	// pages sont dynamiques)
69
-	if (
70
-		isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
71
-		and (!defined('_VAR_MODE') or !_VAR_MODE)
72
-		and $chemin_cache
73
-		and isset($page['entetes'])
74
-		and isset($page['entetes']['Cache-Control'])
75
-		and strstr($page['entetes']['Cache-Control'], 'max-age=')
76
-		and !strstr($_SERVER['SERVER_SOFTWARE'], 'IIS/')
77
-	) {
78
-		$since = preg_replace(
79
-			'/;.*/',
80
-			'',
81
-			$_SERVER['HTTP_IF_MODIFIED_SINCE']
82
-		);
83
-		$since = str_replace('GMT', '', $since);
84
-		if (trim($since) == gmdate('D, d M Y H:i:s', $lastmodified)) {
85
-			$page['status'] = 304;
86
-			$headers_only = true;
87
-			$calculer_page = false;
88
-		}
89
-	}
90
-
91
-	// Si requete HEAD ou Last-modified compatible, ignorer le texte
92
-	// et pas de content-type (pour contrer le bouton admin de inc-public)
93
-	if (!$calculer_page) {
94
-		$page['texte'] = '';
95
-	} else {
96
-		// si la page est prise dans le cache
97
-		if (!$GLOBALS['use_cache']) {
98
-			// Informer les boutons d'admin du contexte
99
-			// (fourni par urls_decoder_url ci-dessous lors de la mise en cache)
100
-			$GLOBALS['contexte'] = $page['contexte'];
101
-
102
-			// vider les globales url propres qui ne doivent plus etre utilisees en cas
103
-			// d'inversion url => objet
104
-			// plus necessaire si on utilise bien la fonction urls_decoder_url
105
-			#unset($_SERVER['REDIRECT_url_propre']);
106
-			#unset($_ENV['url_propre']);
107
-		} else {
108
-			// Compat ascendante :
109
-			// 1. $contexte est global
110
-			// (a evacuer car urls_decoder_url gere ce probleme ?)
111
-			// et calculer la page
112
-			if (!test_espace_prive()) {
113
-				include_spip('inc/urls');
114
-				list($fond, $GLOBALS['contexte'], $url_redirect) = urls_decoder_url(
115
-					nettoyer_uri(),
116
-					$fond,
117
-					$GLOBALS['contexte'],
118
-					true
119
-				);
120
-			}
121
-			// squelette par defaut
122
-			if (!strlen($fond)) {
123
-				$fond = 'sommaire';
124
-			}
125
-
126
-			// produire la page : peut mettre a jour $lastmodified
127
-			$produire_page = charger_fonction('produire_page', 'public');
128
-			$page = $produire_page(
129
-				$fond,
130
-				$GLOBALS['contexte'],
131
-				$GLOBALS['use_cache'],
132
-				$chemin_cache,
133
-				null,
134
-				$page,
135
-				$lastmodified,
136
-				$connect
137
-			);
138
-			if ($page === '') {
139
-				$erreur = _T(
140
-					'info_erreur_squelette2',
141
-					['fichier' => spip_htmlspecialchars($fond) . '.' . _EXTENSION_SQUELETTES]
142
-				);
143
-				erreur_squelette($erreur);
144
-				// eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
145
-				$page = ['texte' => '', 'erreur' => $erreur];
146
-			}
147
-		}
148
-
149
-		if ($page and $chemin_cache) {
150
-			$page['cache'] = $chemin_cache;
151
-		}
152
-
153
-		auto_content_type($page);
154
-
155
-		$GLOBALS['flag_preserver'] |= headers_sent();
156
-
157
-		// Definir les entetes si ce n'est fait
158
-		if (!$GLOBALS['flag_preserver']) {
159
-			if ($GLOBALS['flag_ob']) {
160
-				// Si la page est vide, produire l'erreur 404 ou message d'erreur pour les inclusions
161
-				if (
162
-					trim($page['texte']) === ''
163
-					and _VAR_MODE != 'debug'
164
-					and !isset($page['entetes']['Location']) // cette page realise une redirection, donc pas d'erreur
165
-				) {
166
-					$GLOBALS['contexte']['fond_erreur'] = $fond;
167
-					$page = message_page_indisponible($page, $GLOBALS['contexte']);
168
-				}
169
-				// pas de cache client en mode 'observation'
170
-				if (defined('_VAR_MODE') and _VAR_MODE) {
171
-					$page['entetes']['Cache-Control'] = 'no-cache,must-revalidate';
172
-					$page['entetes']['Pragma'] = 'no-cache';
173
-				}
174
-			}
175
-		}
176
-	}
177
-
178
-	// Entete Last-Modified:
179
-	// eviter d'etre incoherent en envoyant un lastmodified identique
180
-	// a celui qu'on a refuse d'honorer plus haut (cf. #655)
181
-	if (
182
-		$lastmodified
183
-		and !isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
184
-		and !isset($page['entetes']['Last-Modified'])
185
-	) {
186
-		$page['entetes']['Last-Modified'] = gmdate('D, d M Y H:i:s', $lastmodified) . ' GMT';
187
-	}
188
-
189
-	// fermer la connexion apres les headers si requete HEAD
190
-	if ($headers_only) {
191
-		$page['entetes']['Connection'] = 'close';
192
-	}
193
-
194
-	return $page;
34
+    // flag_preserver est modifie ici, et utilise en globale
35
+    // use_cache sert a informer le bouton d'admin pr savoir s'il met un *
36
+    // contexte est utilise en globale dans le formulaire d'admin
37
+
38
+    $GLOBALS['contexte'] = calculer_contexte();
39
+    $page = ['contexte_implicite' => calculer_contexte_implicite()];
40
+    $page['contexte_implicite']['cache'] = $fond . preg_replace(
41
+        ',\.[a-zA-Z0-9]*$,',
42
+        '',
43
+        preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI'])
44
+    );
45
+    // Cette fonction est utilisee deux fois
46
+    $cacher = charger_fonction('cacher', 'public', true);
47
+    // Les quatre derniers parametres sont modifies par la fonction:
48
+    // emplacement, validite, et, s'il est valide, contenu & age
49
+    if ($cacher) {
50
+        $res = $cacher($GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, $page, $lastmodified);
51
+    } else {
52
+        $GLOBALS['use_cache'] = -1;
53
+    }
54
+    // Si un resultat est retourne, c'est un message d'impossibilite
55
+    if ($res) {
56
+        return ['texte' => $res];
57
+    }
58
+
59
+    if (!$chemin_cache || !$lastmodified) {
60
+        $lastmodified = time();
61
+    }
62
+
63
+    $headers_only = ($_SERVER['REQUEST_METHOD'] == 'HEAD');
64
+    $calculer_page = true;
65
+
66
+    // Pour les pages non-dynamiques (indiquees par #CACHE{duree,cache-client})
67
+    // une perennite valide a meme reponse qu'une requete HEAD (par defaut les
68
+    // pages sont dynamiques)
69
+    if (
70
+        isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
71
+        and (!defined('_VAR_MODE') or !_VAR_MODE)
72
+        and $chemin_cache
73
+        and isset($page['entetes'])
74
+        and isset($page['entetes']['Cache-Control'])
75
+        and strstr($page['entetes']['Cache-Control'], 'max-age=')
76
+        and !strstr($_SERVER['SERVER_SOFTWARE'], 'IIS/')
77
+    ) {
78
+        $since = preg_replace(
79
+            '/;.*/',
80
+            '',
81
+            $_SERVER['HTTP_IF_MODIFIED_SINCE']
82
+        );
83
+        $since = str_replace('GMT', '', $since);
84
+        if (trim($since) == gmdate('D, d M Y H:i:s', $lastmodified)) {
85
+            $page['status'] = 304;
86
+            $headers_only = true;
87
+            $calculer_page = false;
88
+        }
89
+    }
90
+
91
+    // Si requete HEAD ou Last-modified compatible, ignorer le texte
92
+    // et pas de content-type (pour contrer le bouton admin de inc-public)
93
+    if (!$calculer_page) {
94
+        $page['texte'] = '';
95
+    } else {
96
+        // si la page est prise dans le cache
97
+        if (!$GLOBALS['use_cache']) {
98
+            // Informer les boutons d'admin du contexte
99
+            // (fourni par urls_decoder_url ci-dessous lors de la mise en cache)
100
+            $GLOBALS['contexte'] = $page['contexte'];
101
+
102
+            // vider les globales url propres qui ne doivent plus etre utilisees en cas
103
+            // d'inversion url => objet
104
+            // plus necessaire si on utilise bien la fonction urls_decoder_url
105
+            #unset($_SERVER['REDIRECT_url_propre']);
106
+            #unset($_ENV['url_propre']);
107
+        } else {
108
+            // Compat ascendante :
109
+            // 1. $contexte est global
110
+            // (a evacuer car urls_decoder_url gere ce probleme ?)
111
+            // et calculer la page
112
+            if (!test_espace_prive()) {
113
+                include_spip('inc/urls');
114
+                list($fond, $GLOBALS['contexte'], $url_redirect) = urls_decoder_url(
115
+                    nettoyer_uri(),
116
+                    $fond,
117
+                    $GLOBALS['contexte'],
118
+                    true
119
+                );
120
+            }
121
+            // squelette par defaut
122
+            if (!strlen($fond)) {
123
+                $fond = 'sommaire';
124
+            }
125
+
126
+            // produire la page : peut mettre a jour $lastmodified
127
+            $produire_page = charger_fonction('produire_page', 'public');
128
+            $page = $produire_page(
129
+                $fond,
130
+                $GLOBALS['contexte'],
131
+                $GLOBALS['use_cache'],
132
+                $chemin_cache,
133
+                null,
134
+                $page,
135
+                $lastmodified,
136
+                $connect
137
+            );
138
+            if ($page === '') {
139
+                $erreur = _T(
140
+                    'info_erreur_squelette2',
141
+                    ['fichier' => spip_htmlspecialchars($fond) . '.' . _EXTENSION_SQUELETTES]
142
+                );
143
+                erreur_squelette($erreur);
144
+                // eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
145
+                $page = ['texte' => '', 'erreur' => $erreur];
146
+            }
147
+        }
148
+
149
+        if ($page and $chemin_cache) {
150
+            $page['cache'] = $chemin_cache;
151
+        }
152
+
153
+        auto_content_type($page);
154
+
155
+        $GLOBALS['flag_preserver'] |= headers_sent();
156
+
157
+        // Definir les entetes si ce n'est fait
158
+        if (!$GLOBALS['flag_preserver']) {
159
+            if ($GLOBALS['flag_ob']) {
160
+                // Si la page est vide, produire l'erreur 404 ou message d'erreur pour les inclusions
161
+                if (
162
+                    trim($page['texte']) === ''
163
+                    and _VAR_MODE != 'debug'
164
+                    and !isset($page['entetes']['Location']) // cette page realise une redirection, donc pas d'erreur
165
+                ) {
166
+                    $GLOBALS['contexte']['fond_erreur'] = $fond;
167
+                    $page = message_page_indisponible($page, $GLOBALS['contexte']);
168
+                }
169
+                // pas de cache client en mode 'observation'
170
+                if (defined('_VAR_MODE') and _VAR_MODE) {
171
+                    $page['entetes']['Cache-Control'] = 'no-cache,must-revalidate';
172
+                    $page['entetes']['Pragma'] = 'no-cache';
173
+                }
174
+            }
175
+        }
176
+    }
177
+
178
+    // Entete Last-Modified:
179
+    // eviter d'etre incoherent en envoyant un lastmodified identique
180
+    // a celui qu'on a refuse d'honorer plus haut (cf. #655)
181
+    if (
182
+        $lastmodified
183
+        and !isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
184
+        and !isset($page['entetes']['Last-Modified'])
185
+    ) {
186
+        $page['entetes']['Last-Modified'] = gmdate('D, d M Y H:i:s', $lastmodified) . ' GMT';
187
+    }
188
+
189
+    // fermer la connexion apres les headers si requete HEAD
190
+    if ($headers_only) {
191
+        $page['entetes']['Connection'] = 'close';
192
+    }
193
+
194
+    return $page;
195 195
 }
196 196
 
197 197
 /**
@@ -210,19 +210,19 @@  discard block
 block discarded – undo
210 210
  */
211 211
 function calculer_contexte() {
212 212
 
213
-	$contexte = [];
214
-	foreach ($_GET as $var => $val) {
215
-		if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
216
-			$contexte[$var] = $val;
217
-		}
218
-	}
219
-	foreach ($_POST as $var => $val) {
220
-		if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
221
-			$contexte[$var] = $val;
222
-		}
223
-	}
224
-
225
-	return $contexte;
213
+    $contexte = [];
214
+    foreach ($_GET as $var => $val) {
215
+        if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
216
+            $contexte[$var] = $val;
217
+        }
218
+    }
219
+    foreach ($_POST as $var => $val) {
220
+        if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
221
+            $contexte[$var] = $val;
222
+        }
223
+    }
224
+
225
+    return $contexte;
226 226
 }
227 227
 
228 228
 /**
@@ -233,25 +233,25 @@  discard block
 block discarded – undo
233 233
  * @return array
234 234
  */
235 235
 function calculer_contexte_implicite() {
236
-	static $notes = null;
237
-	if (is_null($notes)) {
238
-		$notes = charger_fonction('notes', 'inc', true);
239
-	}
240
-	$contexte_implicite = [
241
-		'squelettes' => $GLOBALS['dossier_squelettes'], // devrait etre 'chemin' => $GLOBALS['path_sig'], ?
242
-		'host' => (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : null),
243
-		'https' => (isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : ''),
244
-		'espace' => test_espace_prive(),
245
-		'marqueur' => (isset($GLOBALS['marqueur']) ? $GLOBALS['marqueur'] : ''),
246
-		'marqueur_skel' => (isset($GLOBALS['marqueur_skel']) ? $GLOBALS['marqueur_skel'] : ''),
247
-		'notes' => $notes ? $notes('', 'contexter_cache') : '',
248
-		'spip_version_code' => $GLOBALS['spip_version_code'],
249
-	];
250
-	if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
251
-		$contexte_implicite['host'] .= '|' . $_SERVER['HTTP_X_FORWARDED_HOST'];
252
-	}
253
-
254
-	return $contexte_implicite;
236
+    static $notes = null;
237
+    if (is_null($notes)) {
238
+        $notes = charger_fonction('notes', 'inc', true);
239
+    }
240
+    $contexte_implicite = [
241
+        'squelettes' => $GLOBALS['dossier_squelettes'], // devrait etre 'chemin' => $GLOBALS['path_sig'], ?
242
+        'host' => (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : null),
243
+        'https' => (isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : ''),
244
+        'espace' => test_espace_prive(),
245
+        'marqueur' => (isset($GLOBALS['marqueur']) ? $GLOBALS['marqueur'] : ''),
246
+        'marqueur_skel' => (isset($GLOBALS['marqueur_skel']) ? $GLOBALS['marqueur_skel'] : ''),
247
+        'notes' => $notes ? $notes('', 'contexter_cache') : '',
248
+        'spip_version_code' => $GLOBALS['spip_version_code'],
249
+    ];
250
+    if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
251
+        $contexte_implicite['host'] .= '|' . $_SERVER['HTTP_X_FORWARDED_HOST'];
252
+    }
253
+
254
+    return $contexte_implicite;
255 255
 }
256 256
 
257 257
 //
@@ -261,52 +261,52 @@  discard block
 block discarded – undo
261 261
 // https://code.spip.net/@auto_content_type
262 262
 function auto_content_type($page) {
263 263
 
264
-	if (!isset($GLOBALS['flag_preserver'])) {
265
-		$GLOBALS['flag_preserver'] = ($page && preg_match(
266
-			'/header\s*\(\s*.content\-type:/isx',
267
-			$page['texte']
268
-		) || (isset($page['entetes']['Content-Type'])));
269
-	}
264
+    if (!isset($GLOBALS['flag_preserver'])) {
265
+        $GLOBALS['flag_preserver'] = ($page && preg_match(
266
+            '/header\s*\(\s*.content\-type:/isx',
267
+            $page['texte']
268
+        ) || (isset($page['entetes']['Content-Type'])));
269
+    }
270 270
 }
271 271
 
272 272
 // https://code.spip.net/@inclure_page
273 273
 function inclure_page($fond, $contexte, $connect = '') {
274
-	static $cacher, $produire_page;
275
-
276
-	// enlever le fond de contexte inclus car sinon il prend la main
277
-	// dans les sous inclusions -> boucle infinie d'inclusion identique
278
-	// (cette precaution n'est probablement plus utile)
279
-	unset($contexte['fond']);
280
-	$page = ['contexte_implicite' => calculer_contexte_implicite()];
281
-	$page['contexte_implicite']['cache'] = $fond;
282
-	if (is_null($cacher)) {
283
-		$cacher = charger_fonction('cacher', 'public', true);
284
-	}
285
-	// Les quatre derniers parametres sont modifies par la fonction:
286
-	// emplacement, validite, et, s'il est valide, contenu & age
287
-	if ($cacher) {
288
-		$res = $cacher($contexte, $use_cache, $chemin_cache, $page, $lastinclude);
289
-	} else {
290
-		$use_cache = -1;
291
-	}
292
-	// $res = message d'erreur : on sort de la
293
-	if ($res) {
294
-		return ['texte' => $res];
295
-	}
296
-
297
-	// Si use_cache ne vaut pas 0, la page doit etre calculee
298
-	// produire la page : peut mettre a jour $lastinclude
299
-	// le contexte_cache envoye a cacher() a ete conserve et est passe a produire
300
-	if ($use_cache) {
301
-		if (is_null($produire_page)) {
302
-			$produire_page = charger_fonction('produire_page', 'public');
303
-		}
304
-		$page = $produire_page($fond, $contexte, $use_cache, $chemin_cache, $contexte, $page, $lastinclude, $connect);
305
-	}
306
-	// dans tous les cas, mettre a jour $GLOBALS['lastmodified']
307
-	$GLOBALS['lastmodified'] = max((isset($GLOBALS['lastmodified']) ? $GLOBALS['lastmodified'] : 0), $lastinclude);
308
-
309
-	return $page;
274
+    static $cacher, $produire_page;
275
+
276
+    // enlever le fond de contexte inclus car sinon il prend la main
277
+    // dans les sous inclusions -> boucle infinie d'inclusion identique
278
+    // (cette precaution n'est probablement plus utile)
279
+    unset($contexte['fond']);
280
+    $page = ['contexte_implicite' => calculer_contexte_implicite()];
281
+    $page['contexte_implicite']['cache'] = $fond;
282
+    if (is_null($cacher)) {
283
+        $cacher = charger_fonction('cacher', 'public', true);
284
+    }
285
+    // Les quatre derniers parametres sont modifies par la fonction:
286
+    // emplacement, validite, et, s'il est valide, contenu & age
287
+    if ($cacher) {
288
+        $res = $cacher($contexte, $use_cache, $chemin_cache, $page, $lastinclude);
289
+    } else {
290
+        $use_cache = -1;
291
+    }
292
+    // $res = message d'erreur : on sort de la
293
+    if ($res) {
294
+        return ['texte' => $res];
295
+    }
296
+
297
+    // Si use_cache ne vaut pas 0, la page doit etre calculee
298
+    // produire la page : peut mettre a jour $lastinclude
299
+    // le contexte_cache envoye a cacher() a ete conserve et est passe a produire
300
+    if ($use_cache) {
301
+        if (is_null($produire_page)) {
302
+            $produire_page = charger_fonction('produire_page', 'public');
303
+        }
304
+        $page = $produire_page($fond, $contexte, $use_cache, $chemin_cache, $contexte, $page, $lastinclude, $connect);
305
+    }
306
+    // dans tous les cas, mettre a jour $GLOBALS['lastmodified']
307
+    $GLOBALS['lastmodified'] = max((isset($GLOBALS['lastmodified']) ? $GLOBALS['lastmodified'] : 0), $lastinclude);
308
+
309
+    return $page;
310 310
 }
311 311
 
312 312
 /**
@@ -324,41 +324,41 @@  discard block
 block discarded – undo
324 324
  * @return array
325 325
  */
326 326
 function public_produire_page_dist(
327
-	$fond,
328
-	$contexte,
329
-	$use_cache,
330
-	$chemin_cache,
331
-	$contexte_cache,
332
-	&$page,
333
-	&$lastinclude,
334
-	$connect = ''
327
+    $fond,
328
+    $contexte,
329
+    $use_cache,
330
+    $chemin_cache,
331
+    $contexte_cache,
332
+    &$page,
333
+    &$lastinclude,
334
+    $connect = ''
335 335
 ) {
336
-	static $parametrer, $cacher;
337
-	if (!$parametrer) {
338
-		$parametrer = charger_fonction('parametrer', 'public');
339
-	}
340
-	$page = $parametrer($fond, $contexte, $chemin_cache, $connect);
341
-	// et on l'enregistre sur le disque
342
-	if (
343
-		$chemin_cache
344
-		and $use_cache > -1
345
-		and is_array($page)
346
-		and count($page)
347
-		and isset($page['entetes']['X-Spip-Cache'])
348
-		and $page['entetes']['X-Spip-Cache'] > 0
349
-	) {
350
-		if (is_null($cacher)) {
351
-			$cacher = charger_fonction('cacher', 'public', true);
352
-		}
353
-		$lastinclude = time();
354
-		if ($cacher) {
355
-			$cacher($contexte_cache, $use_cache, $chemin_cache, $page, $lastinclude);
356
-		} else {
357
-			$use_cache = -1;
358
-		}
359
-	}
360
-
361
-	return $page;
336
+    static $parametrer, $cacher;
337
+    if (!$parametrer) {
338
+        $parametrer = charger_fonction('parametrer', 'public');
339
+    }
340
+    $page = $parametrer($fond, $contexte, $chemin_cache, $connect);
341
+    // et on l'enregistre sur le disque
342
+    if (
343
+        $chemin_cache
344
+        and $use_cache > -1
345
+        and is_array($page)
346
+        and count($page)
347
+        and isset($page['entetes']['X-Spip-Cache'])
348
+        and $page['entetes']['X-Spip-Cache'] > 0
349
+    ) {
350
+        if (is_null($cacher)) {
351
+            $cacher = charger_fonction('cacher', 'public', true);
352
+        }
353
+        $lastinclude = time();
354
+        if ($cacher) {
355
+            $cacher($contexte_cache, $use_cache, $chemin_cache, $page, $lastinclude);
356
+        } else {
357
+            $use_cache = -1;
358
+        }
359
+    }
360
+
361
+    return $page;
362 362
 }
363 363
 
364 364
 // Fonction inseree par le compilateur dans le code compile.
@@ -372,14 +372,14 @@  discard block
 block discarded – undo
372 372
 // 4: langue
373 373
 
374 374
 function inserer_balise_dynamique($contexte_exec, $contexte_compil) {
375
-	arguments_balise_dyn_depuis_modele(null, 'reset');
376
-
377
-	if (!is_array($contexte_exec)) {
378
-		echo $contexte_exec;
379
-	} // message d'erreur etc
380
-	else {
381
-		inclure_balise_dynamique($contexte_exec, true, $contexte_compil);
382
-	}
375
+    arguments_balise_dyn_depuis_modele(null, 'reset');
376
+
377
+    if (!is_array($contexte_exec)) {
378
+        echo $contexte_exec;
379
+    } // message d'erreur etc
380
+    else {
381
+        inclure_balise_dynamique($contexte_exec, true, $contexte_compil);
382
+    }
383 383
 }
384 384
 
385 385
 /**
@@ -394,100 +394,100 @@  discard block
 block discarded – undo
394 394
  * @return string
395 395
  */
396 396
 function inclure_balise_dynamique($texte, $echo = true, $contexte_compil = []) {
397
-	if (is_array($texte)) {
398
-		list($fond, $delainc, $contexte_inclus) = $texte;
399
-
400
-		// delais a l'ancienne, c'est pratiquement mort
401
-		$d = isset($GLOBALS['delais']) ? $GLOBALS['delais'] : null;
402
-		$GLOBALS['delais'] = $delainc;
403
-
404
-		$page = recuperer_fond(
405
-			$fond,
406
-			$contexte_inclus,
407
-			['trim' => false, 'raw' => true, 'compil' => $contexte_compil]
408
-		);
409
-
410
-		$texte = $page['texte'];
411
-
412
-		$GLOBALS['delais'] = $d;
413
-		// Faire remonter les entetes
414
-		if (is_array($page['entetes'])) {
415
-			// mais pas toutes
416
-			unset($page['entetes']['X-Spip-Cache']);
417
-			unset($page['entetes']['Content-Type']);
418
-			if (isset($GLOBALS['page']) and is_array($GLOBALS['page'])) {
419
-				if (!is_array($GLOBALS['page']['entetes'])) {
420
-					$GLOBALS['page']['entetes'] = [];
421
-				}
422
-				$GLOBALS['page']['entetes'] =
423
-					array_merge($GLOBALS['page']['entetes'], $page['entetes']);
424
-			}
425
-		}
426
-		// _pipelines au pluriel array('nom_pipeline' => $args...) avec une syntaxe permettant plusieurs pipelines
427
-		if (
428
-			isset($page['contexte']['_pipelines'])
429
-			and is_array($page['contexte']['_pipelines'])
430
-			and count($page['contexte']['_pipelines'])
431
-		) {
432
-			foreach ($page['contexte']['_pipelines'] as $pipe => $args) {
433
-				$args['contexte'] = $page['contexte'];
434
-				unset($args['contexte']['_pipelines']); // par precaution, meme si le risque de boucle infinie est a priori nul
435
-				$texte = pipeline(
436
-					$pipe,
437
-					[
438
-						'data' => $texte,
439
-						'args' => $args
440
-					],
441
-					false
442
-				);
443
-			}
444
-		}
445
-	}
446
-
447
-	if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
448
-		// compatibilite : avant on donnait le numero de ligne ou rien.
449
-		$ligne = intval(isset($contexte_compil[3]) ? $contexte_compil[3] : $contexte_compil);
450
-		$GLOBALS['debug_objets']['resultat'][$ligne] = $texte;
451
-	}
452
-	if ($echo) {
453
-		echo $texte;
454
-	} else {
455
-		return $texte;
456
-	}
397
+    if (is_array($texte)) {
398
+        list($fond, $delainc, $contexte_inclus) = $texte;
399
+
400
+        // delais a l'ancienne, c'est pratiquement mort
401
+        $d = isset($GLOBALS['delais']) ? $GLOBALS['delais'] : null;
402
+        $GLOBALS['delais'] = $delainc;
403
+
404
+        $page = recuperer_fond(
405
+            $fond,
406
+            $contexte_inclus,
407
+            ['trim' => false, 'raw' => true, 'compil' => $contexte_compil]
408
+        );
409
+
410
+        $texte = $page['texte'];
411
+
412
+        $GLOBALS['delais'] = $d;
413
+        // Faire remonter les entetes
414
+        if (is_array($page['entetes'])) {
415
+            // mais pas toutes
416
+            unset($page['entetes']['X-Spip-Cache']);
417
+            unset($page['entetes']['Content-Type']);
418
+            if (isset($GLOBALS['page']) and is_array($GLOBALS['page'])) {
419
+                if (!is_array($GLOBALS['page']['entetes'])) {
420
+                    $GLOBALS['page']['entetes'] = [];
421
+                }
422
+                $GLOBALS['page']['entetes'] =
423
+                    array_merge($GLOBALS['page']['entetes'], $page['entetes']);
424
+            }
425
+        }
426
+        // _pipelines au pluriel array('nom_pipeline' => $args...) avec une syntaxe permettant plusieurs pipelines
427
+        if (
428
+            isset($page['contexte']['_pipelines'])
429
+            and is_array($page['contexte']['_pipelines'])
430
+            and count($page['contexte']['_pipelines'])
431
+        ) {
432
+            foreach ($page['contexte']['_pipelines'] as $pipe => $args) {
433
+                $args['contexte'] = $page['contexte'];
434
+                unset($args['contexte']['_pipelines']); // par precaution, meme si le risque de boucle infinie est a priori nul
435
+                $texte = pipeline(
436
+                    $pipe,
437
+                    [
438
+                        'data' => $texte,
439
+                        'args' => $args
440
+                    ],
441
+                    false
442
+                );
443
+            }
444
+        }
445
+    }
446
+
447
+    if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
448
+        // compatibilite : avant on donnait le numero de ligne ou rien.
449
+        $ligne = intval(isset($contexte_compil[3]) ? $contexte_compil[3] : $contexte_compil);
450
+        $GLOBALS['debug_objets']['resultat'][$ligne] = $texte;
451
+    }
452
+    if ($echo) {
453
+        echo $texte;
454
+    } else {
455
+        return $texte;
456
+    }
457 457
 }
458 458
 
459 459
 // https://code.spip.net/@message_page_indisponible
460 460
 function message_page_indisponible($page, $contexte) {
461
-	static $deja = false;
462
-	if ($deja) {
463
-		return 'erreur';
464
-	}
465
-	$codes = [
466
-		'404' => '404 Not Found',
467
-		'503' => '503 Service Unavailable',
468
-	];
469
-
470
-	$contexte['status'] = ($page !== false) ? '404' : '503';
471
-	$contexte['code'] = $codes[$contexte['status']];
472
-	$contexte['fond'] = '404'; // gere les 2 erreurs
473
-	if (!isset($contexte['lang'])) {
474
-		include_spip('inc/lang');
475
-		$contexte['lang'] = $GLOBALS['spip_lang'];
476
-	}
477
-
478
-	$deja = true;
479
-	// passer aux plugins qui peuvent decider d'une page d'erreur plus pertinent
480
-	// ex restriction d'acces => 401
481
-	$contexte = pipeline('page_indisponible', $contexte);
482
-
483
-	// produire la page d'erreur
484
-	$page = inclure_page($contexte['fond'], $contexte);
485
-	if (!$page) {
486
-		$page = inclure_page('404', $contexte);
487
-	}
488
-	$page['status'] = $contexte['status'];
489
-
490
-	return $page;
461
+    static $deja = false;
462
+    if ($deja) {
463
+        return 'erreur';
464
+    }
465
+    $codes = [
466
+        '404' => '404 Not Found',
467
+        '503' => '503 Service Unavailable',
468
+    ];
469
+
470
+    $contexte['status'] = ($page !== false) ? '404' : '503';
471
+    $contexte['code'] = $codes[$contexte['status']];
472
+    $contexte['fond'] = '404'; // gere les 2 erreurs
473
+    if (!isset($contexte['lang'])) {
474
+        include_spip('inc/lang');
475
+        $contexte['lang'] = $GLOBALS['spip_lang'];
476
+    }
477
+
478
+    $deja = true;
479
+    // passer aux plugins qui peuvent decider d'une page d'erreur plus pertinent
480
+    // ex restriction d'acces => 401
481
+    $contexte = pipeline('page_indisponible', $contexte);
482
+
483
+    // produire la page d'erreur
484
+    $page = inclure_page($contexte['fond'], $contexte);
485
+    if (!$page) {
486
+        $page = inclure_page('404', $contexte);
487
+    }
488
+    $page['status'] = $contexte['status'];
489
+
490
+    return $page;
491 491
 }
492 492
 
493 493
 /**
@@ -499,45 +499,45 @@  discard block
 block discarded – undo
499 499
  * @return mixed
500 500
  */
501 501
 function arguments_balise_dyn_depuis_modele($arg, $operation = 'set') {
502
-	static $balise_dyn_appellee_par_modele = null;
503
-	switch ($operation) {
504
-		case 'read':
505
-			return $balise_dyn_appellee_par_modele;
506
-		case 'reset':
507
-			$balise_dyn_appellee_par_modele = null;
508
-			return null;
509
-		case 'set':
510
-		default:
511
-			$balise_dyn_appellee_par_modele = $arg;
512
-			return $arg;
513
-	}
502
+    static $balise_dyn_appellee_par_modele = null;
503
+    switch ($operation) {
504
+        case 'read':
505
+            return $balise_dyn_appellee_par_modele;
506
+        case 'reset':
507
+            $balise_dyn_appellee_par_modele = null;
508
+            return null;
509
+        case 'set':
510
+        default:
511
+            $balise_dyn_appellee_par_modele = $arg;
512
+            return $arg;
513
+    }
514 514
 }
515 515
 
516 516
 // temporairement ici : a mettre dans le futur inc/modeles
517 517
 // creer_contexte_de_modele('left', 'autostart=true', ...) renvoie un array()
518 518
 // https://code.spip.net/@creer_contexte_de_modele
519 519
 function creer_contexte_de_modele($args) {
520
-	$contexte = [];
521
-	foreach ($args as $var => $val) {
522
-		if (is_int($var)) { // argument pas formate
523
-			if (in_array($val, ['left', 'right', 'center'])) {
524
-				$var = 'align';
525
-				$contexte[$var] = $val;
526
-			} else {
527
-				$args = explode('=', $val);
528
-				if (count($args) >= 2) { // Flashvars=arg1=machin&arg2=truc genere plus de deux args
529
-				$contexte[trim($args[0])] = substr($val, strlen($args[0]) + 1);
530
-				} else // notation abregee
531
-				{
532
-					$contexte[trim($val)] = trim($val);
533
-				}
534
-			}
535
-		} else {
536
-			$contexte[$var] = $val;
537
-		}
538
-	}
539
-
540
-	return $contexte;
520
+    $contexte = [];
521
+    foreach ($args as $var => $val) {
522
+        if (is_int($var)) { // argument pas formate
523
+            if (in_array($val, ['left', 'right', 'center'])) {
524
+                $var = 'align';
525
+                $contexte[$var] = $val;
526
+            } else {
527
+                $args = explode('=', $val);
528
+                if (count($args) >= 2) { // Flashvars=arg1=machin&arg2=truc genere plus de deux args
529
+                $contexte[trim($args[0])] = substr($val, strlen($args[0]) + 1);
530
+                } else // notation abregee
531
+                {
532
+                    $contexte[trim($val)] = trim($val);
533
+                }
534
+            }
535
+        } else {
536
+            $contexte[$var] = $val;
537
+        }
538
+    }
539
+
540
+    return $contexte;
541 541
 }
542 542
 
543 543
 /**
@@ -552,42 +552,42 @@  discard block
 block discarded – undo
552 552
  * @return string
553 553
  */
554 554
 function styliser_modele($modele, $id, $contexte = null) {
555
-	static $styliseurs = null;
556
-	if (is_null($styliseurs)) {
557
-		$tables_objet = lister_tables_objets_sql();
558
-		foreach ($tables_objet as $table => $desc) {
559
-			if (
560
-				isset($desc['modeles']) and $desc['modeles']
561
-				and isset($desc['modeles_styliser']) and $desc['modeles_styliser']
562
-				and function_exists($desc['modeles_styliser'])
563
-			) {
564
-				$primary = id_table_objet($table);
565
-				foreach ($desc['modeles'] as $m) {
566
-					$styliseurs[$m] = ['primary' => $primary, 'callback' => $desc['modeles_styliser']];
567
-				}
568
-			}
569
-		}
570
-	}
571
-
572
-	if (isset($styliseurs[$modele])) {
573
-		$styliseur = $styliseurs[$modele]['callback'];
574
-		if (is_null($id) and $contexte) {
575
-			if (isset($contexte['id'])) {
576
-				$id = $contexte['id'];
577
-			} elseif (isset($contexte[$primary])) {
578
-				$id = $contexte[$primary];
579
-			}
580
-		}
581
-		if (is_null($id)) {
582
-			$msg = "modeles/$modele : " . _T('zbug_parametres_inclus_incorrects', ['param' => "id/$primary"]);
583
-			erreur_squelette($msg);
584
-			// on passe id=0 au routeur pour tomber sur le modele par defaut et eviter une seconde erreur sur un modele inexistant
585
-			$id = 0;
586
-		}
587
-		$modele = $styliseur($modele, $id);
588
-	}
589
-
590
-	return $modele;
555
+    static $styliseurs = null;
556
+    if (is_null($styliseurs)) {
557
+        $tables_objet = lister_tables_objets_sql();
558
+        foreach ($tables_objet as $table => $desc) {
559
+            if (
560
+                isset($desc['modeles']) and $desc['modeles']
561
+                and isset($desc['modeles_styliser']) and $desc['modeles_styliser']
562
+                and function_exists($desc['modeles_styliser'])
563
+            ) {
564
+                $primary = id_table_objet($table);
565
+                foreach ($desc['modeles'] as $m) {
566
+                    $styliseurs[$m] = ['primary' => $primary, 'callback' => $desc['modeles_styliser']];
567
+                }
568
+            }
569
+        }
570
+    }
571
+
572
+    if (isset($styliseurs[$modele])) {
573
+        $styliseur = $styliseurs[$modele]['callback'];
574
+        if (is_null($id) and $contexte) {
575
+            if (isset($contexte['id'])) {
576
+                $id = $contexte['id'];
577
+            } elseif (isset($contexte[$primary])) {
578
+                $id = $contexte[$primary];
579
+            }
580
+        }
581
+        if (is_null($id)) {
582
+            $msg = "modeles/$modele : " . _T('zbug_parametres_inclus_incorrects', ['param' => "id/$primary"]);
583
+            erreur_squelette($msg);
584
+            // on passe id=0 au routeur pour tomber sur le modele par defaut et eviter une seconde erreur sur un modele inexistant
585
+            $id = 0;
586
+        }
587
+        $modele = $styliseur($modele, $id);
588
+    }
589
+
590
+    return $modele;
591 591
 }
592 592
 
593 593
 /**
@@ -606,102 +606,102 @@  discard block
 block discarded – undo
606 606
  */
607 607
 function inclure_modele($type, $id, $params, $lien, $connect = '', $env = []) {
608 608
 
609
-	static $compteur;
610
-	if (++$compteur > 10) {
611
-		return '';
612
-	} # ne pas boucler indefiniment
613
-
614
-	$type = strtolower($type);
615
-	$type = styliser_modele($type, $id);
616
-
617
-	$fond = $class = '';
618
-
619
-	$params = array_filter(explode('|', $params));
620
-	if ($params) {
621
-		$soustype = current($params);
622
-		$soustype = strtolower(trim($soustype));
623
-		if (in_array($soustype, ['left', 'right', 'center', 'ajax'])) {
624
-			$soustype = next($params);
625
-			$soustype = strtolower($soustype);
626
-		}
627
-
628
-		if (preg_match(',^[a-z0-9_]+$,', $soustype)) {
629
-			if (!trouve_modele($fond = ($type . '_' . $soustype))) {
630
-				$fond = '';
631
-				$class = $soustype;
632
-			}
633
-			// enlever le sous type des params
634
-			$params = array_diff($params, [$soustype]);
635
-		}
636
-	}
637
-
638
-	// Si ca marche pas en precisant le sous-type, prendre le type
639
-	if (!$fond and !trouve_modele($fond = $type)) {
640
-		spip_log("Modele $type introuvable", _LOG_INFO_IMPORTANTE);
641
-
642
-		return false;
643
-	}
644
-	$fond = 'modeles/' . $fond;
645
-	// Creer le contexte
646
-	$contexte = $env;
647
-	$contexte['dir_racine'] = _DIR_RACINE; # eviter de mixer un cache racine et un cache ecrire (meme si pour l'instant les modeles ne sont pas caches, le resultat etant different il faut que le contexte en tienne compte
648
-
649
-	// Le numero du modele est mis dans l'environnement
650
-	// d'une part sous l'identifiant "id"
651
-	// et d'autre part sous l'identifiant de la cle primaire
652
-	// par la fonction id_table_objet,
653
-	// (<article1> =>> article =>> id_article =>> id_article=1)
654
-	$_id = id_table_objet($type);
655
-	$contexte['id'] = $contexte[$_id] = $id;
656
-
657
-	if (isset($class)) {
658
-		$contexte['class'] = $class;
659
-	}
660
-
661
-	// Si un lien a ete passe en parametre, ex: [<modele1>->url] ou [<modele1|title_du_lien{hreflang}->url]
662
-	if ($lien) {
663
-		# un eventuel guillemet (") sera reechappe par #ENV
664
-		$contexte['lien'] = str_replace('&quot;', '"', $lien['href']);
665
-		$contexte['lien_class'] = $lien['class'];
666
-		$contexte['lien_mime'] = $lien['mime'];
667
-		$contexte['lien_title'] = $lien['title'];
668
-		$contexte['lien_hreflang'] = $lien['hreflang'];
669
-	}
670
-
671
-	// Traiter les parametres
672
-	// par exemple : <img1|center>, <emb12|autostart=true> ou <doc1|lang=en>
673
-	$arg_list = creer_contexte_de_modele($params);
674
-	$contexte['args'] = $arg_list; // on passe la liste des arguments du modeles dans une variable args
675
-	$contexte = array_merge($contexte, $arg_list);
676
-
677
-	// Appliquer le modele avec le contexte
678
-	$retour = recuperer_fond($fond, $contexte, [], $connect);
679
-
680
-	// Regarder si le modele tient compte des liens (il *doit* alors indiquer
681
-	// spip_lien_ok dans les classes de son conteneur de premier niveau ;
682
-	// sinon, s'il y a un lien, on l'ajoute classiquement
683
-	if (
684
-		strstr(
685
-			' ' . ($classes = extraire_attribut($retour, 'class')) . ' ',
686
-			'spip_lien_ok'
687
-		)
688
-	) {
689
-		$retour = inserer_attribut(
690
-			$retour,
691
-			'class',
692
-			trim(str_replace(' spip_lien_ok ', ' ', " $classes "))
693
-		);
694
-	} else {
695
-		if ($lien) {
696
-			$retour = "<a href='" . $lien['href'] . "' class='" . $lien['class'] . "'>" . $retour . '</a>';
697
-		}
698
-	}
699
-
700
-	$compteur--;
701
-
702
-	return (isset($arg_list['ajax']) and $arg_list['ajax'] == 'ajax')
703
-		? encoder_contexte_ajax($contexte, '', $retour)
704
-		: $retour;
609
+    static $compteur;
610
+    if (++$compteur > 10) {
611
+        return '';
612
+    } # ne pas boucler indefiniment
613
+
614
+    $type = strtolower($type);
615
+    $type = styliser_modele($type, $id);
616
+
617
+    $fond = $class = '';
618
+
619
+    $params = array_filter(explode('|', $params));
620
+    if ($params) {
621
+        $soustype = current($params);
622
+        $soustype = strtolower(trim($soustype));
623
+        if (in_array($soustype, ['left', 'right', 'center', 'ajax'])) {
624
+            $soustype = next($params);
625
+            $soustype = strtolower($soustype);
626
+        }
627
+
628
+        if (preg_match(',^[a-z0-9_]+$,', $soustype)) {
629
+            if (!trouve_modele($fond = ($type . '_' . $soustype))) {
630
+                $fond = '';
631
+                $class = $soustype;
632
+            }
633
+            // enlever le sous type des params
634
+            $params = array_diff($params, [$soustype]);
635
+        }
636
+    }
637
+
638
+    // Si ca marche pas en precisant le sous-type, prendre le type
639
+    if (!$fond and !trouve_modele($fond = $type)) {
640
+        spip_log("Modele $type introuvable", _LOG_INFO_IMPORTANTE);
641
+
642
+        return false;
643
+    }
644
+    $fond = 'modeles/' . $fond;
645
+    // Creer le contexte
646
+    $contexte = $env;
647
+    $contexte['dir_racine'] = _DIR_RACINE; # eviter de mixer un cache racine et un cache ecrire (meme si pour l'instant les modeles ne sont pas caches, le resultat etant different il faut que le contexte en tienne compte
648
+
649
+    // Le numero du modele est mis dans l'environnement
650
+    // d'une part sous l'identifiant "id"
651
+    // et d'autre part sous l'identifiant de la cle primaire
652
+    // par la fonction id_table_objet,
653
+    // (<article1> =>> article =>> id_article =>> id_article=1)
654
+    $_id = id_table_objet($type);
655
+    $contexte['id'] = $contexte[$_id] = $id;
656
+
657
+    if (isset($class)) {
658
+        $contexte['class'] = $class;
659
+    }
660
+
661
+    // Si un lien a ete passe en parametre, ex: [<modele1>->url] ou [<modele1|title_du_lien{hreflang}->url]
662
+    if ($lien) {
663
+        # un eventuel guillemet (") sera reechappe par #ENV
664
+        $contexte['lien'] = str_replace('&quot;', '"', $lien['href']);
665
+        $contexte['lien_class'] = $lien['class'];
666
+        $contexte['lien_mime'] = $lien['mime'];
667
+        $contexte['lien_title'] = $lien['title'];
668
+        $contexte['lien_hreflang'] = $lien['hreflang'];
669
+    }
670
+
671
+    // Traiter les parametres
672
+    // par exemple : <img1|center>, <emb12|autostart=true> ou <doc1|lang=en>
673
+    $arg_list = creer_contexte_de_modele($params);
674
+    $contexte['args'] = $arg_list; // on passe la liste des arguments du modeles dans une variable args
675
+    $contexte = array_merge($contexte, $arg_list);
676
+
677
+    // Appliquer le modele avec le contexte
678
+    $retour = recuperer_fond($fond, $contexte, [], $connect);
679
+
680
+    // Regarder si le modele tient compte des liens (il *doit* alors indiquer
681
+    // spip_lien_ok dans les classes de son conteneur de premier niveau ;
682
+    // sinon, s'il y a un lien, on l'ajoute classiquement
683
+    if (
684
+        strstr(
685
+            ' ' . ($classes = extraire_attribut($retour, 'class')) . ' ',
686
+            'spip_lien_ok'
687
+        )
688
+    ) {
689
+        $retour = inserer_attribut(
690
+            $retour,
691
+            'class',
692
+            trim(str_replace(' spip_lien_ok ', ' ', " $classes "))
693
+        );
694
+    } else {
695
+        if ($lien) {
696
+            $retour = "<a href='" . $lien['href'] . "' class='" . $lien['class'] . "'>" . $retour . '</a>';
697
+        }
698
+    }
699
+
700
+    $compteur--;
701
+
702
+    return (isset($arg_list['ajax']) and $arg_list['ajax'] == 'ajax')
703
+        ? encoder_contexte_ajax($contexte, '', $retour)
704
+        : $retour;
705 705
 }
706 706
 
707 707
 // Un inclure_page qui marche aussi pour l'espace prive
@@ -711,99 +711,99 @@  discard block
 block discarded – undo
711 711
 // https://code.spip.net/@evaluer_fond
712 712
 function evaluer_fond($fond, $contexte = [], $connect = null) {
713 713
 
714
-	$page = inclure_page($fond, $contexte, $connect);
715
-
716
-	if (!$page) {
717
-		return $page;
718
-	}
719
-	// eval $page et affecte $res
720
-	include _ROOT_RESTREINT . 'public/evaluer_page.php';
721
-
722
-	// Lever un drapeau (global) si le fond utilise #SESSION
723
-	// a destination de public/parametrer
724
-	// pour remonter vers les inclusions appelantes
725
-	// il faut bien lever ce drapeau apres avoir evalue le fond
726
-	// pour ne pas faire descendre le flag vers les inclusions appelees
727
-	if (
728
-		isset($page['invalideurs'])
729
-		and isset($page['invalideurs']['session'])
730
-	) {
731
-		$GLOBALS['cache_utilise_session'] = $page['invalideurs']['session'];
732
-	}
733
-
734
-	return $page;
714
+    $page = inclure_page($fond, $contexte, $connect);
715
+
716
+    if (!$page) {
717
+        return $page;
718
+    }
719
+    // eval $page et affecte $res
720
+    include _ROOT_RESTREINT . 'public/evaluer_page.php';
721
+
722
+    // Lever un drapeau (global) si le fond utilise #SESSION
723
+    // a destination de public/parametrer
724
+    // pour remonter vers les inclusions appelantes
725
+    // il faut bien lever ce drapeau apres avoir evalue le fond
726
+    // pour ne pas faire descendre le flag vers les inclusions appelees
727
+    if (
728
+        isset($page['invalideurs'])
729
+        and isset($page['invalideurs']['session'])
730
+    ) {
731
+        $GLOBALS['cache_utilise_session'] = $page['invalideurs']['session'];
732
+    }
733
+
734
+    return $page;
735 735
 }
736 736
 
737 737
 
738 738
 // https://code.spip.net/@page_base_href
739 739
 function page_base_href(&$texte) {
740
-	static $set_html_base = null;
741
-	if (is_null($set_html_base)) {
742
-		if (!defined('_SET_HTML_BASE')) {
743
-			// si la profondeur est superieure a 1
744
-			// est que ce n'est pas une url page ni une url action
745
-			// activer par defaut
746
-		$set_html_base = ((
747
-				$GLOBALS['profondeur_url'] >= (_DIR_RESTREINT ? 1 : 2)
748
-				and _request(_SPIP_PAGE) !== 'login'
749
-				and !_request('action')) ? true : false);
750
-		} else {
751
-			$set_html_base = _SET_HTML_BASE;
752
-		}
753
-	}
754
-
755
-	if (
756
-		$set_html_base
757
-		and isset($GLOBALS['html']) and $GLOBALS['html']
758
-		and $GLOBALS['profondeur_url'] > 0
759
-		and ($poshead = strpos($texte, '</head>')) !== false
760
-	) {
761
-		$head = substr($texte, 0, $poshead);
762
-		$insert = false;
763
-		$href_base = false;
764
-		if (strpos($head, '<base') === false) {
765
-			$insert = true;
766
-		} else {
767
-			// si aucun <base ...> n'a de href il faut en inserer un
768
-			// sinon juste re-ecrire les ancres si besoin
769
-			$insert = true;
770
-			include_spip('inc/filtres');
771
-			$bases = extraire_balises($head, 'base');
772
-			foreach ($bases as $base) {
773
-				if ($href_base = extraire_attribut($base, 'href')) {
774
-					$insert = false;
775
-					break;
776
-				}
777
-			}
778
-		}
779
-
780
-		if ($insert) {
781
-			include_spip('inc/filtres_mini');
782
-			// ajouter un base qui reglera tous les liens relatifs
783
-			$href_base = url_absolue('./');
784
-			$base = "\n<base href=\"$href_base\" />";
785
-			if (($pos = strpos($head, '<head>')) !== false) {
786
-				$head = substr_replace($head, $base, $pos + 6, 0);
787
-			} elseif (preg_match(',<head[^>]*>,i', $head, $r)) {
788
-				$head = str_replace($r[0], $r[0] . $base, $head);
789
-			}
790
-			$texte = $head . substr($texte, $poshead);
791
-		}
792
-		if ($href_base) {
793
-			// gerer les ancres
794
-			$base = $_SERVER['REQUEST_URI'];
795
-			// pas de guillemets ni < dans l'URL qu'on insere dans le HTML
796
-			if (strpos($base, "'") or strpos($base, '"') or strpos($base, '<')) {
797
-				$base = str_replace(["'",'"','<'], ['%27','%22','%3C'], $base);
798
-			}
799
-			if (strpos($texte, "href='#") !== false) {
800
-				$texte = str_replace("href='#", "href='$base#", $texte);
801
-			}
802
-			if (strpos($texte, 'href="#') !== false) {
803
-				$texte = str_replace('href="#', "href=\"$base#", $texte);
804
-			}
805
-		}
806
-	}
740
+    static $set_html_base = null;
741
+    if (is_null($set_html_base)) {
742
+        if (!defined('_SET_HTML_BASE')) {
743
+            // si la profondeur est superieure a 1
744
+            // est que ce n'est pas une url page ni une url action
745
+            // activer par defaut
746
+        $set_html_base = ((
747
+                $GLOBALS['profondeur_url'] >= (_DIR_RESTREINT ? 1 : 2)
748
+                and _request(_SPIP_PAGE) !== 'login'
749
+                and !_request('action')) ? true : false);
750
+        } else {
751
+            $set_html_base = _SET_HTML_BASE;
752
+        }
753
+    }
754
+
755
+    if (
756
+        $set_html_base
757
+        and isset($GLOBALS['html']) and $GLOBALS['html']
758
+        and $GLOBALS['profondeur_url'] > 0
759
+        and ($poshead = strpos($texte, '</head>')) !== false
760
+    ) {
761
+        $head = substr($texte, 0, $poshead);
762
+        $insert = false;
763
+        $href_base = false;
764
+        if (strpos($head, '<base') === false) {
765
+            $insert = true;
766
+        } else {
767
+            // si aucun <base ...> n'a de href il faut en inserer un
768
+            // sinon juste re-ecrire les ancres si besoin
769
+            $insert = true;
770
+            include_spip('inc/filtres');
771
+            $bases = extraire_balises($head, 'base');
772
+            foreach ($bases as $base) {
773
+                if ($href_base = extraire_attribut($base, 'href')) {
774
+                    $insert = false;
775
+                    break;
776
+                }
777
+            }
778
+        }
779
+
780
+        if ($insert) {
781
+            include_spip('inc/filtres_mini');
782
+            // ajouter un base qui reglera tous les liens relatifs
783
+            $href_base = url_absolue('./');
784
+            $base = "\n<base href=\"$href_base\" />";
785
+            if (($pos = strpos($head, '<head>')) !== false) {
786
+                $head = substr_replace($head, $base, $pos + 6, 0);
787
+            } elseif (preg_match(',<head[^>]*>,i', $head, $r)) {
788
+                $head = str_replace($r[0], $r[0] . $base, $head);
789
+            }
790
+            $texte = $head . substr($texte, $poshead);
791
+        }
792
+        if ($href_base) {
793
+            // gerer les ancres
794
+            $base = $_SERVER['REQUEST_URI'];
795
+            // pas de guillemets ni < dans l'URL qu'on insere dans le HTML
796
+            if (strpos($base, "'") or strpos($base, '"') or strpos($base, '<')) {
797
+                $base = str_replace(["'",'"','<'], ['%27','%22','%3C'], $base);
798
+            }
799
+            if (strpos($texte, "href='#") !== false) {
800
+                $texte = str_replace("href='#", "href='$base#", $texte);
801
+            }
802
+            if (strpos($texte, 'href="#') !== false) {
803
+                $texte = str_replace('href="#', "href=\"$base#", $texte);
804
+            }
805
+        }
806
+    }
807 807
 }
808 808
 
809 809
 
@@ -811,7 +811,7 @@  discard block
 block discarded – undo
811 811
 // et demarrent par X-Spip-...
812 812
 // https://code.spip.net/@envoyer_entetes
813 813
 function envoyer_entetes($entetes) {
814
-	foreach ($entetes as $k => $v) { #	if (strncmp($k, 'X-Spip-', 7))
815
-	@header(strlen($v) ? "$k: $v" : $k);
816
-	}
814
+    foreach ($entetes as $k => $v) { #	if (strncmp($k, 'X-Spip-', 7))
815
+    @header(strlen($v) ? "$k: $v" : $k);
816
+    }
817 817
 }
Please login to merge, or discard this patch.
ecrire/public/cacher.php 1 patch
Indentation   +319 added lines, -319 removed lines patch added patch discarded remove patch
@@ -11,7 +11,7 @@  discard block
 block discarded – undo
11 11
 \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
16 16
 
17 17
 /**
@@ -27,9 +27,9 @@  discard block
 block discarded – undo
27 27
  * @return string
28 28
  */
29 29
 function generer_nom_fichier_cache($contexte, $page) {
30
-	$u = md5(var_export([$contexte, $page], true));
30
+    $u = md5(var_export([$contexte, $page], true));
31 31
 
32
-	return $u . '.cache';
32
+    return $u . '.cache';
33 33
 }
34 34
 
35 35
 /**
@@ -45,26 +45,26 @@  discard block
 block discarded – undo
45 45
  * @return string
46 46
  */
47 47
 function cache_chemin_fichier($nom_cache, $ecrire = false) {
48
-	static $l1, $l2;
49
-	if (is_null($l1)) {
50
-		$length = (defined('_CACHE_PROFONDEUR_STOCKAGE') ? min(8, max(_CACHE_PROFONDEUR_STOCKAGE, 2)) : 4);
51
-		$l1 = intval(floor($length / 2));
52
-		$l2 = $length - $l1;
53
-	}
54
-	$d = substr($nom_cache, 0, $l1);
55
-	$u = substr($nom_cache, $l1, $l2);
56
-
57
-	if ($ecrire) {
58
-		$rep = sous_repertoire(_DIR_CACHE, '', false, true);
59
-		$rep = sous_repertoire($rep, 'calcul/', false, true);
60
-		$rep = sous_repertoire($rep, $d, false, true);
61
-	}
62
-	else {
63
-		// en lecture on essaye pa de creer les repertoires, on va au plus vite
64
-		$rep = _DIR_CACHE . "$d/";
65
-	}
66
-
67
-	return $rep . $u . '.cache';
48
+    static $l1, $l2;
49
+    if (is_null($l1)) {
50
+        $length = (defined('_CACHE_PROFONDEUR_STOCKAGE') ? min(8, max(_CACHE_PROFONDEUR_STOCKAGE, 2)) : 4);
51
+        $l1 = intval(floor($length / 2));
52
+        $l2 = $length - $l1;
53
+    }
54
+    $d = substr($nom_cache, 0, $l1);
55
+    $u = substr($nom_cache, $l1, $l2);
56
+
57
+    if ($ecrire) {
58
+        $rep = sous_repertoire(_DIR_CACHE, '', false, true);
59
+        $rep = sous_repertoire($rep, 'calcul/', false, true);
60
+        $rep = sous_repertoire($rep, $d, false, true);
61
+    }
62
+    else {
63
+        // en lecture on essaye pa de creer les repertoires, on va au plus vite
64
+        $rep = _DIR_CACHE . "$d/";
65
+    }
66
+
67
+    return $rep . $u . '.cache';
68 68
 }
69 69
 
70 70
 /**
@@ -75,7 +75,7 @@  discard block
 block discarded – undo
75 75
  * @return bool
76 76
  */
77 77
 function ecrire_cache($nom_cache, $valeur) {
78
-	return ecrire_fichier(cache_chemin_fichier($nom_cache, true), serialize(['nom_cache' => $nom_cache, 'valeur' => $valeur]));
78
+    return ecrire_fichier(cache_chemin_fichier($nom_cache, true), serialize(['nom_cache' => $nom_cache, 'valeur' => $valeur]));
79 79
 }
80 80
 
81 81
 /**
@@ -85,37 +85,37 @@  discard block
 block discarded – undo
85 85
  * @return mixed
86 86
  */
87 87
 function lire_cache($nom_cache) {
88
-	if (
89
-		file_exists($f = cache_chemin_fichier($nom_cache))
90
-		and lire_fichier($f, $tmp)
91
-		and $tmp = unserialize($tmp)
92
-		and $tmp['nom_cache'] == $nom_cache
93
-		and isset($tmp['valeur'])
94
-	) {
95
-		return $tmp['valeur'];
96
-	}
97
-
98
-	return false;
88
+    if (
89
+        file_exists($f = cache_chemin_fichier($nom_cache))
90
+        and lire_fichier($f, $tmp)
91
+        and $tmp = unserialize($tmp)
92
+        and $tmp['nom_cache'] == $nom_cache
93
+        and isset($tmp['valeur'])
94
+    ) {
95
+        return $tmp['valeur'];
96
+    }
97
+
98
+    return false;
99 99
 }
100 100
 
101 101
 // Parano : on signe le cache, afin d'interdire un hack d'injection
102 102
 // dans notre memcache
103 103
 function cache_signature(&$page) {
104
-	if (!isset($GLOBALS['meta']['cache_signature'])) {
105
-		include_spip('inc/acces');
106
-		include_spip('auth/sha256.inc');
107
-		ecrire_meta(
108
-			'cache_signature',
109
-			spip_sha256(
110
-				$_SERVER['DOCUMENT_ROOT']
111
-				. (isset($_SERVER['SERVER_SIGNATURE']) ? $_SERVER['SERVER_SIGNATURE'] : '')
112
-				. creer_uniqid()
113
-			),
114
-			'non'
115
-		);
116
-	}
117
-
118
-	return crc32($GLOBALS['meta']['cache_signature'] . $page['texte']);
104
+    if (!isset($GLOBALS['meta']['cache_signature'])) {
105
+        include_spip('inc/acces');
106
+        include_spip('auth/sha256.inc');
107
+        ecrire_meta(
108
+            'cache_signature',
109
+            spip_sha256(
110
+                $_SERVER['DOCUMENT_ROOT']
111
+                . (isset($_SERVER['SERVER_SIGNATURE']) ? $_SERVER['SERVER_SIGNATURE'] : '')
112
+                . creer_uniqid()
113
+            ),
114
+            'non'
115
+        );
116
+    }
117
+
118
+    return crc32($GLOBALS['meta']['cache_signature'] . $page['texte']);
119 119
 }
120 120
 
121 121
 /**
@@ -129,14 +129,14 @@  discard block
 block discarded – undo
129 129
  * @return array
130 130
  */
131 131
 function gzip_page($page) {
132
-	if (function_exists('gzcompress') and strlen($page['texte']) > 16 * 1024) {
133
-		$page['gz'] = true;
134
-		$page['texte'] = gzcompress($page['texte']);
135
-	} else {
136
-		$page['gz'] = false;
137
-	}
138
-
139
-	return $page;
132
+    if (function_exists('gzcompress') and strlen($page['texte']) > 16 * 1024) {
133
+        $page['gz'] = true;
134
+        $page['texte'] = gzcompress($page['texte']);
135
+    } else {
136
+        $page['gz'] = false;
137
+    }
138
+
139
+    return $page;
140 140
 }
141 141
 
142 142
 /**
@@ -151,10 +151,10 @@  discard block
 block discarded – undo
151 151
  * @return void
152 152
  */
153 153
 function gunzip_page(&$page) {
154
-	if ($page['gz']) {
155
-		$page['texte'] = gzuncompress($page['texte']);
156
-		$page['gz'] = false; // ne pas gzuncompress deux fois une meme page
157
-	}
154
+    if ($page['gz']) {
155
+        $page['texte'] = gzuncompress($page['texte']);
156
+        $page['gz'] = false; // ne pas gzuncompress deux fois une meme page
157
+    }
158 158
 }
159 159
 
160 160
 /**
@@ -170,72 +170,72 @@  discard block
 block discarded – undo
170 170
  */
171 171
 /// https://code.spip.net/@cache_valide
172 172
 function cache_valide(&$page, $date) {
173
-	$now = $_SERVER['REQUEST_TIME'];
174
-
175
-	// Apparition d'un nouvel article post-date ?
176
-	if (
177
-		isset($GLOBALS['meta']['post_dates'])
178
-		and $GLOBALS['meta']['post_dates'] == 'non'
179
-		and isset($GLOBALS['meta']['date_prochain_postdate'])
180
-		and $now > $GLOBALS['meta']['date_prochain_postdate']
181
-	) {
182
-		spip_log('Un article post-date invalide le cache');
183
-		include_spip('inc/rubriques');
184
-		calculer_prochain_postdate(true);
185
-	}
186
-
187
-	if (defined('_VAR_NOCACHE') and _VAR_NOCACHE) {
188
-		return -1;
189
-	}
190
-	if (isset($GLOBALS['meta']['cache_inhib']) and $_SERVER['REQUEST_TIME'] < $GLOBALS['meta']['cache_inhib']) {
191
-		return -1;
192
-	}
193
-	if (defined('_NO_CACHE')) {
194
-		return (_NO_CACHE == 0 and !isset($page['texte'])) ? 1 : _NO_CACHE;
195
-	}
196
-
197
-	// pas de cache ? on le met a jour, sauf pour les bots (on leur calcule la page sans mise en cache)
198
-	if (!$page or !isset($page['texte']) or !isset($page['entetes']['X-Spip-Cache'])) {
199
-		return _IS_BOT ? -1 : 1;
200
-	}
201
-
202
-	// controle de la signature
203
-	if ($page['sig'] !== cache_signature($page)) {
204
-		return _IS_BOT ? -1 : 1;
205
-	}
206
-
207
-	// #CACHE{n,statique} => on n'invalide pas avec derniere_modif
208
-	// cf. ecrire/public/balises.php, balise_CACHE_dist()
209
-	if (!isset($page['entetes']['X-Spip-Statique']) or $page['entetes']['X-Spip-Statique'] !== 'oui') {
210
-		// Cache invalide par la meta 'derniere_modif'
211
-		// sauf pour les bots, qui utilisent toujours le cache
212
-		if (
213
-			!_IS_BOT
214
-			and $GLOBALS['derniere_modif_invalide']
215
-			and isset($GLOBALS['meta']['derniere_modif'])
216
-			and $date < $GLOBALS['meta']['derniere_modif']
217
-		) {
218
-			return 1;
219
-		}
220
-	}
221
-
222
-	// Sinon comparer l'age du fichier a sa duree de cache
223
-	$duree = intval($page['entetes']['X-Spip-Cache']);
224
-	$cache_mark = (isset($GLOBALS['meta']['cache_mark']) ? $GLOBALS['meta']['cache_mark'] : 0);
225
-	if ($duree == 0) {  #CACHE{0}
226
-	return -1;
227
-	} // sauf pour les bots, qui utilisent toujours le cache
228
-	else {
229
-		if (
230
-			(!_IS_BOT and $date + $duree < $now)
231
-			# le cache est anterieur a la derniere purge : l'ignorer, meme pour les bots
232
-			or $date < $cache_mark
233
-		) {
234
-			return _IS_BOT ? -1 : 1;
235
-		} else {
236
-			return 0;
237
-		}
238
-	}
173
+    $now = $_SERVER['REQUEST_TIME'];
174
+
175
+    // Apparition d'un nouvel article post-date ?
176
+    if (
177
+        isset($GLOBALS['meta']['post_dates'])
178
+        and $GLOBALS['meta']['post_dates'] == 'non'
179
+        and isset($GLOBALS['meta']['date_prochain_postdate'])
180
+        and $now > $GLOBALS['meta']['date_prochain_postdate']
181
+    ) {
182
+        spip_log('Un article post-date invalide le cache');
183
+        include_spip('inc/rubriques');
184
+        calculer_prochain_postdate(true);
185
+    }
186
+
187
+    if (defined('_VAR_NOCACHE') and _VAR_NOCACHE) {
188
+        return -1;
189
+    }
190
+    if (isset($GLOBALS['meta']['cache_inhib']) and $_SERVER['REQUEST_TIME'] < $GLOBALS['meta']['cache_inhib']) {
191
+        return -1;
192
+    }
193
+    if (defined('_NO_CACHE')) {
194
+        return (_NO_CACHE == 0 and !isset($page['texte'])) ? 1 : _NO_CACHE;
195
+    }
196
+
197
+    // pas de cache ? on le met a jour, sauf pour les bots (on leur calcule la page sans mise en cache)
198
+    if (!$page or !isset($page['texte']) or !isset($page['entetes']['X-Spip-Cache'])) {
199
+        return _IS_BOT ? -1 : 1;
200
+    }
201
+
202
+    // controle de la signature
203
+    if ($page['sig'] !== cache_signature($page)) {
204
+        return _IS_BOT ? -1 : 1;
205
+    }
206
+
207
+    // #CACHE{n,statique} => on n'invalide pas avec derniere_modif
208
+    // cf. ecrire/public/balises.php, balise_CACHE_dist()
209
+    if (!isset($page['entetes']['X-Spip-Statique']) or $page['entetes']['X-Spip-Statique'] !== 'oui') {
210
+        // Cache invalide par la meta 'derniere_modif'
211
+        // sauf pour les bots, qui utilisent toujours le cache
212
+        if (
213
+            !_IS_BOT
214
+            and $GLOBALS['derniere_modif_invalide']
215
+            and isset($GLOBALS['meta']['derniere_modif'])
216
+            and $date < $GLOBALS['meta']['derniere_modif']
217
+        ) {
218
+            return 1;
219
+        }
220
+    }
221
+
222
+    // Sinon comparer l'age du fichier a sa duree de cache
223
+    $duree = intval($page['entetes']['X-Spip-Cache']);
224
+    $cache_mark = (isset($GLOBALS['meta']['cache_mark']) ? $GLOBALS['meta']['cache_mark'] : 0);
225
+    if ($duree == 0) {  #CACHE{0}
226
+    return -1;
227
+    } // sauf pour les bots, qui utilisent toujours le cache
228
+    else {
229
+        if (
230
+            (!_IS_BOT and $date + $duree < $now)
231
+            # le cache est anterieur a la derniere purge : l'ignorer, meme pour les bots
232
+            or $date < $cache_mark
233
+        ) {
234
+            return _IS_BOT ? -1 : 1;
235
+        } else {
236
+            return 0;
237
+        }
238
+    }
239 239
 }
240 240
 
241 241
 /**
@@ -250,59 +250,59 @@  discard block
 block discarded – undo
250 250
  */
251 251
 function creer_cache(&$page, &$chemin_cache) {
252 252
 
253
-	// Ne rien faire si on est en preview, debug, ou si une erreur
254
-	// grave s'est presentee (compilation du squelette, MySQL, etc)
255
-	// le cas var_nocache ne devrait jamais arriver ici (securite)
256
-	// le cas spip_interdire_cache correspond a une ereur SQL grave non anticipable
257
-	if (
258
-		(defined('_VAR_NOCACHE') and _VAR_NOCACHE)
259
-		or defined('spip_interdire_cache')
260
-	) {
261
-		return;
262
-	}
263
-
264
-	// Si la page c1234 a un invalideur de session 'zz', sauver dans
265
-	// 'tmp/cache/MD5(chemin_cache)_zz'
266
-	if (
267
-		isset($page['invalideurs'])
268
-		and isset($page['invalideurs']['session'])
269
-	) {
270
-		// on verifie que le contenu du chemin cache indique seulement
271
-		// "cache sessionne" ; sa date indique la date de validite
272
-		// des caches sessionnes
273
-		if (!$tmp = lire_cache($chemin_cache)) {
274
-			spip_log('Creation cache sessionne ' . $chemin_cache);
275
-			$tmp = [
276
-				'invalideurs' => ['session' => ''],
277
-				'lastmodified' => $_SERVER['REQUEST_TIME']
278
-			];
279
-			ecrire_cache($chemin_cache, $tmp);
280
-		}
281
-		$chemin_cache = generer_nom_fichier_cache(
282
-			['chemin_cache' => $chemin_cache],
283
-			['session' => $page['invalideurs']['session']]
284
-		);
285
-	}
286
-
287
-	// ajouter la date de production dans le cache lui meme
288
-	// (qui contient deja sa duree de validite)
289
-	$page['lastmodified'] = $_SERVER['REQUEST_TIME'];
290
-
291
-	// compresser le contenu si besoin
292
-	$pagez = gzip_page($page);
293
-
294
-	// signer le contenu
295
-	$pagez['sig'] = cache_signature($pagez);
296
-
297
-	// l'enregistrer, compresse ou non...
298
-	$ok = ecrire_cache($chemin_cache, $pagez);
299
-
300
-	spip_log((_IS_BOT ? 'Bot:' : '') . "Creation du cache $chemin_cache pour "
301
-		. $page['entetes']['X-Spip-Cache'] . ' secondes' . ($ok ? '' : ' (erreur!)'), _LOG_INFO);
302
-
303
-	// Inserer ses invalideurs
304
-	include_spip('inc/invalideur');
305
-	maj_invalideurs($chemin_cache, $page);
253
+    // Ne rien faire si on est en preview, debug, ou si une erreur
254
+    // grave s'est presentee (compilation du squelette, MySQL, etc)
255
+    // le cas var_nocache ne devrait jamais arriver ici (securite)
256
+    // le cas spip_interdire_cache correspond a une ereur SQL grave non anticipable
257
+    if (
258
+        (defined('_VAR_NOCACHE') and _VAR_NOCACHE)
259
+        or defined('spip_interdire_cache')
260
+    ) {
261
+        return;
262
+    }
263
+
264
+    // Si la page c1234 a un invalideur de session 'zz', sauver dans
265
+    // 'tmp/cache/MD5(chemin_cache)_zz'
266
+    if (
267
+        isset($page['invalideurs'])
268
+        and isset($page['invalideurs']['session'])
269
+    ) {
270
+        // on verifie que le contenu du chemin cache indique seulement
271
+        // "cache sessionne" ; sa date indique la date de validite
272
+        // des caches sessionnes
273
+        if (!$tmp = lire_cache($chemin_cache)) {
274
+            spip_log('Creation cache sessionne ' . $chemin_cache);
275
+            $tmp = [
276
+                'invalideurs' => ['session' => ''],
277
+                'lastmodified' => $_SERVER['REQUEST_TIME']
278
+            ];
279
+            ecrire_cache($chemin_cache, $tmp);
280
+        }
281
+        $chemin_cache = generer_nom_fichier_cache(
282
+            ['chemin_cache' => $chemin_cache],
283
+            ['session' => $page['invalideurs']['session']]
284
+        );
285
+    }
286
+
287
+    // ajouter la date de production dans le cache lui meme
288
+    // (qui contient deja sa duree de validite)
289
+    $page['lastmodified'] = $_SERVER['REQUEST_TIME'];
290
+
291
+    // compresser le contenu si besoin
292
+    $pagez = gzip_page($page);
293
+
294
+    // signer le contenu
295
+    $pagez['sig'] = cache_signature($pagez);
296
+
297
+    // l'enregistrer, compresse ou non...
298
+    $ok = ecrire_cache($chemin_cache, $pagez);
299
+
300
+    spip_log((_IS_BOT ? 'Bot:' : '') . "Creation du cache $chemin_cache pour "
301
+        . $page['entetes']['X-Spip-Cache'] . ' secondes' . ($ok ? '' : ' (erreur!)'), _LOG_INFO);
302
+
303
+    // Inserer ses invalideurs
304
+    include_spip('inc/invalideur');
305
+    maj_invalideurs($chemin_cache, $page);
306 306
 }
307 307
 
308 308
 
@@ -317,15 +317,15 @@  discard block
 block discarded – undo
317 317
  * @return void
318 318
  */
319 319
 function nettoyer_petit_cache($prefix, $duree = 300) {
320
-	// determiner le repertoire a purger : 'tmp/CACHE/rech/'
321
-	$dircache = sous_repertoire(_DIR_CACHE, $prefix);
322
-	if (spip_touch($dircache . 'purger_' . $prefix, $duree, true)) {
323
-		foreach (preg_files($dircache, '[.]txt$') as $f) {
324
-			if ($_SERVER['REQUEST_TIME'] - (@file_exists($f) ? @filemtime($f) : 0) > $duree) {
325
-				spip_unlink($f);
326
-			}
327
-		}
328
-	}
320
+    // determiner le repertoire a purger : 'tmp/CACHE/rech/'
321
+    $dircache = sous_repertoire(_DIR_CACHE, $prefix);
322
+    if (spip_touch($dircache . 'purger_' . $prefix, $duree, true)) {
323
+        foreach (preg_files($dircache, '[.]txt$') as $f) {
324
+            if ($_SERVER['REQUEST_TIME'] - (@file_exists($f) ? @filemtime($f) : 0) > $duree) {
325
+                spip_unlink($f);
326
+            }
327
+        }
328
+    }
329 329
 }
330 330
 
331 331
 
@@ -355,133 +355,133 @@  discard block
 block discarded – undo
355 355
  */
356 356
 function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$lastmodified) {
357 357
 
358
-	# fonction de cache minimale : dire "non on ne met rien en cache"
359
-	# $use_cache = -1; return;
360
-
361
-	// Second appel, destine a l'enregistrement du cache sur le disque
362
-	if (isset($chemin_cache)) {
363
-		return creer_cache($page, $chemin_cache);
364
-	}
365
-
366
-	// Toute la suite correspond au premier appel
367
-	$contexte_implicite = $page['contexte_implicite'];
368
-
369
-	// Cas ignorant le cache car completement dynamique
370
-	if (
371
-		(!empty($_SERVER['REQUEST_METHOD']) and $_SERVER['REQUEST_METHOD'] === 'POST')
372
-		or _request('connect')
373
-	) {
374
-		$use_cache = -1;
375
-		$lastmodified = 0;
376
-		$chemin_cache = '';
377
-		$page = [];
378
-
379
-		return;
380
-	}
381
-
382
-	// Controler l'existence d'un cache nous correspondant
383
-	$chemin_cache = generer_nom_fichier_cache($contexte, $page);
384
-	$lastmodified = 0;
385
-
386
-	// charger le cache s'il existe (et si il a bien le bon hash = anticollision)
387
-	if (!$page = lire_cache($chemin_cache)) {
388
-		$page = [];
389
-	}
390
-
391
-	// s'il est sessionne, charger celui correspondant a notre session
392
-	if (
393
-		isset($page['invalideurs'])
394
-		and isset($page['invalideurs']['session'])
395
-	) {
396
-		$chemin_cache_session = generer_nom_fichier_cache(
397
-			['chemin_cache' => $chemin_cache],
398
-			['session' => spip_session()]
399
-		);
400
-		if (
401
-			$page_session = lire_cache($chemin_cache_session)
402
-			and $page_session['lastmodified'] >= $page['lastmodified']
403
-		) {
404
-			$page = $page_session;
405
-		} else {
406
-			$page = [];
407
-		}
408
-	}
409
-
410
-
411
-	// Faut-il effacer des pages invalidees (en particulier ce cache-ci) ?
412
-	if (isset($GLOBALS['meta']['invalider'])) {
413
-		// ne le faire que si la base est disponible
414
-		if (spip_connect()) {
415
-			include_spip('inc/invalideur');
416
-			retire_caches($chemin_cache); # API invalideur inutile
417
-			supprimer_fichier(_DIR_CACHE . $chemin_cache);
418
-			if (isset($chemin_cache_session) and $chemin_cache_session) {
419
-				supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
420
-			}
421
-		}
422
-	}
423
-
424
-	// Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande,
425
-	// on supprime le cache
426
-	if (
427
-		defined('_VAR_MODE') &&
428
-		_VAR_MODE &&
429
-		(isset($_COOKIE['spip_session']) ||
430
-			isset($_COOKIE['spip_admin']) ||
431
-			@file_exists(_ACCESS_FILE_NAME))
432
-	) {
433
-		$page = ['contexte_implicite' => $contexte_implicite]; // ignorer le cache deja lu
434
-		include_spip('inc/invalideur');
435
-		retire_caches($chemin_cache); # API invalideur inutile
436
-		supprimer_fichier(_DIR_CACHE . $chemin_cache);
437
-		if (isset($chemin_cache_session) and $chemin_cache_session) {
438
-			supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
439
-		}
440
-	}
441
-
442
-	// $delais par defaut
443
-	// pour toutes les pages sans #CACHE{} hors modeles/ et espace privé
444
-	// qui sont a cache nul par defaut
445
-	if (!isset($GLOBALS['delais'])) {
446
-		if (!defined('_DUREE_CACHE_DEFAUT')) {
447
-			define('_DUREE_CACHE_DEFAUT', 24 * 3600);
448
-		}
449
-		$GLOBALS['delais'] = _DUREE_CACHE_DEFAUT;
450
-	}
451
-
452
-	// determiner la validite de la page
453
-	if ($page) {
454
-		$use_cache = cache_valide($page, isset($page['lastmodified']) ? $page['lastmodified'] : 0);
455
-		// le contexte implicite n'est pas stocke dans le cache, mais il y a equivalence
456
-		// par le nom du cache. On le reinjecte donc ici pour utilisation eventuelle au calcul
457
-		$page['contexte_implicite'] = $contexte_implicite;
458
-		if (!$use_cache) {
459
-			// $page est un cache utilisable
460
-			gunzip_page($page);
461
-
462
-			return;
463
-		}
464
-	} else {
465
-		$page = ['contexte_implicite' => $contexte_implicite];
466
-		$use_cache = cache_valide($page, 0); // fichier cache absent : provoque le calcul
467
-	}
468
-
469
-	// Si pas valide mais pas de connexion a la base, le garder quand meme
470
-	if (!spip_connect()) {
471
-		if (isset($page['texte'])) {
472
-			gunzip_page($page);
473
-			$use_cache = 0;
474
-		} else {
475
-			spip_log("Erreur base de donnees, impossible utiliser $chemin_cache");
476
-			include_spip('inc/minipres');
477
-
478
-			return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), ['status' => 503]);
479
-		}
480
-	}
481
-
482
-	if ($use_cache < 0) {
483
-		$chemin_cache = '';
484
-	}
485
-
486
-	return;
358
+    # fonction de cache minimale : dire "non on ne met rien en cache"
359
+    # $use_cache = -1; return;
360
+
361
+    // Second appel, destine a l'enregistrement du cache sur le disque
362
+    if (isset($chemin_cache)) {
363
+        return creer_cache($page, $chemin_cache);
364
+    }
365
+
366
+    // Toute la suite correspond au premier appel
367
+    $contexte_implicite = $page['contexte_implicite'];
368
+
369
+    // Cas ignorant le cache car completement dynamique
370
+    if (
371
+        (!empty($_SERVER['REQUEST_METHOD']) and $_SERVER['REQUEST_METHOD'] === 'POST')
372
+        or _request('connect')
373
+    ) {
374
+        $use_cache = -1;
375
+        $lastmodified = 0;
376
+        $chemin_cache = '';
377
+        $page = [];
378
+
379
+        return;
380
+    }
381
+
382
+    // Controler l'existence d'un cache nous correspondant
383
+    $chemin_cache = generer_nom_fichier_cache($contexte, $page);
384
+    $lastmodified = 0;
385
+
386
+    // charger le cache s'il existe (et si il a bien le bon hash = anticollision)
387
+    if (!$page = lire_cache($chemin_cache)) {
388
+        $page = [];
389
+    }
390
+
391
+    // s'il est sessionne, charger celui correspondant a notre session
392
+    if (
393
+        isset($page['invalideurs'])
394
+        and isset($page['invalideurs']['session'])
395
+    ) {
396
+        $chemin_cache_session = generer_nom_fichier_cache(
397
+            ['chemin_cache' => $chemin_cache],
398
+            ['session' => spip_session()]
399
+        );
400
+        if (
401
+            $page_session = lire_cache($chemin_cache_session)
402
+            and $page_session['lastmodified'] >= $page['lastmodified']
403
+        ) {
404
+            $page = $page_session;
405
+        } else {
406
+            $page = [];
407
+        }
408
+    }
409
+
410
+
411
+    // Faut-il effacer des pages invalidees (en particulier ce cache-ci) ?
412
+    if (isset($GLOBALS['meta']['invalider'])) {
413
+        // ne le faire que si la base est disponible
414
+        if (spip_connect()) {
415
+            include_spip('inc/invalideur');
416
+            retire_caches($chemin_cache); # API invalideur inutile
417
+            supprimer_fichier(_DIR_CACHE . $chemin_cache);
418
+            if (isset($chemin_cache_session) and $chemin_cache_session) {
419
+                supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
420
+            }
421
+        }
422
+    }
423
+
424
+    // Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande,
425
+    // on supprime le cache
426
+    if (
427
+        defined('_VAR_MODE') &&
428
+        _VAR_MODE &&
429
+        (isset($_COOKIE['spip_session']) ||
430
+            isset($_COOKIE['spip_admin']) ||
431
+            @file_exists(_ACCESS_FILE_NAME))
432
+    ) {
433
+        $page = ['contexte_implicite' => $contexte_implicite]; // ignorer le cache deja lu
434
+        include_spip('inc/invalideur');
435
+        retire_caches($chemin_cache); # API invalideur inutile
436
+        supprimer_fichier(_DIR_CACHE . $chemin_cache);
437
+        if (isset($chemin_cache_session) and $chemin_cache_session) {
438
+            supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
439
+        }
440
+    }
441
+
442
+    // $delais par defaut
443
+    // pour toutes les pages sans #CACHE{} hors modeles/ et espace privé
444
+    // qui sont a cache nul par defaut
445
+    if (!isset($GLOBALS['delais'])) {
446
+        if (!defined('_DUREE_CACHE_DEFAUT')) {
447
+            define('_DUREE_CACHE_DEFAUT', 24 * 3600);
448
+        }
449
+        $GLOBALS['delais'] = _DUREE_CACHE_DEFAUT;
450
+    }
451
+
452
+    // determiner la validite de la page
453
+    if ($page) {
454
+        $use_cache = cache_valide($page, isset($page['lastmodified']) ? $page['lastmodified'] : 0);
455
+        // le contexte implicite n'est pas stocke dans le cache, mais il y a equivalence
456
+        // par le nom du cache. On le reinjecte donc ici pour utilisation eventuelle au calcul
457
+        $page['contexte_implicite'] = $contexte_implicite;
458
+        if (!$use_cache) {
459
+            // $page est un cache utilisable
460
+            gunzip_page($page);
461
+
462
+            return;
463
+        }
464
+    } else {
465
+        $page = ['contexte_implicite' => $contexte_implicite];
466
+        $use_cache = cache_valide($page, 0); // fichier cache absent : provoque le calcul
467
+    }
468
+
469
+    // Si pas valide mais pas de connexion a la base, le garder quand meme
470
+    if (!spip_connect()) {
471
+        if (isset($page['texte'])) {
472
+            gunzip_page($page);
473
+            $use_cache = 0;
474
+        } else {
475
+            spip_log("Erreur base de donnees, impossible utiliser $chemin_cache");
476
+            include_spip('inc/minipres');
477
+
478
+            return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), ['status' => 503]);
479
+        }
480
+    }
481
+
482
+    if ($use_cache < 0) {
483
+        $chemin_cache = '';
484
+    }
485
+
486
+    return;
487 487
 }
Please login to merge, or discard this patch.
ecrire/public/composer.php 1 patch
Indentation   +757 added lines, -757 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,233 +43,233 @@  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
-			eval("return true; $f ;");
96
-		} catch (\ParseError $e) {
97
-			// Code syntaxiquement faux (critere etc mal programme')
98
-			$msg = _T('zbug_erreur_compilation') . ' | Line ' . $e->getLine() . ' : ' . $e->getMessage();
99
-			erreur_squelette($msg, $boucle);
100
-			// continuer pour trouver d'autres fautes eventuelles
101
-			// mais prevenir que c'est mort
102
-			$nom = '';
103
-		}
104
-
105
-		// Contexte de compil inutile a present
106
-		// (mais la derniere valeur de $boucle est utilisee ci-dessous)
107
-		$skel_code[$id] = $f;
108
-	}
109
-
110
-	$code = '';
111
-	if ($nom) {
112
-		// Si le code est bon, concatener et mettre en cache
113
-		if (function_exists($nom)) {
114
-			$code = squelette_traduit($skel, $source, $phpfile, $skel_code);
115
-		} else {
116
-			// code semantiquement faux: bug du compilateur
117
-			// $boucle est en fait ici la fct principale du squelette
118
-			$msg = _T('zbug_erreur_compilation');
119
-			erreur_squelette($msg, $boucle);
120
-			$nom = '';
121
-		}
122
-	}
123
-
124
-	if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
125
-		// Tracer ce qui vient d'etre compile
126
-		$GLOBALS['debug_objets']['code'][$nom . 'tout'] = $code;
127
-
128
-		// si c'est ce que demande le debusqueur, lui passer la main
129
-		if (
130
-			$GLOBALS['debug_objets']['sourcefile']
131
-			and (_request('var_mode_objet') == $nom)
132
-			and (_request('var_mode_affiche') == 'code')
133
-		) {
134
-			erreur_squelette();
135
-		}
136
-	}
137
-
138
-	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
+            eval("return true; $f ;");
96
+        } catch (\ParseError $e) {
97
+            // Code syntaxiquement faux (critere etc mal programme')
98
+            $msg = _T('zbug_erreur_compilation') . ' | Line ' . $e->getLine() . ' : ' . $e->getMessage();
99
+            erreur_squelette($msg, $boucle);
100
+            // continuer pour trouver d'autres fautes eventuelles
101
+            // mais prevenir que c'est mort
102
+            $nom = '';
103
+        }
104
+
105
+        // Contexte de compil inutile a present
106
+        // (mais la derniere valeur de $boucle est utilisee ci-dessous)
107
+        $skel_code[$id] = $f;
108
+    }
109
+
110
+    $code = '';
111
+    if ($nom) {
112
+        // Si le code est bon, concatener et mettre en cache
113
+        if (function_exists($nom)) {
114
+            $code = squelette_traduit($skel, $source, $phpfile, $skel_code);
115
+        } else {
116
+            // code semantiquement faux: bug du compilateur
117
+            // $boucle est en fait ici la fct principale du squelette
118
+            $msg = _T('zbug_erreur_compilation');
119
+            erreur_squelette($msg, $boucle);
120
+            $nom = '';
121
+        }
122
+    }
123
+
124
+    if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
125
+        // Tracer ce qui vient d'etre compile
126
+        $GLOBALS['debug_objets']['code'][$nom . 'tout'] = $code;
127
+
128
+        // si c'est ce que demande le debusqueur, lui passer la main
129
+        if (
130
+            $GLOBALS['debug_objets']['sourcefile']
131
+            and (_request('var_mode_objet') == $nom)
132
+            and (_request('var_mode_affiche') == 'code')
133
+        ) {
134
+            erreur_squelette();
135
+        }
136
+    }
137
+
138
+    return $nom ? $nom : false;
139 139
 }
140 140
 
141 141
 function squelette_traduit($squelette, $sourcefile, $phpfile, $boucles) {
142 142
 
143
-	// Le dernier index est '' (fonction principale)
144
-	$noms = substr(join(', ', array_keys($boucles)), 0, -2);
145
-	if (CODE_COMMENTE) {
146
-		$code = "
143
+    // Le dernier index est '' (fonction principale)
144
+    $noms = substr(join(', ', array_keys($boucles)), 0, -2);
145
+    if (CODE_COMMENTE) {
146
+        $code = "
147 147
 /*
148 148
  * Squelette : $sourcefile
149 149
  * Date :      " . gmdate('D, d M Y H:i:s', @filemtime($sourcefile)) . ' GMT
150 150
  * Compile :   ' . gmdate('D, d M Y H:i:s', time()) . ' GMT
151 151
  * ' . (!$boucles ? 'Pas de boucle' : ('Boucles :   ' . $noms)) . '
152 152
  */ ';
153
-	}
153
+    }
154 154
 
155
-	$code = '<' . "?php\n" . $code . join('', $boucles) . "\n?" . '>';
156
-	if (!defined('_VAR_NOCACHE') or !_VAR_NOCACHE) {
157
-		ecrire_fichier($phpfile, $code);
158
-	}
155
+    $code = '<' . "?php\n" . $code . join('', $boucles) . "\n?" . '>';
156
+    if (!defined('_VAR_NOCACHE') or !_VAR_NOCACHE) {
157
+        ecrire_fichier($phpfile, $code);
158
+    }
159 159
 
160
-	return $code;
160
+    return $code;
161 161
 }
162 162
 
163 163
 // Le squelette compile est-il trop vieux ?
164 164
 // https://code.spip.net/@squelette_obsolete
165 165
 function squelette_obsolete($skel, $squelette) {
166
-	static $date_change = null;
167
-	// ne verifier la date de mes_fonctions et mes_options qu'une seule fois
168
-	// par hit
169
-	if (is_null($date_change)) {
170
-		if (@file_exists($fonc = 'mes_fonctions.php')) {
171
-			$date_change = @filemtime($fonc);
172
-		} # compatibilite
173
-		if (defined('_FILE_OPTIONS')) {
174
-			$date_change = max($date_change, @filemtime(_FILE_OPTIONS));
175
-		}
176
-	}
177
-
178
-	return (
179
-		(defined('_VAR_MODE') and in_array(_VAR_MODE, ['recalcul', 'preview', 'debug']))
180
-		or !@file_exists($skel)
181
-		or ((@file_exists($squelette) ? @filemtime($squelette) : 0)
182
-			> ($date = @filemtime($skel)))
183
-		or ($date_change > $date)
184
-	);
166
+    static $date_change = null;
167
+    // ne verifier la date de mes_fonctions et mes_options qu'une seule fois
168
+    // par hit
169
+    if (is_null($date_change)) {
170
+        if (@file_exists($fonc = 'mes_fonctions.php')) {
171
+            $date_change = @filemtime($fonc);
172
+        } # compatibilite
173
+        if (defined('_FILE_OPTIONS')) {
174
+            $date_change = max($date_change, @filemtime(_FILE_OPTIONS));
175
+        }
176
+    }
177
+
178
+    return (
179
+        (defined('_VAR_MODE') and in_array(_VAR_MODE, ['recalcul', 'preview', 'debug']))
180
+        or !@file_exists($skel)
181
+        or ((@file_exists($squelette) ? @filemtime($squelette) : 0)
182
+            > ($date = @filemtime($skel)))
183
+        or ($date_change > $date)
184
+    );
185 185
 }
186 186
 
187 187
 // Activer l'invalideur de session
188 188
 // https://code.spip.net/@invalideur_session
189 189
 function invalideur_session(&$Cache, $code = null) {
190
-	$Cache['session'] = spip_session();
190
+    $Cache['session'] = spip_session();
191 191
 
192
-	return $code;
192
+    return $code;
193 193
 }
194 194
 
195 195
 
196 196
 // https://code.spip.net/@analyse_resultat_skel
197 197
 function analyse_resultat_skel($nom, $cache, $corps, $source = '') {
198
-	static $filtres = [];
199
-	$headers = [];
200
-
201
-	// Recupere les < ?php header('Xx: y'); ? > pour $page['headers']
202
-	// note: on essaie d'attrapper aussi certains de ces entetes codes
203
-	// "a la main" dans les squelettes, mais evidemment sans exhaustivite
204
-	if (
205
-		stripos($corps, 'header') !== false
206
-		and preg_match_all(
207
-			'/(<[?]php\s+)@?header\s*\(\s*.([^:\'"]*):?\s*([^)]*)[^)]\s*\)\s*[;]?\s*[?]>/ims',
208
-			$corps,
209
-			$regs,
210
-			PREG_SET_ORDER
211
-		)
212
-	) {
213
-		foreach ($regs as $r) {
214
-			$corps = str_replace($r[0], '', $corps);
215
-			# $j = Content-Type, et pas content-TYPE.
216
-			$j = join('-', array_map('ucwords', explode('-', strtolower($r[2]))));
217
-
218
-			if ($j == 'X-Spip-Filtre' and isset($headers[$j])) {
219
-				$headers[$j] .= '|' . $r[3];
220
-			} else {
221
-				$headers[$j] = $r[3];
222
-			}
223
-		}
224
-	}
225
-	// S'agit-il d'un resultat constant ou contenant du code php
226
-	$process_ins = (
227
-		strpos($corps, '<' . '?') === false
228
-		or
229
-		(strpos($corps, '<' . '?xml') !== false and
230
-			strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false)
231
-	)
232
-		? 'html'
233
-		: 'php';
234
-
235
-	$skel = [
236
-		'squelette' => $nom,
237
-		'source' => $source,
238
-		'process_ins' => $process_ins,
239
-		'invalideurs' => $cache,
240
-		'entetes' => $headers,
241
-		'duree' => isset($headers['X-Spip-Cache']) ? intval($headers['X-Spip-Cache']) : 0
242
-	];
243
-
244
-	// traiter #FILTRE{} et filtres
245
-	if (!isset($filtres[$nom])) {
246
-		$filtres[$nom] = pipeline('declarer_filtres_squelettes', ['args' => $skel, 'data' => []]);
247
-	}
248
-	$filtres_headers = [];
249
-	if (isset($headers['X-Spip-Filtre']) and strlen($headers['X-Spip-Filtre'])) {
250
-		$filtres_headers = array_filter(explode('|', $headers['X-Spip-Filtre']));
251
-		unset($headers['X-Spip-Filtre']);
252
-	}
253
-	if (count($filtres[$nom]) or count($filtres_headers)) {
254
-		include_spip('public/sandbox');
255
-		$corps = sandbox_filtrer_squelette($skel, $corps, $filtres_headers, $filtres[$nom]);
256
-
257
-		if ($process_ins == 'html') {
258
-			$skel['process_ins'] = (
259
-				strpos($corps, '<' . '?') === false
260
-				or
261
-				(strpos($corps, '<' . '?xml') !== false and
262
-					strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false)
263
-			)
264
-				? 'html'
265
-				: 'php';
266
-		}
267
-	}
268
-
269
-	$skel['entetes'] = $headers;
270
-	$skel['texte'] = $corps;
271
-
272
-	return $skel;
198
+    static $filtres = [];
199
+    $headers = [];
200
+
201
+    // Recupere les < ?php header('Xx: y'); ? > pour $page['headers']
202
+    // note: on essaie d'attrapper aussi certains de ces entetes codes
203
+    // "a la main" dans les squelettes, mais evidemment sans exhaustivite
204
+    if (
205
+        stripos($corps, 'header') !== false
206
+        and preg_match_all(
207
+            '/(<[?]php\s+)@?header\s*\(\s*.([^:\'"]*):?\s*([^)]*)[^)]\s*\)\s*[;]?\s*[?]>/ims',
208
+            $corps,
209
+            $regs,
210
+            PREG_SET_ORDER
211
+        )
212
+    ) {
213
+        foreach ($regs as $r) {
214
+            $corps = str_replace($r[0], '', $corps);
215
+            # $j = Content-Type, et pas content-TYPE.
216
+            $j = join('-', array_map('ucwords', explode('-', strtolower($r[2]))));
217
+
218
+            if ($j == 'X-Spip-Filtre' and isset($headers[$j])) {
219
+                $headers[$j] .= '|' . $r[3];
220
+            } else {
221
+                $headers[$j] = $r[3];
222
+            }
223
+        }
224
+    }
225
+    // S'agit-il d'un resultat constant ou contenant du code php
226
+    $process_ins = (
227
+        strpos($corps, '<' . '?') === false
228
+        or
229
+        (strpos($corps, '<' . '?xml') !== false and
230
+            strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false)
231
+    )
232
+        ? 'html'
233
+        : 'php';
234
+
235
+    $skel = [
236
+        'squelette' => $nom,
237
+        'source' => $source,
238
+        'process_ins' => $process_ins,
239
+        'invalideurs' => $cache,
240
+        'entetes' => $headers,
241
+        'duree' => isset($headers['X-Spip-Cache']) ? intval($headers['X-Spip-Cache']) : 0
242
+    ];
243
+
244
+    // traiter #FILTRE{} et filtres
245
+    if (!isset($filtres[$nom])) {
246
+        $filtres[$nom] = pipeline('declarer_filtres_squelettes', ['args' => $skel, 'data' => []]);
247
+    }
248
+    $filtres_headers = [];
249
+    if (isset($headers['X-Spip-Filtre']) and strlen($headers['X-Spip-Filtre'])) {
250
+        $filtres_headers = array_filter(explode('|', $headers['X-Spip-Filtre']));
251
+        unset($headers['X-Spip-Filtre']);
252
+    }
253
+    if (count($filtres[$nom]) or count($filtres_headers)) {
254
+        include_spip('public/sandbox');
255
+        $corps = sandbox_filtrer_squelette($skel, $corps, $filtres_headers, $filtres[$nom]);
256
+
257
+        if ($process_ins == 'html') {
258
+            $skel['process_ins'] = (
259
+                strpos($corps, '<' . '?') === false
260
+                or
261
+                (strpos($corps, '<' . '?xml') !== false and
262
+                    strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false)
263
+            )
264
+                ? 'html'
265
+                : 'php';
266
+        }
267
+    }
268
+
269
+    $skel['entetes'] = $headers;
270
+    $skel['texte'] = $corps;
271
+
272
+    return $skel;
273 273
 }
274 274
 
275 275
 //
@@ -283,7 +283,7 @@  discard block
 block discarded – undo
283 283
 inserer_balise_dynamique(balise_%s_dyn(%s), array(%s));
284 284
 if ($lang_select) lang_select();
285 285
 ?'
286
-	. '>');
286
+    . '>');
287 287
 
288 288
 /**
289 289
  * Synthétise une balise dynamique : crée l'appel à l'inclusion
@@ -303,35 +303,35 @@  discard block
 block discarded – undo
303 303
  *     Code PHP pour inclure le squelette de la balise dynamique
304 304
  **/
305 305
 function synthetiser_balise_dynamique($nom, $args, $file, $context_compil) {
306
-	if (
307
-		strncmp($file, '/', 1) !== 0
308
-		// pas de lien symbolique sous Windows
309
-		and !(stristr(PHP_OS, 'WIN') and strpos($file, ':') !== false)
310
-	) {
311
-		$file = './" . _DIR_RACINE . "' . $file;
312
-	}
313
-
314
-	$lang = $context_compil[4];
315
-	if (preg_match(',\W,', $lang)) {
316
-		$lang = '';
317
-	}
318
-
319
-	$args = array_map('argumenter_squelette', $args);
320
-	if (!empty($context_compil['appel_php_depuis_modele'])) {
321
-		$args[0] = 'arguments_balise_dyn_depuis_modele(' . $args[0] . ')';
322
-	}
323
-	$args = join(', ', $args);
324
-
325
-	$r = sprintf(
326
-		CODE_INCLURE_BALISE,
327
-		$file,
328
-		$lang,
329
-		$nom,
330
-		$args,
331
-		join(', ', array_map('_q', $context_compil))
332
-	);
333
-
334
-	return $r;
306
+    if (
307
+        strncmp($file, '/', 1) !== 0
308
+        // pas de lien symbolique sous Windows
309
+        and !(stristr(PHP_OS, 'WIN') and strpos($file, ':') !== false)
310
+    ) {
311
+        $file = './" . _DIR_RACINE . "' . $file;
312
+    }
313
+
314
+    $lang = $context_compil[4];
315
+    if (preg_match(',\W,', $lang)) {
316
+        $lang = '';
317
+    }
318
+
319
+    $args = array_map('argumenter_squelette', $args);
320
+    if (!empty($context_compil['appel_php_depuis_modele'])) {
321
+        $args[0] = 'arguments_balise_dyn_depuis_modele(' . $args[0] . ')';
322
+    }
323
+    $args = join(', ', $args);
324
+
325
+    $r = sprintf(
326
+        CODE_INCLURE_BALISE,
327
+        $file,
328
+        $lang,
329
+        $nom,
330
+        $args,
331
+        join(', ', array_map('_q', $context_compil))
332
+    );
333
+
334
+    return $r;
335 335
 }
336 336
 
337 337
 /**
@@ -349,18 +349,18 @@  discard block
 block discarded – undo
349 349
  **/
350 350
 function argumenter_squelette($v) {
351 351
 
352
-	if (is_object($v)) {
353
-		return var_export($v, true);
354
-	} elseif (!is_array($v)) {
355
-		return "'" . texte_script($v) . "'";
356
-	} else {
357
-		$out = [];
358
-		foreach ($v as $k => $val) {
359
-			$out [] = argumenter_squelette($k) . '=>' . argumenter_squelette($val);
360
-		}
361
-
362
-		return 'array(' . join(', ', $out) . ')';
363
-	}
352
+    if (is_object($v)) {
353
+        return var_export($v, true);
354
+    } elseif (!is_array($v)) {
355
+        return "'" . texte_script($v) . "'";
356
+    } else {
357
+        $out = [];
358
+        foreach ($v as $k => $val) {
359
+            $out [] = argumenter_squelette($k) . '=>' . argumenter_squelette($val);
360
+        }
361
+
362
+        return 'array(' . join(', ', $out) . ')';
363
+    }
364 364
 }
365 365
 
366 366
 
@@ -391,87 +391,87 @@  discard block
 block discarded – undo
391 391
  *     Code PHP d'exécutant l'inclusion du squelette (ou texte) de la balise dynamique
392 392
  **/
393 393
 function executer_balise_dynamique($nom, $args, $context_compil) {
394
-	/** @var string Nom de la balise à charger (balise demandée ou balise générique) */
395
-	$nom_balise = $nom;
396
-	/** @var string Nom de la balise générique (si utilisée) */
397
-	$nom_balise_generique = '';
398
-
399
-	$appel_php_depuis_modele = false;
400
-	if (
401
-		is_array($context_compil)
402
-		and !is_numeric($context_compil[3])
403
-		and empty($context_compil[0])
404
-		and empty($context_compil[1])
405
-		and empty($context_compil[2])
406
-		and empty($context_compil[3])
407
-	) {
408
-		$appel_php_depuis_modele = true;
409
-	}
410
-
411
-	if (!$fonction_balise = charger_fonction($nom_balise, 'balise', true)) {
412
-		// Calculer un nom générique (ie. 'formulaire_' dans 'formulaire_editer_article')
413
-		if ($balise_generique = chercher_balise_generique($nom)) {
414
-			// injecter en premier arg le nom de la balise
415
-			array_unshift($args, $nom);
416
-			$nom_balise_generique = $balise_generique['nom_generique'];
417
-			$fonction_balise = $balise_generique['fonction_generique'];
418
-			$nom_balise = $nom_balise_generique;
419
-		}
420
-		unset($balise_generique);
421
-	}
422
-
423
-	if (!$fonction_balise) {
424
-		$msg = ['zbug_balise_inexistante', ['from' => 'CVT', 'balise' => $nom]];
425
-		erreur_squelette($msg, $context_compil);
426
-
427
-		return '';
428
-	}
429
-
430
-	// retrouver le fichier qui a déclaré la fonction
431
-	// même si la fonction dynamique est déclarée dans un fichier de fonctions.
432
-	// Attention sous windows, getFileName() retourne un antislash.
433
-	$reflector = new ReflectionFunction($fonction_balise);
434
-	$file = str_replace('\\', '/', $reflector->getFileName());
435
-	if (strncmp($file, str_replace('\\', '/', _ROOT_RACINE), strlen(_ROOT_RACINE)) === 0) {
436
-		$file = substr($file, strlen(_ROOT_RACINE));
437
-	}
438
-
439
-	// Y a-t-il une fonction de traitement des arguments ?
440
-	$f = 'balise_' . $nom_balise . '_stat';
441
-
442
-	$r = !function_exists($f) ? $args : $f($args, $context_compil);
443
-
444
-	if (!is_array($r)) {
445
-		return $r;
446
-	}
447
-
448
-	// verifier que la fonction dyn est la,
449
-	// sinon se replier sur la generique si elle existe
450
-	if (!function_exists('balise_' . $nom_balise . '_dyn')) {
451
-		if (
452
-			$balise_generique = chercher_balise_generique($nom)
453
-			and $nom_balise_generique = $balise_generique['nom_generique']
454
-			and $file = include_spip('balise/' . strtolower($nom_balise_generique))
455
-			and function_exists('balise_' . $nom_balise_generique . '_dyn')
456
-		) {
457
-			// et lui injecter en premier arg le nom de la balise
458
-			array_unshift($r, $nom);
459
-			$nom_balise = $nom_balise_generique;
460
-			if (!_DIR_RESTREINT) {
461
-				$file = _DIR_RESTREINT_ABS . $file;
462
-			}
463
-		} else {
464
-			$msg = ['zbug_balise_inexistante', ['from' => 'CVT', 'balise' => $nom]];
465
-			erreur_squelette($msg, $context_compil);
466
-
467
-			return '';
468
-		}
469
-	}
470
-
471
-	if ($appel_php_depuis_modele) {
472
-		$context_compil['appel_php_depuis_modele'] = true;
473
-	}
474
-	return synthetiser_balise_dynamique($nom_balise, $r, $file, $context_compil);
394
+    /** @var string Nom de la balise à charger (balise demandée ou balise générique) */
395
+    $nom_balise = $nom;
396
+    /** @var string Nom de la balise générique (si utilisée) */
397
+    $nom_balise_generique = '';
398
+
399
+    $appel_php_depuis_modele = false;
400
+    if (
401
+        is_array($context_compil)
402
+        and !is_numeric($context_compil[3])
403
+        and empty($context_compil[0])
404
+        and empty($context_compil[1])
405
+        and empty($context_compil[2])
406
+        and empty($context_compil[3])
407
+    ) {
408
+        $appel_php_depuis_modele = true;
409
+    }
410
+
411
+    if (!$fonction_balise = charger_fonction($nom_balise, 'balise', true)) {
412
+        // Calculer un nom générique (ie. 'formulaire_' dans 'formulaire_editer_article')
413
+        if ($balise_generique = chercher_balise_generique($nom)) {
414
+            // injecter en premier arg le nom de la balise
415
+            array_unshift($args, $nom);
416
+            $nom_balise_generique = $balise_generique['nom_generique'];
417
+            $fonction_balise = $balise_generique['fonction_generique'];
418
+            $nom_balise = $nom_balise_generique;
419
+        }
420
+        unset($balise_generique);
421
+    }
422
+
423
+    if (!$fonction_balise) {
424
+        $msg = ['zbug_balise_inexistante', ['from' => 'CVT', 'balise' => $nom]];
425
+        erreur_squelette($msg, $context_compil);
426
+
427
+        return '';
428
+    }
429
+
430
+    // retrouver le fichier qui a déclaré la fonction
431
+    // même si la fonction dynamique est déclarée dans un fichier de fonctions.
432
+    // Attention sous windows, getFileName() retourne un antislash.
433
+    $reflector = new ReflectionFunction($fonction_balise);
434
+    $file = str_replace('\\', '/', $reflector->getFileName());
435
+    if (strncmp($file, str_replace('\\', '/', _ROOT_RACINE), strlen(_ROOT_RACINE)) === 0) {
436
+        $file = substr($file, strlen(_ROOT_RACINE));
437
+    }
438
+
439
+    // Y a-t-il une fonction de traitement des arguments ?
440
+    $f = 'balise_' . $nom_balise . '_stat';
441
+
442
+    $r = !function_exists($f) ? $args : $f($args, $context_compil);
443
+
444
+    if (!is_array($r)) {
445
+        return $r;
446
+    }
447
+
448
+    // verifier que la fonction dyn est la,
449
+    // sinon se replier sur la generique si elle existe
450
+    if (!function_exists('balise_' . $nom_balise . '_dyn')) {
451
+        if (
452
+            $balise_generique = chercher_balise_generique($nom)
453
+            and $nom_balise_generique = $balise_generique['nom_generique']
454
+            and $file = include_spip('balise/' . strtolower($nom_balise_generique))
455
+            and function_exists('balise_' . $nom_balise_generique . '_dyn')
456
+        ) {
457
+            // et lui injecter en premier arg le nom de la balise
458
+            array_unshift($r, $nom);
459
+            $nom_balise = $nom_balise_generique;
460
+            if (!_DIR_RESTREINT) {
461
+                $file = _DIR_RESTREINT_ABS . $file;
462
+            }
463
+        } else {
464
+            $msg = ['zbug_balise_inexistante', ['from' => 'CVT', 'balise' => $nom]];
465
+            erreur_squelette($msg, $context_compil);
466
+
467
+            return '';
468
+        }
469
+    }
470
+
471
+    if ($appel_php_depuis_modele) {
472
+        $context_compil['appel_php_depuis_modele'] = true;
473
+    }
474
+    return synthetiser_balise_dynamique($nom_balise, $r, $file, $context_compil);
475 475
 }
476 476
 
477 477
 /**
@@ -486,23 +486,23 @@  discard block
 block discarded – undo
486 486
  * @return array|null
487 487
  */
488 488
 function chercher_balise_generique($nom) {
489
-	if (false === strpos($nom, '_')) {
490
-		return null;
491
-	}
492
-	$nom_generique = $nom;
493
-	while (false !== ($p = strrpos($nom_generique, '_'))) {
494
-		$nom_generique = substr($nom_generique, 0, $p + 1);
495
-		$fonction_generique = charger_fonction($nom_generique, 'balise', true);
496
-		if ($fonction_generique) {
497
-			return [
498
-				'nom' => $nom,
499
-				'nom_generique' => $nom_generique,
500
-				'fonction_generique' => $fonction_generique,
501
-			];
502
-		}
503
-		$nom_generique = substr($nom_generique, 0, -1);
504
-	}
505
-	return null;
489
+    if (false === strpos($nom, '_')) {
490
+        return null;
491
+    }
492
+    $nom_generique = $nom;
493
+    while (false !== ($p = strrpos($nom_generique, '_'))) {
494
+        $nom_generique = substr($nom_generique, 0, $p + 1);
495
+        $fonction_generique = charger_fonction($nom_generique, 'balise', true);
496
+        if ($fonction_generique) {
497
+            return [
498
+                'nom' => $nom,
499
+                'nom_generique' => $nom_generique,
500
+                'fonction_generique' => $fonction_generique,
501
+            ];
502
+        }
503
+        $nom_generique = substr($nom_generique, 0, -1);
504
+    }
505
+    return null;
506 506
 }
507 507
 
508 508
 
@@ -526,29 +526,29 @@  discard block
 block discarded – undo
526 526
  * @return null;
527 527
  **/
528 528
 function lang_select_public($lang, $lang_select, $titre = null) {
529
-	// Cas 1. forcer_lang = true et pas de critere {lang_select}
530
-	if (
531
-		isset($GLOBALS['forcer_lang']) and $GLOBALS['forcer_lang']
532
-		and $lang_select !== 'oui'
533
-	) {
534
-		$lang = $GLOBALS['spip_lang'];
535
-	} // Cas 2. l'objet n'a pas de langue definie (ou definie a '')
536
-	elseif (!strlen($lang)) {
537
-		$lang = $GLOBALS['spip_lang'];
538
-	} // Cas 3. l'objet est multilingue !
539
-	elseif (
540
-		$lang_select !== 'oui'
541
-		and strlen($titre) > 10
542
-		and strpos($titre, '<multi>') !== false
543
-		and strpos(echappe_html($titre), '<multi>') !== false
544
-	) {
545
-		$lang = $GLOBALS['spip_lang'];
546
-	}
547
-
548
-	// faire un lang_select() eventuellement sur la langue inchangee
549
-	lang_select($lang);
550
-
551
-	return;
529
+    // Cas 1. forcer_lang = true et pas de critere {lang_select}
530
+    if (
531
+        isset($GLOBALS['forcer_lang']) and $GLOBALS['forcer_lang']
532
+        and $lang_select !== 'oui'
533
+    ) {
534
+        $lang = $GLOBALS['spip_lang'];
535
+    } // Cas 2. l'objet n'a pas de langue definie (ou definie a '')
536
+    elseif (!strlen($lang)) {
537
+        $lang = $GLOBALS['spip_lang'];
538
+    } // Cas 3. l'objet est multilingue !
539
+    elseif (
540
+        $lang_select !== 'oui'
541
+        and strlen($titre) > 10
542
+        and strpos($titre, '<multi>') !== false
543
+        and strpos(echappe_html($titre), '<multi>') !== false
544
+    ) {
545
+        $lang = $GLOBALS['spip_lang'];
546
+    }
547
+
548
+    // faire un lang_select() eventuellement sur la langue inchangee
549
+    lang_select($lang);
550
+
551
+    return;
552 552
 }
553 553
 
554 554
 
@@ -556,21 +556,21 @@  discard block
 block discarded – undo
556 556
 // il faut le nettoyer car il pourrait etre injecte en SQL
557 557
 // https://code.spip.net/@nettoyer_env_doublons
558 558
 function nettoyer_env_doublons($envd) {
559
-	foreach ($envd as $table => $liste) {
560
-		$n = '';
561
-		foreach (explode(',', $liste) as $val) {
562
-			if ($a = intval($val) and $val === strval($a)) {
563
-				$n .= ',' . $val;
564
-			}
565
-		}
566
-		if (strlen($n)) {
567
-			$envd[$table] = $n;
568
-		} else {
569
-			unset($envd[$table]);
570
-		}
571
-	}
572
-
573
-	return $envd;
559
+    foreach ($envd as $table => $liste) {
560
+        $n = '';
561
+        foreach (explode(',', $liste) as $val) {
562
+            if ($a = intval($val) and $val === strval($a)) {
563
+                $n .= ',' . $val;
564
+            }
565
+        }
566
+        if (strlen($n)) {
567
+            $envd[$table] = $n;
568
+        } else {
569
+            unset($envd[$table]);
570
+        }
571
+    }
572
+
573
+    return $envd;
574 574
 }
575 575
 
576 576
 /**
@@ -589,21 +589,21 @@  discard block
 block discarded – undo
589 589
  *     Opérateur trouvé (SELF ou SUBSELECT) sinon false.
590 590
  **/
591 591
 function match_self($w) {
592
-	if (is_string($w)) {
593
-		return false;
594
-	}
595
-	if (is_array($w)) {
596
-		if (in_array(reset($w), ['SELF', 'SUBSELECT'])) {
597
-			return $w;
598
-		}
599
-		foreach (array_filter($w, 'is_array') as $sw) {
600
-			if ($m = match_self($sw)) {
601
-				return $m;
602
-			}
603
-		}
604
-	}
605
-
606
-	return false;
592
+    if (is_string($w)) {
593
+        return false;
594
+    }
595
+    if (is_array($w)) {
596
+        if (in_array(reset($w), ['SELF', 'SUBSELECT'])) {
597
+            return $w;
598
+        }
599
+        foreach (array_filter($w, 'is_array') as $sw) {
600
+            if ($m = match_self($sw)) {
601
+                return $m;
602
+            }
603
+        }
604
+    }
605
+
606
+    return false;
607 607
 }
608 608
 
609 609
 /**
@@ -619,16 +619,16 @@  discard block
 block discarded – undo
619 619
  *     est remplacée par son code.
620 620
  **/
621 621
 function remplace_sous_requete($w, $sousrequete) {
622
-	if (is_array($w)) {
623
-		if (in_array(reset($w), ['SELF', 'SUBSELECT'])) {
624
-			return $sousrequete;
625
-		}
626
-		foreach ($w as $k => $sw) {
627
-			$w[$k] = remplace_sous_requete($sw, $sousrequete);
628
-		}
629
-	}
630
-
631
-	return $w;
622
+    if (is_array($w)) {
623
+        if (in_array(reset($w), ['SELF', 'SUBSELECT'])) {
624
+            return $sousrequete;
625
+        }
626
+        foreach ($w as $k => $sw) {
627
+            $w[$k] = remplace_sous_requete($sw, $sousrequete);
628
+        }
629
+    }
630
+
631
+    return $w;
632 632
 }
633 633
 
634 634
 /**
@@ -642,17 +642,17 @@  discard block
 block discarded – undo
642 642
  *     - Conditions avec des sous requêtes
643 643
  **/
644 644
 function trouver_sous_requetes($where) {
645
-	$where_simples = [];
646
-	$where_sous = [];
647
-	foreach ($where as $k => $w) {
648
-		if (match_self($w)) {
649
-			$where_sous[$k] = $w;
650
-		} else {
651
-			$where_simples[$k] = $w;
652
-		}
653
-	}
654
-
655
-	return [$where_simples, $where_sous];
645
+    $where_simples = [];
646
+    $where_sous = [];
647
+    foreach ($where as $k => $w) {
648
+        if (match_self($w)) {
649
+            $where_sous[$k] = $w;
650
+        } else {
651
+            $where_simples[$k] = $w;
652
+        }
653
+    }
654
+
655
+    return [$where_simples, $where_sous];
656 656
 }
657 657
 
658 658
 
@@ -678,292 +678,292 @@  discard block
 block discarded – undo
678 678
  * @return resource
679 679
  */
680 680
 function calculer_select(
681
-	$select = [],
682
-	$from = [],
683
-	$from_type = [],
684
-	$where = [],
685
-	$join = [],
686
-	$groupby = [],
687
-	$orderby = [],
688
-	$limit = '',
689
-	$having = [],
690
-	$table = '',
691
-	$id = '',
692
-	$serveur = '',
693
-	$requeter = true
681
+    $select = [],
682
+    $from = [],
683
+    $from_type = [],
684
+    $where = [],
685
+    $join = [],
686
+    $groupby = [],
687
+    $orderby = [],
688
+    $limit = '',
689
+    $having = [],
690
+    $table = '',
691
+    $id = '',
692
+    $serveur = '',
693
+    $requeter = true
694 694
 ) {
695 695
 
696
-	// retirer les criteres vides:
697
-	// {X ?} avec X absent de l'URL
698
-	// {par #ENV{X}} avec X absent de l'URL
699
-	// IN sur collection vide (ce dernier devrait pouvoir etre fait a la compil)
700
-	$menage = false;
701
-	foreach ($where as $k => $v) {
702
-		if (is_array($v)) {
703
-			if ((count($v) >= 2) && ($v[0] == 'REGEXP') && ($v[2] == "'.*'")) {
704
-				$op = false;
705
-			} elseif ((count($v) >= 2) && ($v[0] == 'LIKE') && ($v[2] == "'%'")) {
706
-				$op = false;
707
-			} else {
708
-				$op = $v[0] ? $v[0] : $v;
709
-			}
710
-		} else {
711
-			$op = $v;
712
-		}
713
-		if ((!$op) or ($op == 1) or ($op == '0=0')) {
714
-			unset($where[$k]);
715
-			$menage = true;
716
-		}
717
-	}
718
-
719
-	// evacuer les eventuels groupby vide issus d'un calcul dynamique
720
-	$groupby = array_diff($groupby, ['']);
721
-
722
-	// remplacer les sous requetes recursives au calcul
723
-	list($where_simples, $where_sous) = trouver_sous_requetes($where);
724
-	foreach ($where_sous as $k => $w) {
725
-		$menage = true;
726
-		// on recupere la sous requete
727
-		$sous = match_self($w);
728
-		if ($sous[0] == 'SELF') {
729
-			// c'est une sous requete identique a elle meme sous la forme (SELF,$select,$where)
730
-			array_push($where_simples, $sous[2]);
731
-			$wheresub = [
732
-				$sous[2],
733
-				'0=0'
734
-			]; // pour accepter une string et forcer a faire le menage car on a surement simplifie select et where
735
-			$jsub = $join;
736
-			// trouver les jointures utiles a
737
-			// reinjecter dans le where de la sous requete les conditions supplementaires des jointures qui y sont mentionnees
738
-			// ie L1.objet='article'
739
-			// on construit le where une fois, puis on ajoute les where complentaires si besoin, et on reconstruit le where en fonction
740
-			$i = 0;
741
-			do {
742
-				$where[$k] = remplace_sous_requete($w, '(' . calculer_select(
743
-					[$sous[1] . ' AS id'],
744
-					$from,
745
-					$from_type,
746
-					$wheresub,
747
-					$jsub,
748
-					[],
749
-					[],
750
-					'',
751
-					$having,
752
-					$table,
753
-					$id,
754
-					$serveur,
755
-					false
756
-				) . ')');
757
-				if (!$i) {
758
-					$i = 1;
759
-					$wherestring = calculer_where_to_string($where[$k]);
760
-					foreach ($join as $cle => $wj) {
761
-						if (
762
-							count($wj) == 4
763
-							and strpos($wherestring, "{$cle}.") !== false
764
-						) {
765
-							$i = 0;
766
-							$wheresub[] = $wj[3];
767
-							unset($jsub[$cle][3]);
768
-						}
769
-					}
770
-				}
771
-			} while ($i++ < 1);
772
-		}
773
-		if ($sous[0] == 'SUBSELECT') {
774
-			// c'est une sous requete explicite sous la forme identique a sql_select : (SUBSELECT,$select,$from,$where,$groupby,$orderby,$limit,$having)
775
-			array_push($where_simples, $sous[3]); // est-ce utile dans ce cas ?
776
-			$where[$k] = remplace_sous_requete($w, '(' . calculer_select(
777
-				$sous[1], # select
778
-				$sous[2], #from
779
-				[], #from_type
780
-				$sous[3] ? (is_array($sous[3]) ? $sous[3] : [$sous[3]]) : [],
781
-				#where, qui peut etre de la forme string comme dans sql_select
782
-					[], #join
783
-				$sous[4] ? $sous[4] : [], #groupby
784
-				$sous[5] ? $sous[5] : [], #orderby
785
-				$sous[6], #limit
786
-				$sous[7] ? $sous[7] : [], #having
787
-				$table,
788
-				$id,
789
-				$serveur,
790
-				false
791
-			) . ')');
792
-		}
793
-		array_pop($where_simples);
794
-	}
795
-
796
-	foreach ($having as $k => $v) {
797
-		if ((!$v) or ($v == 1) or ($v == '0=0')) {
798
-			unset($having[$k]);
799
-		}
800
-	}
801
-
802
-	// Installer les jointures.
803
-	// Retirer celles seulement utiles aux criteres finalement absents mais
804
-	// parcourir de la plus recente a la moins recente pour pouvoir eliminer Ln
805
-	// si elle est seulement utile a Ln+1 elle meme inutile
806
-
807
-	$afrom = [];
808
-	$equiv = [];
809
-	$k = count($join);
810
-	foreach (array_reverse($join, true) as $cledef => $j) {
811
-		$cle = $cledef;
812
-		// le format de join est :
813
-		// array(table depart, cle depart [,cle arrivee[,condition optionnelle and ...]])
814
-		$join[$cle] = array_values($join[$cle]); // recalculer les cles car des unset ont pu perturber
815
-		if (count($join[$cle]) == 2) {
816
-			$join[$cle][] = $join[$cle][1];
817
-		}
818
-		if (count($join[$cle]) == 3) {
819
-			$join[$cle][] = '';
820
-		}
821
-		list($t, $c, $carr, $and) = $join[$cle];
822
-		// si le nom de la jointure n'a pas ete specifiee, on prend Lx avec x sont rang dans la liste
823
-		// pour compat avec ancienne convention
824
-		if (is_numeric($cle)) {
825
-			$cle = "L$k";
826
-		}
827
-		$cle_where_lie = "JOIN-$cle";
828
-		if (
829
-			!$menage
830
-			or isset($afrom[$cle])
831
-			or calculer_jointnul($cle, $select)
832
-			or calculer_jointnul($cle, array_diff_key($join, [$cle => $join[$cle]]))
833
-			or calculer_jointnul($cle, $having)
834
-			or calculer_jointnul($cle, array_diff_key($where_simples, [$cle_where_lie => '']))
835
-		) {
836
-			// corriger les references non explicites dans select
837
-			// ou groupby
838
-			foreach ($select as $i => $s) {
839
-				if ($s == $c) {
840
-					$select[$i] = "$cle.$c AS $c";
841
-					break;
842
-				}
843
-			}
844
-			foreach ($groupby as $i => $g) {
845
-				if ($g == $c) {
846
-					$groupby[$i] = "$cle.$c";
847
-					break;
848
-				}
849
-			}
850
-			// on garde une ecriture decomposee pour permettre une simplification ulterieure si besoin
851
-			// sans recours a preg_match
852
-			// un implode(' ',..) est fait dans reinjecte_joint un peu plus bas
853
-			$afrom[$t][$cle] = [
854
-				"\n" .
855
-				(isset($from_type[$cle]) ? $from_type[$cle] : 'INNER') . ' JOIN',
856
-				$from[$cle],
857
-				"AS $cle",
858
-				'ON (',
859
-				"$cle.$c",
860
-				'=',
861
-				"$t.$carr",
862
-				($and ? 'AND ' . $and : '') .
863
-				')'
864
-			];
865
-			if (isset($afrom[$cle])) {
866
-				$afrom[$t] = $afrom[$t] + $afrom[$cle];
867
-				unset($afrom[$cle]);
868
-			}
869
-			$equiv[] = $carr;
870
-		} else {
871
-			unset($join[$cledef]);
872
-			if (isset($where_simples[$cle_where_lie])) {
873
-				unset($where_simples[$cle_where_lie]);
874
-				unset($where[$cle_where_lie]);
875
-			}
876
-		}
877
-		unset($from[$cle]);
878
-		$k--;
879
-	}
880
-
881
-	if (count($afrom)) {
882
-		// Regarder si la table principale ne sert finalement a rien comme dans
883
-		//<BOUCLE3(MOTS){id_article}{id_mot}> class='on'</BOUCLE3>
884
-		//<BOUCLE2(MOTS){id_article} />#TOTAL_BOUCLE<//B2>
885
-		//<BOUCLE5(RUBRIQUES){id_mot}{tout} />#TOTAL_BOUCLE<//B5>
886
-		// ou dans
887
-		//<BOUCLE8(HIERARCHIE){id_rubrique}{tout}{type='Squelette'}{inverse}{0,1}{lang_select=non} />#TOTAL_BOUCLE<//B8>
888
-		// qui comporte plusieurs jointures
889
-		// ou dans
890
-		// <BOUCLE6(ARTICLES){id_mot=2}{statut==.*} />#TOTAL_BOUCLE<//B6>
891
-		// <BOUCLE7(ARTICLES){id_mot>0}{statut?} />#TOTAL_BOUCLE<//B7>
892
-		// penser a regarder aussi la clause orderby pour ne pas simplifier abusivement
893
-		// <BOUCLE9(ARTICLES){recherche truc}{par titre}>#ID_ARTICLE</BOUCLE9>
894
-		// penser a regarder aussi la clause groubpy pour ne pas simplifier abusivement
895
-		// <BOUCLE10(EVENEMENTS){id_rubrique} />#TOTAL_BOUCLE<//B10>
896
-
897
-		$t = key($from);
898
-		$c = current($from);
899
-		reset($from);
900
-		$e = '/\b(' . "$t\\." . join('|' . $t . '\.', $equiv) . ')\b/';
901
-		if (
902
-			!(strpos($t, ' ') or // jointure des le depart cf boucle_doc
903
-				calculer_jointnul($t, $select, $e) or
904
-				calculer_jointnul($t, $join, $e) or
905
-				calculer_jointnul($t, $where, $e) or
906
-				calculer_jointnul($t, $orderby, $e) or
907
-				calculer_jointnul($t, $groupby, $e) or
908
-				calculer_jointnul($t, $having, $e))
909
-			&& count($afrom[$t])
910
-		) {
911
-			$nfrom = reset($afrom[$t]);
912
-			$nt = key($afrom[$t]);
913
-			unset($from[$t]);
914
-			$from[$nt] = $nfrom[1];
915
-			unset($afrom[$t][$nt]);
916
-			$afrom[$nt] = $afrom[$t];
917
-			unset($afrom[$t]);
918
-			$e = '/\b' . preg_quote($nfrom[6]) . '\b/';
919
-			$t = $nfrom[4];
920
-			$alias = '';
921
-			// verifier que les deux cles sont homonymes, sinon installer un alias dans le select
922
-			$oldcle = explode('.', $nfrom[6]);
923
-			$oldcle = end($oldcle);
924
-			$newcle = explode('.', $nfrom[4]);
925
-			$newcle = end($newcle);
926
-			if ($newcle != $oldcle) {
927
-				// si l'ancienne cle etait deja dans le select avec un AS
928
-				// reprendre simplement ce AS
929
-				$as = '/\b' . preg_quote($nfrom[6]) . '\s+(AS\s+\w+)\b/';
930
-				if (preg_match($as, implode(',', $select), $m)) {
931
-					$alias = '';
932
-				} else {
933
-					$alias = ', ' . $nfrom[4] . " AS $oldcle";
934
-				}
935
-			}
936
-			$select = remplacer_jointnul($t . $alias, $select, $e);
937
-			$join = remplacer_jointnul($t, $join, $e);
938
-			$where = remplacer_jointnul($t, $where, $e);
939
-			$having = remplacer_jointnul($t, $having, $e);
940
-			$groupby = remplacer_jointnul($t, $groupby, $e);
941
-			$orderby = remplacer_jointnul($t, $orderby, $e);
942
-		}
943
-		$from = reinjecte_joint($afrom, $from);
944
-	}
945
-	if (empty($GLOBALS['debug']) or !is_array($GLOBALS['debug'])) {
946
-		$wasdebug = empty($GLOBALS['debug']) ? false : $GLOBALS['debug'];
947
-		$GLOBALS['debug'] = [];
948
-		if ($wasdebug) {
949
-			$GLOBALS['debug']['debug'] = true;
950
-		}
951
-	}
952
-	$GLOBALS['debug']['aucasou'] = [$table, $id, $serveur, $requeter];
953
-	$r = sql_select(
954
-		$select,
955
-		$from,
956
-		$where,
957
-		$groupby,
958
-		array_filter($orderby),
959
-		$limit,
960
-		$having,
961
-		$serveur,
962
-		$requeter
963
-	);
964
-	unset($GLOBALS['debug']['aucasou']);
965
-
966
-	return $r;
696
+    // retirer les criteres vides:
697
+    // {X ?} avec X absent de l'URL
698
+    // {par #ENV{X}} avec X absent de l'URL
699
+    // IN sur collection vide (ce dernier devrait pouvoir etre fait a la compil)
700
+    $menage = false;
701
+    foreach ($where as $k => $v) {
702
+        if (is_array($v)) {
703
+            if ((count($v) >= 2) && ($v[0] == 'REGEXP') && ($v[2] == "'.*'")) {
704
+                $op = false;
705
+            } elseif ((count($v) >= 2) && ($v[0] == 'LIKE') && ($v[2] == "'%'")) {
706
+                $op = false;
707
+            } else {
708
+                $op = $v[0] ? $v[0] : $v;
709
+            }
710
+        } else {
711
+            $op = $v;
712
+        }
713
+        if ((!$op) or ($op == 1) or ($op == '0=0')) {
714
+            unset($where[$k]);
715
+            $menage = true;
716
+        }
717
+    }
718
+
719
+    // evacuer les eventuels groupby vide issus d'un calcul dynamique
720
+    $groupby = array_diff($groupby, ['']);
721
+
722
+    // remplacer les sous requetes recursives au calcul
723
+    list($where_simples, $where_sous) = trouver_sous_requetes($where);
724
+    foreach ($where_sous as $k => $w) {
725
+        $menage = true;
726
+        // on recupere la sous requete
727
+        $sous = match_self($w);
728
+        if ($sous[0] == 'SELF') {
729
+            // c'est une sous requete identique a elle meme sous la forme (SELF,$select,$where)
730
+            array_push($where_simples, $sous[2]);
731
+            $wheresub = [
732
+                $sous[2],
733
+                '0=0'
734
+            ]; // pour accepter une string et forcer a faire le menage car on a surement simplifie select et where
735
+            $jsub = $join;
736
+            // trouver les jointures utiles a
737
+            // reinjecter dans le where de la sous requete les conditions supplementaires des jointures qui y sont mentionnees
738
+            // ie L1.objet='article'
739
+            // on construit le where une fois, puis on ajoute les where complentaires si besoin, et on reconstruit le where en fonction
740
+            $i = 0;
741
+            do {
742
+                $where[$k] = remplace_sous_requete($w, '(' . calculer_select(
743
+                    [$sous[1] . ' AS id'],
744
+                    $from,
745
+                    $from_type,
746
+                    $wheresub,
747
+                    $jsub,
748
+                    [],
749
+                    [],
750
+                    '',
751
+                    $having,
752
+                    $table,
753
+                    $id,
754
+                    $serveur,
755
+                    false
756
+                ) . ')');
757
+                if (!$i) {
758
+                    $i = 1;
759
+                    $wherestring = calculer_where_to_string($where[$k]);
760
+                    foreach ($join as $cle => $wj) {
761
+                        if (
762
+                            count($wj) == 4
763
+                            and strpos($wherestring, "{$cle}.") !== false
764
+                        ) {
765
+                            $i = 0;
766
+                            $wheresub[] = $wj[3];
767
+                            unset($jsub[$cle][3]);
768
+                        }
769
+                    }
770
+                }
771
+            } while ($i++ < 1);
772
+        }
773
+        if ($sous[0] == 'SUBSELECT') {
774
+            // c'est une sous requete explicite sous la forme identique a sql_select : (SUBSELECT,$select,$from,$where,$groupby,$orderby,$limit,$having)
775
+            array_push($where_simples, $sous[3]); // est-ce utile dans ce cas ?
776
+            $where[$k] = remplace_sous_requete($w, '(' . calculer_select(
777
+                $sous[1], # select
778
+                $sous[2], #from
779
+                [], #from_type
780
+                $sous[3] ? (is_array($sous[3]) ? $sous[3] : [$sous[3]]) : [],
781
+                #where, qui peut etre de la forme string comme dans sql_select
782
+                    [], #join
783
+                $sous[4] ? $sous[4] : [], #groupby
784
+                $sous[5] ? $sous[5] : [], #orderby
785
+                $sous[6], #limit
786
+                $sous[7] ? $sous[7] : [], #having
787
+                $table,
788
+                $id,
789
+                $serveur,
790
+                false
791
+            ) . ')');
792
+        }
793
+        array_pop($where_simples);
794
+    }
795
+
796
+    foreach ($having as $k => $v) {
797
+        if ((!$v) or ($v == 1) or ($v == '0=0')) {
798
+            unset($having[$k]);
799
+        }
800
+    }
801
+
802
+    // Installer les jointures.
803
+    // Retirer celles seulement utiles aux criteres finalement absents mais
804
+    // parcourir de la plus recente a la moins recente pour pouvoir eliminer Ln
805
+    // si elle est seulement utile a Ln+1 elle meme inutile
806
+
807
+    $afrom = [];
808
+    $equiv = [];
809
+    $k = count($join);
810
+    foreach (array_reverse($join, true) as $cledef => $j) {
811
+        $cle = $cledef;
812
+        // le format de join est :
813
+        // array(table depart, cle depart [,cle arrivee[,condition optionnelle and ...]])
814
+        $join[$cle] = array_values($join[$cle]); // recalculer les cles car des unset ont pu perturber
815
+        if (count($join[$cle]) == 2) {
816
+            $join[$cle][] = $join[$cle][1];
817
+        }
818
+        if (count($join[$cle]) == 3) {
819
+            $join[$cle][] = '';
820
+        }
821
+        list($t, $c, $carr, $and) = $join[$cle];
822
+        // si le nom de la jointure n'a pas ete specifiee, on prend Lx avec x sont rang dans la liste
823
+        // pour compat avec ancienne convention
824
+        if (is_numeric($cle)) {
825
+            $cle = "L$k";
826
+        }
827
+        $cle_where_lie = "JOIN-$cle";
828
+        if (
829
+            !$menage
830
+            or isset($afrom[$cle])
831
+            or calculer_jointnul($cle, $select)
832
+            or calculer_jointnul($cle, array_diff_key($join, [$cle => $join[$cle]]))
833
+            or calculer_jointnul($cle, $having)
834
+            or calculer_jointnul($cle, array_diff_key($where_simples, [$cle_where_lie => '']))
835
+        ) {
836
+            // corriger les references non explicites dans select
837
+            // ou groupby
838
+            foreach ($select as $i => $s) {
839
+                if ($s == $c) {
840
+                    $select[$i] = "$cle.$c AS $c";
841
+                    break;
842
+                }
843
+            }
844
+            foreach ($groupby as $i => $g) {
845
+                if ($g == $c) {
846
+                    $groupby[$i] = "$cle.$c";
847
+                    break;
848
+                }
849
+            }
850
+            // on garde une ecriture decomposee pour permettre une simplification ulterieure si besoin
851
+            // sans recours a preg_match
852
+            // un implode(' ',..) est fait dans reinjecte_joint un peu plus bas
853
+            $afrom[$t][$cle] = [
854
+                "\n" .
855
+                (isset($from_type[$cle]) ? $from_type[$cle] : 'INNER') . ' JOIN',
856
+                $from[$cle],
857
+                "AS $cle",
858
+                'ON (',
859
+                "$cle.$c",
860
+                '=',
861
+                "$t.$carr",
862
+                ($and ? 'AND ' . $and : '') .
863
+                ')'
864
+            ];
865
+            if (isset($afrom[$cle])) {
866
+                $afrom[$t] = $afrom[$t] + $afrom[$cle];
867
+                unset($afrom[$cle]);
868
+            }
869
+            $equiv[] = $carr;
870
+        } else {
871
+            unset($join[$cledef]);
872
+            if (isset($where_simples[$cle_where_lie])) {
873
+                unset($where_simples[$cle_where_lie]);
874
+                unset($where[$cle_where_lie]);
875
+            }
876
+        }
877
+        unset($from[$cle]);
878
+        $k--;
879
+    }
880
+
881
+    if (count($afrom)) {
882
+        // Regarder si la table principale ne sert finalement a rien comme dans
883
+        //<BOUCLE3(MOTS){id_article}{id_mot}> class='on'</BOUCLE3>
884
+        //<BOUCLE2(MOTS){id_article} />#TOTAL_BOUCLE<//B2>
885
+        //<BOUCLE5(RUBRIQUES){id_mot}{tout} />#TOTAL_BOUCLE<//B5>
886
+        // ou dans
887
+        //<BOUCLE8(HIERARCHIE){id_rubrique}{tout}{type='Squelette'}{inverse}{0,1}{lang_select=non} />#TOTAL_BOUCLE<//B8>
888
+        // qui comporte plusieurs jointures
889
+        // ou dans
890
+        // <BOUCLE6(ARTICLES){id_mot=2}{statut==.*} />#TOTAL_BOUCLE<//B6>
891
+        // <BOUCLE7(ARTICLES){id_mot>0}{statut?} />#TOTAL_BOUCLE<//B7>
892
+        // penser a regarder aussi la clause orderby pour ne pas simplifier abusivement
893
+        // <BOUCLE9(ARTICLES){recherche truc}{par titre}>#ID_ARTICLE</BOUCLE9>
894
+        // penser a regarder aussi la clause groubpy pour ne pas simplifier abusivement
895
+        // <BOUCLE10(EVENEMENTS){id_rubrique} />#TOTAL_BOUCLE<//B10>
896
+
897
+        $t = key($from);
898
+        $c = current($from);
899
+        reset($from);
900
+        $e = '/\b(' . "$t\\." . join('|' . $t . '\.', $equiv) . ')\b/';
901
+        if (
902
+            !(strpos($t, ' ') or // jointure des le depart cf boucle_doc
903
+                calculer_jointnul($t, $select, $e) or
904
+                calculer_jointnul($t, $join, $e) or
905
+                calculer_jointnul($t, $where, $e) or
906
+                calculer_jointnul($t, $orderby, $e) or
907
+                calculer_jointnul($t, $groupby, $e) or
908
+                calculer_jointnul($t, $having, $e))
909
+            && count($afrom[$t])
910
+        ) {
911
+            $nfrom = reset($afrom[$t]);
912
+            $nt = key($afrom[$t]);
913
+            unset($from[$t]);
914
+            $from[$nt] = $nfrom[1];
915
+            unset($afrom[$t][$nt]);
916
+            $afrom[$nt] = $afrom[$t];
917
+            unset($afrom[$t]);
918
+            $e = '/\b' . preg_quote($nfrom[6]) . '\b/';
919
+            $t = $nfrom[4];
920
+            $alias = '';
921
+            // verifier que les deux cles sont homonymes, sinon installer un alias dans le select
922
+            $oldcle = explode('.', $nfrom[6]);
923
+            $oldcle = end($oldcle);
924
+            $newcle = explode('.', $nfrom[4]);
925
+            $newcle = end($newcle);
926
+            if ($newcle != $oldcle) {
927
+                // si l'ancienne cle etait deja dans le select avec un AS
928
+                // reprendre simplement ce AS
929
+                $as = '/\b' . preg_quote($nfrom[6]) . '\s+(AS\s+\w+)\b/';
930
+                if (preg_match($as, implode(',', $select), $m)) {
931
+                    $alias = '';
932
+                } else {
933
+                    $alias = ', ' . $nfrom[4] . " AS $oldcle";
934
+                }
935
+            }
936
+            $select = remplacer_jointnul($t . $alias, $select, $e);
937
+            $join = remplacer_jointnul($t, $join, $e);
938
+            $where = remplacer_jointnul($t, $where, $e);
939
+            $having = remplacer_jointnul($t, $having, $e);
940
+            $groupby = remplacer_jointnul($t, $groupby, $e);
941
+            $orderby = remplacer_jointnul($t, $orderby, $e);
942
+        }
943
+        $from = reinjecte_joint($afrom, $from);
944
+    }
945
+    if (empty($GLOBALS['debug']) or !is_array($GLOBALS['debug'])) {
946
+        $wasdebug = empty($GLOBALS['debug']) ? false : $GLOBALS['debug'];
947
+        $GLOBALS['debug'] = [];
948
+        if ($wasdebug) {
949
+            $GLOBALS['debug']['debug'] = true;
950
+        }
951
+    }
952
+    $GLOBALS['debug']['aucasou'] = [$table, $id, $serveur, $requeter];
953
+    $r = sql_select(
954
+        $select,
955
+        $from,
956
+        $where,
957
+        $groupby,
958
+        array_filter($orderby),
959
+        $limit,
960
+        $having,
961
+        $serveur,
962
+        $requeter
963
+    );
964
+    unset($GLOBALS['debug']['aucasou']);
965
+
966
+    return $r;
967 967
 }
968 968
 
969 969
 /**
@@ -974,20 +974,20 @@  discard block
 block discarded – undo
974 974
  * @return string
975 975
  */
976 976
 function calculer_where_to_string($v, $join = 'AND') {
977
-	if (empty($v)) {
978
-		return '';
979
-	}
980
-
981
-	if (!is_array($v)) {
982
-		return $v;
983
-	} else {
984
-		$exp = '';
985
-		if (strtoupper($join) === 'AND') {
986
-			return $exp . join(" $join ", array_map('calculer_where_to_string', $v));
987
-		} else {
988
-			return $exp . join($join, $v);
989
-		}
990
-	}
977
+    if (empty($v)) {
978
+        return '';
979
+    }
980
+
981
+    if (!is_array($v)) {
982
+        return $v;
983
+    } else {
984
+        $exp = '';
985
+        if (strtoupper($join) === 'AND') {
986
+            return $exp . join(" $join ", array_map('calculer_where_to_string', $v));
987
+        } else {
988
+            return $exp . join($join, $v);
989
+        }
990
+    }
991 991
 }
992 992
 
993 993
 
@@ -995,62 +995,62 @@  discard block
 block discarded – undo
995 995
 
996 996
 // https://code.spip.net/@calculer_jointnul
997 997
 function calculer_jointnul($cle, $exp, $equiv = '') {
998
-	if (!is_array($exp)) {
999
-		if ($equiv) {
1000
-			$exp = preg_replace($equiv, '', $exp);
1001
-		}
1002
-
1003
-		return preg_match("/\\b$cle\\./", $exp);
1004
-	} else {
1005
-		foreach ($exp as $v) {
1006
-			if (calculer_jointnul($cle, $v, $equiv)) {
1007
-				return true;
1008
-			}
1009
-		}
1010
-
1011
-		return false;
1012
-	}
998
+    if (!is_array($exp)) {
999
+        if ($equiv) {
1000
+            $exp = preg_replace($equiv, '', $exp);
1001
+        }
1002
+
1003
+        return preg_match("/\\b$cle\\./", $exp);
1004
+    } else {
1005
+        foreach ($exp as $v) {
1006
+            if (calculer_jointnul($cle, $v, $equiv)) {
1007
+                return true;
1008
+            }
1009
+        }
1010
+
1011
+        return false;
1012
+    }
1013 1013
 }
1014 1014
 
1015 1015
 // https://code.spip.net/@reinjecte_joint
1016 1016
 function reinjecte_joint($afrom, $from) {
1017
-	$from_synth = [];
1018
-	foreach ($from as $k => $v) {
1019
-		$from_synth[$k] = $from[$k];
1020
-		if (isset($afrom[$k])) {
1021
-			foreach ($afrom[$k] as $kk => $vv) {
1022
-				$afrom[$k][$kk] = implode(' ', $afrom[$k][$kk]);
1023
-			}
1024
-			$from_synth["$k@"] = implode(' ', $afrom[$k]);
1025
-			unset($afrom[$k]);
1026
-		}
1027
-	}
1028
-
1029
-	return $from_synth;
1017
+    $from_synth = [];
1018
+    foreach ($from as $k => $v) {
1019
+        $from_synth[$k] = $from[$k];
1020
+        if (isset($afrom[$k])) {
1021
+            foreach ($afrom[$k] as $kk => $vv) {
1022
+                $afrom[$k][$kk] = implode(' ', $afrom[$k][$kk]);
1023
+            }
1024
+            $from_synth["$k@"] = implode(' ', $afrom[$k]);
1025
+            unset($afrom[$k]);
1026
+        }
1027
+    }
1028
+
1029
+    return $from_synth;
1030 1030
 }
1031 1031
 
1032 1032
 // https://code.spip.net/@remplacer_jointnul
1033 1033
 function remplacer_jointnul($cle, $exp, $equiv = '') {
1034
-	if (!is_array($exp)) {
1035
-		return preg_replace($equiv, $cle, $exp);
1036
-	} else {
1037
-		foreach ($exp as $k => $v) {
1038
-			$exp[$k] = remplacer_jointnul($cle, $v, $equiv);
1039
-		}
1040
-
1041
-		return $exp;
1042
-	}
1034
+    if (!is_array($exp)) {
1035
+        return preg_replace($equiv, $cle, $exp);
1036
+    } else {
1037
+        foreach ($exp as $k => $v) {
1038
+            $exp[$k] = remplacer_jointnul($cle, $v, $equiv);
1039
+        }
1040
+
1041
+        return $exp;
1042
+    }
1043 1043
 }
1044 1044
 
1045 1045
 // calcul du nom du squelette
1046 1046
 // https://code.spip.net/@calculer_nom_fonction_squel
1047 1047
 function calculer_nom_fonction_squel($skel, $mime_type = 'html', $connect = '') {
1048
-	// ne pas doublonner les squelette selon qu'ils sont calcules depuis ecrire/ ou depuis la racine
1049
-	if ($l = strlen(_DIR_RACINE) and strncmp($skel, _DIR_RACINE, $l) == 0) {
1050
-		$skel = substr($skel, strlen(_DIR_RACINE));
1051
-	}
1052
-
1053
-	return $mime_type
1054
-	. (!$connect ? '' : preg_replace('/\W/', '_', $connect)) . '_'
1055
-	. md5($GLOBALS['spip_version_code'] . ' * ' . $skel . (isset($GLOBALS['marqueur_skel']) ? '*' . $GLOBALS['marqueur_skel'] : ''));
1048
+    // ne pas doublonner les squelette selon qu'ils sont calcules depuis ecrire/ ou depuis la racine
1049
+    if ($l = strlen(_DIR_RACINE) and strncmp($skel, _DIR_RACINE, $l) == 0) {
1050
+        $skel = substr($skel, strlen(_DIR_RACINE));
1051
+    }
1052
+
1053
+    return $mime_type
1054
+    . (!$connect ? '' : preg_replace('/\W/', '_', $connect)) . '_'
1055
+    . md5($GLOBALS['spip_version_code'] . ' * ' . $skel . (isset($GLOBALS['marqueur_skel']) ? '*' . $GLOBALS['marqueur_skel'] : ''));
1056 1056
 }
Please login to merge, or discard this patch.
ecrire/public/interfaces.php 1 patch
Indentation   +914 added lines, -914 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 
@@ -34,53 +34,53 @@  discard block
 block discarded – undo
34 34
  * @package SPIP\Core\Compilateur\AST
35 35
  */
36 36
 class Contexte {
37
-	/**
38
-	 * Description du squelette
39
-	 *
40
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
41
-	 *
42
-	 * Peut contenir les index :
43
-	 *
44
-	 * - nom : Nom du fichier de cache
45
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
46
-	 * - sourcefile : Chemin du squelette
47
-	 * - squelette : Code du squelette
48
-	 * - id_mere : Identifiant de la boucle parente
49
-	 * - documents : Pour embed et img dans les textes
50
-	 * - session : Pour un cache sessionné par auteur
51
-	 * - niv : Niveau de tabulation
52
-	 *
53
-	 * @var array
54
-	 */
55
-	public $descr = [];
56
-
57
-	/**
58
-	 * Identifiant de la boucle
59
-	 *
60
-	 * @var string
61
-	 */
62
-	public $id_boucle = '';
63
-
64
-	/**
65
-	 * Numéro de ligne dans le code source du squelette
66
-	 *
67
-	 * @var int
68
-	 */
69
-	public $ligne = 0;
70
-
71
-	/**
72
-	 * Langue d'exécution
73
-	 *
74
-	 * @var string
75
-	 */
76
-	public $lang = '';
77
-
78
-	/**
79
-	 * Résultat de la compilation: toujours une expression PHP
80
-	 *
81
-	 * @var string
82
-	 */
83
-	public $code = '';
37
+    /**
38
+     * Description du squelette
39
+     *
40
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
41
+     *
42
+     * Peut contenir les index :
43
+     *
44
+     * - nom : Nom du fichier de cache
45
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
46
+     * - sourcefile : Chemin du squelette
47
+     * - squelette : Code du squelette
48
+     * - id_mere : Identifiant de la boucle parente
49
+     * - documents : Pour embed et img dans les textes
50
+     * - session : Pour un cache sessionné par auteur
51
+     * - niv : Niveau de tabulation
52
+     *
53
+     * @var array
54
+     */
55
+    public $descr = [];
56
+
57
+    /**
58
+     * Identifiant de la boucle
59
+     *
60
+     * @var string
61
+     */
62
+    public $id_boucle = '';
63
+
64
+    /**
65
+     * Numéro de ligne dans le code source du squelette
66
+     *
67
+     * @var int
68
+     */
69
+    public $ligne = 0;
70
+
71
+    /**
72
+     * Langue d'exécution
73
+     *
74
+     * @var string
75
+     */
76
+    public $lang = '';
77
+
78
+    /**
79
+     * Résultat de la compilation: toujours une expression PHP
80
+     *
81
+     * @var string
82
+     */
83
+    public $code = '';
84 84
 }
85 85
 
86 86
 
@@ -90,44 +90,44 @@  discard block
 block discarded – undo
90 90
  * @package SPIP\Core\Compilateur\AST
91 91
  **/
92 92
 class Texte {
93
-	/**
94
-	 * Type de noeud
95
-	 *
96
-	 * @var string
97
-	 */
98
-	public $type = 'texte';
99
-
100
-	/**
101
-	 * Le texte
102
-	 *
103
-	 * @var string
104
-	 */
105
-	public $texte;
106
-
107
-	/**
108
-	 * Contenu avant le texte.
109
-	 *
110
-	 * Vide ou apostrophe simple ou double si le texte en était entouré
111
-	 *
112
-	 * @var string|array
113
-	 */
114
-	public $avant = '';
115
-
116
-	/**
117
-	 * Contenu après le texte.
118
-	 *
119
-	 * Vide ou apostrophe simple ou double si le texte en était entouré
120
-	 *
121
-	 * @var string|array
122
-	 */
123
-	public $apres = '';
124
-
125
-	/**
126
-	 * Numéro de ligne dans le code source du squelette
127
-	 *
128
-	 * @var int
129
-	 */
130
-	public $ligne = 0;
93
+    /**
94
+     * Type de noeud
95
+     *
96
+     * @var string
97
+     */
98
+    public $type = 'texte';
99
+
100
+    /**
101
+     * Le texte
102
+     *
103
+     * @var string
104
+     */
105
+    public $texte;
106
+
107
+    /**
108
+     * Contenu avant le texte.
109
+     *
110
+     * Vide ou apostrophe simple ou double si le texte en était entouré
111
+     *
112
+     * @var string|array
113
+     */
114
+    public $avant = '';
115
+
116
+    /**
117
+     * Contenu après le texte.
118
+     *
119
+     * Vide ou apostrophe simple ou double si le texte en était entouré
120
+     *
121
+     * @var string|array
122
+     */
123
+    public $apres = '';
124
+
125
+    /**
126
+     * Numéro de ligne dans le code source du squelette
127
+     *
128
+     * @var int
129
+     */
130
+    public $ligne = 0;
131 131
 }
132 132
 
133 133
 /**
@@ -136,50 +136,50 @@  discard block
 block discarded – undo
136 136
  * @package SPIP\Core\Compilateur\AST
137 137
  **/
138 138
 class Inclure {
139
-	/**
140
-	 * Type de noeud
141
-	 *
142
-	 * @var string
143
-	 */
144
-	public $type = 'include';
145
-
146
-	/**
147
-	 * Nom d'un fichier inclu
148
-	 *
149
-	 * - Objet Texte si inclusion d'un autre squelette
150
-	 * - chaîne si inclusion d'un fichier PHP directement
151
-	 *
152
-	 * @var string|Texte
153
-	 */
154
-	public $texte;
155
-
156
-	/**
157
-	 * Inutilisé, propriété générique de l'AST
158
-	 *
159
-	 * @var string|array
160
-	 */
161
-	public $avant = '';
162
-
163
-	/**
164
-	 * Inutilisé, propriété générique de l'AST
165
-	 *
166
-	 * @var string|array
167
-	 */
168
-	public $apres = '';
169
-
170
-	/**
171
-	 * Numéro de ligne dans le code source du squelette
172
-	 *
173
-	 * @var int
174
-	 */
175
-	public $ligne = 0;
176
-
177
-	/**
178
-	 * Valeurs des paramètres
179
-	 *
180
-	 * @var array
181
-	 */
182
-	public $param = [];
139
+    /**
140
+     * Type de noeud
141
+     *
142
+     * @var string
143
+     */
144
+    public $type = 'include';
145
+
146
+    /**
147
+     * Nom d'un fichier inclu
148
+     *
149
+     * - Objet Texte si inclusion d'un autre squelette
150
+     * - chaîne si inclusion d'un fichier PHP directement
151
+     *
152
+     * @var string|Texte
153
+     */
154
+    public $texte;
155
+
156
+    /**
157
+     * Inutilisé, propriété générique de l'AST
158
+     *
159
+     * @var string|array
160
+     */
161
+    public $avant = '';
162
+
163
+    /**
164
+     * Inutilisé, propriété générique de l'AST
165
+     *
166
+     * @var string|array
167
+     */
168
+    public $apres = '';
169
+
170
+    /**
171
+     * Numéro de ligne dans le code source du squelette
172
+     *
173
+     * @var int
174
+     */
175
+    public $ligne = 0;
176
+
177
+    /**
178
+     * Valeurs des paramètres
179
+     *
180
+     * @var array
181
+     */
182
+    public $param = [];
183 183
 }
184 184
 
185 185
 
@@ -189,386 +189,386 @@  discard block
 block discarded – undo
189 189
  * @package SPIP\Core\Compilateur\AST
190 190
  **/
191 191
 class Boucle {
192
-	/**
193
-	 * Type de noeud
194
-	 *
195
-	 * @var string
196
-	 */
197
-	public $type = 'boucle';
198
-
199
-	/**
200
-	 * Identifiant de la boucle
201
-	 *
202
-	 * @var string
203
-	 */
204
-	public $id_boucle;
205
-
206
-	/**
207
-	 * Identifiant de la boucle parente
208
-	 *
209
-	 * @var string
210
-	 */
211
-	public $id_parent = '';
212
-
213
-	/**
214
-	 * Partie avant toujours affichee
215
-	 *
216
-	 * @var string|array
217
-	 */
218
-	public $preaff = '';
219
-
220
-	/**
221
-	 * Partie optionnelle avant
222
-	 *
223
-	 * @var string|array
224
-	 */
225
-	public $avant = '';
226
-
227
-	/**
228
-	 * Pour chaque élément
229
-	 *
230
-	 * @var string|array
231
-	 */
232
-	public $milieu = '';
233
-
234
-	/**
235
-	 * Partie optionnelle après
236
-	 *
237
-	 * @var string|array
238
-	 */
239
-	public $apres = '';
240
-
241
-	/**
242
-	 * Partie alternative, si pas de résultat dans la boucle
243
-	 *
244
-	 * @var string|array
245
-	 */
246
-	public $altern = '';
247
-
248
-	/**
249
-	 * Partie apres toujours affichee
250
-	 *
251
-	 * @var string|array
252
-	 */
253
-	public $postaff = '';
254
-
255
-
256
-	/**
257
-	 * La boucle doit-elle sélectionner la langue ?
258
-	 *
259
-	 * @var string|null
260
-	 */
261
-	public $lang_select;
262
-
263
-	/**
264
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
265
-	 *
266
-	 * @var string|null
267
-	 */
268
-	public $type_requete;
269
-
270
-	/**
271
-	 * La table est elle optionnelle ?
272
-	 *
273
-	 * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente
274
-	 *
275
-	 * @var bool
276
-	 */
277
-	public $table_optionnelle = false;
278
-
279
-	/**
280
-	 * Nom du fichier de connexion
281
-	 *
282
-	 * @var string
283
-	 */
284
-	public $sql_serveur = '';
285
-
286
-	/**
287
-	 * Paramètres de la boucle
288
-	 *
289
-	 * Description des paramètres passés à la boucle, qui servent ensuite
290
-	 * au calcul des critères
291
-	 *
292
-	 * @var array
293
-	 */
294
-	public $param = [];
295
-
296
-	/**
297
-	 * Critères de la boucle
298
-	 *
299
-	 * @var Critere[]
300
-	 */
301
-	public $criteres = [];
302
-
303
-	/**
304
-	 * Textes insérés entre 2 éléments de boucle (critère inter)
305
-	 *
306
-	 * @var string[]
307
-	 */
308
-	public $separateur = [];
309
-
310
-	/**
311
-	 * Liste des jointures possibles avec cette table
312
-	 *
313
-	 * Les jointures par défaut de la table sont complétées en priorité
314
-	 * des jointures déclarées explicitement sur la boucle
315
-	 *
316
-	 * @see base_trouver_table_dist()
317
-	 * @var array
318
-	 */
319
-	public $jointures = [];
320
-
321
-	/**
322
-	 * Jointures explicites avec cette table
323
-	 *
324
-	 * Ces jointures sont utilisées en priorité par rapport aux jointures
325
-	 * normales possibles pour retrouver les colonnes demandées extérieures
326
-	 * à la boucle.
327
-	 *
328
-	 * @var string|bool
329
-	 */
330
-	public $jointures_explicites = false;
331
-
332
-	/**
333
-	 * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index"
334
-	 *
335
-	 * @var string|null
336
-	 */
337
-	public $doublons;
338
-
339
-	/**
340
-	 * Code PHP ajouté au début de chaque itération de boucle.
341
-	 *
342
-	 * Utilisé entre autre par les critères {pagination}, {n-a,b}, {a/b}...
343
-	 *
344
-	 * @var string
345
-	 */
346
-	public $partie = '';
347
-
348
-	/**
349
-	 * Nombre de divisions de la boucle, d'éléments à afficher,
350
-	 * ou de soustractions d'éléments à faire
351
-	 *
352
-	 * Dans les critères limitant le nombre d'éléments affichés
353
-	 * {a,b}, {a,n-b}, {a/b}, {pagination b}, b est affecté à total_parties.
354
-	 *
355
-	 * @var string
356
-	 */
357
-	public $total_parties = '';
358
-
359
-	/**
360
-	 * Code PHP ajouté avant l'itération de boucle.
361
-	 *
362
-	 * Utilisé entre autre par les critères {pagination}, {a,b}, {a/b}
363
-	 * pour initialiser les variables de début et de fin d'itération.
364
-	 *
365
-	 * @var string
366
-	 */
367
-	public $mode_partie = '';
368
-
369
-	/**
370
-	 * Identifiant d'une boucle qui appelle celle-ci de manière récursive
371
-	 *
372
-	 * Si une boucle est appelée de manière récursive quelque part par
373
-	 * une autre boucle comme <BOUCLE_rec(boucle_identifiant) />, cette
374
-	 * boucle (identifiant) reçoit dans cette propriété l'identifiant
375
-	 * de l'appelant (rec)
376
-	 *
377
-	 * @var string
378
-	 */
379
-	public $externe = '';
380
-
381
-	// champs pour la construction de la requete SQL
382
-
383
-	/**
384
-	 * Liste des champs à récupérer par la boucle
385
-	 *
386
-	 * Expression 'table.nom_champ' ou calculée 'nom_champ AS x'
387
-	 *
388
-	 * @var string[]
389
-	 */
390
-	public $select = [];
391
-
392
-	/**
393
-	 * Liste des alias / tables SQL utilisées dans la boucle
394
-	 *
395
-	 * L'index est un identifiant (xx dans spip_xx assez souvent) qui servira
396
-	 * d'alias au nom de la table ; la valeur est le nom de la table SQL désirée.
397
-	 *
398
-	 * L'index 0 peut définir le type de sources de données de l'itérateur DATA
399
-	 *
400
-	 * @var string[]
401
-	 */
402
-	public $from = [];
403
-
404
-	/**
405
-	 * Liste des alias / type de jointures utilisées dans la boucle
406
-	 *
407
-	 * L'index est le nom d'alias (comme pour la propriété $from), et la valeur
408
-	 * un type de jointure parmi 'INNER', 'LEFT', 'RIGHT', 'OUTER'.
409
-	 *
410
-	 * Lorsque le type n'est pas déclaré pour un alias, c'est 'INNER'
411
-	 * qui sera utilisé par défaut (créant donc un INNER JOIN).
412
-	 *
413
-	 * @var string[]
414
-	 */
415
-	public $from_type = [];
416
-
417
-	/**
418
-	 * Liste des conditions WHERE de la boucle
419
-	 *
420
-	 * Permet de restreindre les éléments retournés par une boucle
421
-	 * en fonctions des conditions transmises dans ce tableau.
422
-	 *
423
-	 * Ce tableau peut avoir plusieurs niveaux de profondeur.
424
-	 *
425
-	 * Les éléments du premier niveau sont reliés par des AND, donc
426
-	 * chaque élément ajouté directement au where par
427
-	 * $boucle->where[] = array(...) ou $boucle->where[] = "'expression'"
428
-	 * est une condition AND en plus.
429
-	 *
430
-	 * Par contre, lorsqu'on indique un tableau, il peut décrire des relations
431
-	 * internes différentes. Soit $expr un tableau d'expressions quelconques de 3 valeurs :
432
-	 * $expr = array(operateur, val1, val2)
433
-	 *
434
-	 * Ces 3 valeurs sont des expressions PHP. L'index 0 désigne l'opérateur
435
-	 * à réaliser tel que :
436
-	 *
437
-	 * - "'='" , "'>='", "'<'", "'IN'", "'REGEXP'", "'LIKE'", ... :
438
-	 *    val1 et val2 sont des champs et valeurs à utiliser dans la comparaison
439
-	 *    suivant cet ordre : "val1 operateur val2".
440
-	 *    Exemple : $boucle->where[] = array("'='", "'articles.statut'", "'\"publie\"'");
441
-	 * - "'AND'", "'OR'", "'NOT'" :
442
-	 *    dans ce cas val1 et val2 sont également des expressions
443
-	 *    de comparaison complètes, et peuvent être eux-même des tableaux comme $expr
444
-	 *    Exemples :
445
-	 *    $boucle->where[] = array("'OR'", $expr1, $expr2);
446
-	 *    $boucle->where[] = array("'NOT'", $expr); // val2 n'existe pas avec NOT
447
-	 *
448
-	 * D'autres noms sont possibles pour l'opérateur (le nombre de valeurs diffère) :
449
-	 * - "'SELF'", "'SUBSELECT'" : indiquent des sous requêtes
450
-	 * - "'?'" : indique une condition à faire évaluer (val1 ? val2 : val3)
451
-	 *
452
-	 * @var array
453
-	 */
454
-	public $where = [];
455
-
456
-	public $join = [];
457
-	public $having = [];
458
-	public $limit;
459
-	public $group = [];
460
-	public $order = [];
461
-	public $default_order = [];
462
-	public $date = 'date';
463
-	public $hash = '';
464
-	public $in = '';
465
-	public $sous_requete = false;
466
-
467
-	/**
468
-	 * Code PHP qui sera ajouté en tout début de la fonction de boucle
469
-	 *
470
-	 * Il sert à insérer le code calculant une hierarchie
471
-	 *
472
-	 * @var string
473
-	 */
474
-	public $hierarchie = '';
475
-
476
-	// champs pour la construction du corps PHP
477
-
478
-	/**
479
-	 * Description des sources de données de la boucle
480
-	 *
481
-	 * Description des données de la boucle issu de trouver_table
482
-	 * dans le cadre de l'itérateur SQL et contenant au moins l'index 'field'.
483
-	 *
484
-	 * @see base_trouver_table_dist()
485
-	 * @var array
486
-	 */
487
-	public $show = [];
488
-
489
-	/**
490
-	 * Nom de la table SQL principale de la boucle, sans son préfixe
491
-	 *
492
-	 * @var string
493
-	 */
494
-	public $id_table;
495
-
496
-	/**
497
-	 * Nom de la clé primaire de la table SQL principale de la boucle
498
-	 *
499
-	 * @var string
500
-	 */
501
-	public $primary;
502
-
503
-	/**
504
-	 * Code PHP compilé de la boucle
505
-	 *
506
-	 * @var string
507
-	 */
508
-	public $return;
509
-
510
-	public $numrows = false;
511
-	public $cptrows = false;
512
-
513
-	/**
514
-	 * Description du squelette
515
-	 *
516
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
517
-	 *
518
-	 * Peut contenir les index :
519
-	 *
520
-	 * - nom : Nom du fichier de cache
521
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
522
-	 * - sourcefile : Chemin du squelette
523
-	 * - squelette : Code du squelette
524
-	 * - id_mere : Identifiant de la boucle parente
525
-	 * - documents : Pour embed et img dans les textes
526
-	 * - session : Pour un cache sessionné par auteur
527
-	 * - niv : Niveau de tabulation
528
-	 *
529
-	 * @var array
530
-	 */
531
-	public $descr = [];
532
-
533
-	/**
534
-	 * Numéro de ligne dans le code source du squelette
535
-	 *
536
-	 * @var int
537
-	 */
538
-	public $ligne = 0;
539
-
540
-
541
-	public $modificateur = []; // table pour stocker les modificateurs de boucle tels que tout, plat ..., utilisable par les plugins egalement
542
-
543
-	/**
544
-	 * Type d'itérateur utilisé pour cette boucle
545
-	 *
546
-	 * - 'SQL' dans le cadre d'une boucle sur une table SQL
547
-	 * - 'DATA' pour l'itérateur DATA, ...
548
-	 *
549
-	 * @var string
550
-	 */
551
-	public $iterateur = ''; // type d'iterateur
552
-
553
-	/**
554
-	 * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug
555
-	 */
556
-	public $debug = [];
557
-
558
-	/**
559
-	 * Index de la boucle dont le champ présent dans cette boucle est originaire,
560
-	 * notamment si le champ a été trouve dans une boucle parente
561
-	 *
562
-	 * Tableau nom du champ => index de boucle
563
-	 *
564
-	 * @var array $index_champ
565
-	*/
566
-	public $index_champ = [];
567
-
568
-	// obsoletes, conserves provisoirement pour compatibilite
569
-	public $tout = false;
570
-	public $plat = false;
571
-	public $lien = false;
192
+    /**
193
+     * Type de noeud
194
+     *
195
+     * @var string
196
+     */
197
+    public $type = 'boucle';
198
+
199
+    /**
200
+     * Identifiant de la boucle
201
+     *
202
+     * @var string
203
+     */
204
+    public $id_boucle;
205
+
206
+    /**
207
+     * Identifiant de la boucle parente
208
+     *
209
+     * @var string
210
+     */
211
+    public $id_parent = '';
212
+
213
+    /**
214
+     * Partie avant toujours affichee
215
+     *
216
+     * @var string|array
217
+     */
218
+    public $preaff = '';
219
+
220
+    /**
221
+     * Partie optionnelle avant
222
+     *
223
+     * @var string|array
224
+     */
225
+    public $avant = '';
226
+
227
+    /**
228
+     * Pour chaque élément
229
+     *
230
+     * @var string|array
231
+     */
232
+    public $milieu = '';
233
+
234
+    /**
235
+     * Partie optionnelle après
236
+     *
237
+     * @var string|array
238
+     */
239
+    public $apres = '';
240
+
241
+    /**
242
+     * Partie alternative, si pas de résultat dans la boucle
243
+     *
244
+     * @var string|array
245
+     */
246
+    public $altern = '';
247
+
248
+    /**
249
+     * Partie apres toujours affichee
250
+     *
251
+     * @var string|array
252
+     */
253
+    public $postaff = '';
254
+
255
+
256
+    /**
257
+     * La boucle doit-elle sélectionner la langue ?
258
+     *
259
+     * @var string|null
260
+     */
261
+    public $lang_select;
262
+
263
+    /**
264
+     * Alias de table d'application de la requête ou nom complet de la table SQL
265
+     *
266
+     * @var string|null
267
+     */
268
+    public $type_requete;
269
+
270
+    /**
271
+     * La table est elle optionnelle ?
272
+     *
273
+     * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente
274
+     *
275
+     * @var bool
276
+     */
277
+    public $table_optionnelle = false;
278
+
279
+    /**
280
+     * Nom du fichier de connexion
281
+     *
282
+     * @var string
283
+     */
284
+    public $sql_serveur = '';
285
+
286
+    /**
287
+     * Paramètres de la boucle
288
+     *
289
+     * Description des paramètres passés à la boucle, qui servent ensuite
290
+     * au calcul des critères
291
+     *
292
+     * @var array
293
+     */
294
+    public $param = [];
295
+
296
+    /**
297
+     * Critères de la boucle
298
+     *
299
+     * @var Critere[]
300
+     */
301
+    public $criteres = [];
302
+
303
+    /**
304
+     * Textes insérés entre 2 éléments de boucle (critère inter)
305
+     *
306
+     * @var string[]
307
+     */
308
+    public $separateur = [];
309
+
310
+    /**
311
+     * Liste des jointures possibles avec cette table
312
+     *
313
+     * Les jointures par défaut de la table sont complétées en priorité
314
+     * des jointures déclarées explicitement sur la boucle
315
+     *
316
+     * @see base_trouver_table_dist()
317
+     * @var array
318
+     */
319
+    public $jointures = [];
320
+
321
+    /**
322
+     * Jointures explicites avec cette table
323
+     *
324
+     * Ces jointures sont utilisées en priorité par rapport aux jointures
325
+     * normales possibles pour retrouver les colonnes demandées extérieures
326
+     * à la boucle.
327
+     *
328
+     * @var string|bool
329
+     */
330
+    public $jointures_explicites = false;
331
+
332
+    /**
333
+     * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index"
334
+     *
335
+     * @var string|null
336
+     */
337
+    public $doublons;
338
+
339
+    /**
340
+     * Code PHP ajouté au début de chaque itération de boucle.
341
+     *
342
+     * Utilisé entre autre par les critères {pagination}, {n-a,b}, {a/b}...
343
+     *
344
+     * @var string
345
+     */
346
+    public $partie = '';
347
+
348
+    /**
349
+     * Nombre de divisions de la boucle, d'éléments à afficher,
350
+     * ou de soustractions d'éléments à faire
351
+     *
352
+     * Dans les critères limitant le nombre d'éléments affichés
353
+     * {a,b}, {a,n-b}, {a/b}, {pagination b}, b est affecté à total_parties.
354
+     *
355
+     * @var string
356
+     */
357
+    public $total_parties = '';
358
+
359
+    /**
360
+     * Code PHP ajouté avant l'itération de boucle.
361
+     *
362
+     * Utilisé entre autre par les critères {pagination}, {a,b}, {a/b}
363
+     * pour initialiser les variables de début et de fin d'itération.
364
+     *
365
+     * @var string
366
+     */
367
+    public $mode_partie = '';
368
+
369
+    /**
370
+     * Identifiant d'une boucle qui appelle celle-ci de manière récursive
371
+     *
372
+     * Si une boucle est appelée de manière récursive quelque part par
373
+     * une autre boucle comme <BOUCLE_rec(boucle_identifiant) />, cette
374
+     * boucle (identifiant) reçoit dans cette propriété l'identifiant
375
+     * de l'appelant (rec)
376
+     *
377
+     * @var string
378
+     */
379
+    public $externe = '';
380
+
381
+    // champs pour la construction de la requete SQL
382
+
383
+    /**
384
+     * Liste des champs à récupérer par la boucle
385
+     *
386
+     * Expression 'table.nom_champ' ou calculée 'nom_champ AS x'
387
+     *
388
+     * @var string[]
389
+     */
390
+    public $select = [];
391
+
392
+    /**
393
+     * Liste des alias / tables SQL utilisées dans la boucle
394
+     *
395
+     * L'index est un identifiant (xx dans spip_xx assez souvent) qui servira
396
+     * d'alias au nom de la table ; la valeur est le nom de la table SQL désirée.
397
+     *
398
+     * L'index 0 peut définir le type de sources de données de l'itérateur DATA
399
+     *
400
+     * @var string[]
401
+     */
402
+    public $from = [];
403
+
404
+    /**
405
+     * Liste des alias / type de jointures utilisées dans la boucle
406
+     *
407
+     * L'index est le nom d'alias (comme pour la propriété $from), et la valeur
408
+     * un type de jointure parmi 'INNER', 'LEFT', 'RIGHT', 'OUTER'.
409
+     *
410
+     * Lorsque le type n'est pas déclaré pour un alias, c'est 'INNER'
411
+     * qui sera utilisé par défaut (créant donc un INNER JOIN).
412
+     *
413
+     * @var string[]
414
+     */
415
+    public $from_type = [];
416
+
417
+    /**
418
+     * Liste des conditions WHERE de la boucle
419
+     *
420
+     * Permet de restreindre les éléments retournés par une boucle
421
+     * en fonctions des conditions transmises dans ce tableau.
422
+     *
423
+     * Ce tableau peut avoir plusieurs niveaux de profondeur.
424
+     *
425
+     * Les éléments du premier niveau sont reliés par des AND, donc
426
+     * chaque élément ajouté directement au where par
427
+     * $boucle->where[] = array(...) ou $boucle->where[] = "'expression'"
428
+     * est une condition AND en plus.
429
+     *
430
+     * Par contre, lorsqu'on indique un tableau, il peut décrire des relations
431
+     * internes différentes. Soit $expr un tableau d'expressions quelconques de 3 valeurs :
432
+     * $expr = array(operateur, val1, val2)
433
+     *
434
+     * Ces 3 valeurs sont des expressions PHP. L'index 0 désigne l'opérateur
435
+     * à réaliser tel que :
436
+     *
437
+     * - "'='" , "'>='", "'<'", "'IN'", "'REGEXP'", "'LIKE'", ... :
438
+     *    val1 et val2 sont des champs et valeurs à utiliser dans la comparaison
439
+     *    suivant cet ordre : "val1 operateur val2".
440
+     *    Exemple : $boucle->where[] = array("'='", "'articles.statut'", "'\"publie\"'");
441
+     * - "'AND'", "'OR'", "'NOT'" :
442
+     *    dans ce cas val1 et val2 sont également des expressions
443
+     *    de comparaison complètes, et peuvent être eux-même des tableaux comme $expr
444
+     *    Exemples :
445
+     *    $boucle->where[] = array("'OR'", $expr1, $expr2);
446
+     *    $boucle->where[] = array("'NOT'", $expr); // val2 n'existe pas avec NOT
447
+     *
448
+     * D'autres noms sont possibles pour l'opérateur (le nombre de valeurs diffère) :
449
+     * - "'SELF'", "'SUBSELECT'" : indiquent des sous requêtes
450
+     * - "'?'" : indique une condition à faire évaluer (val1 ? val2 : val3)
451
+     *
452
+     * @var array
453
+     */
454
+    public $where = [];
455
+
456
+    public $join = [];
457
+    public $having = [];
458
+    public $limit;
459
+    public $group = [];
460
+    public $order = [];
461
+    public $default_order = [];
462
+    public $date = 'date';
463
+    public $hash = '';
464
+    public $in = '';
465
+    public $sous_requete = false;
466
+
467
+    /**
468
+     * Code PHP qui sera ajouté en tout début de la fonction de boucle
469
+     *
470
+     * Il sert à insérer le code calculant une hierarchie
471
+     *
472
+     * @var string
473
+     */
474
+    public $hierarchie = '';
475
+
476
+    // champs pour la construction du corps PHP
477
+
478
+    /**
479
+     * Description des sources de données de la boucle
480
+     *
481
+     * Description des données de la boucle issu de trouver_table
482
+     * dans le cadre de l'itérateur SQL et contenant au moins l'index 'field'.
483
+     *
484
+     * @see base_trouver_table_dist()
485
+     * @var array
486
+     */
487
+    public $show = [];
488
+
489
+    /**
490
+     * Nom de la table SQL principale de la boucle, sans son préfixe
491
+     *
492
+     * @var string
493
+     */
494
+    public $id_table;
495
+
496
+    /**
497
+     * Nom de la clé primaire de la table SQL principale de la boucle
498
+     *
499
+     * @var string
500
+     */
501
+    public $primary;
502
+
503
+    /**
504
+     * Code PHP compilé de la boucle
505
+     *
506
+     * @var string
507
+     */
508
+    public $return;
509
+
510
+    public $numrows = false;
511
+    public $cptrows = false;
512
+
513
+    /**
514
+     * Description du squelette
515
+     *
516
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
517
+     *
518
+     * Peut contenir les index :
519
+     *
520
+     * - nom : Nom du fichier de cache
521
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
522
+     * - sourcefile : Chemin du squelette
523
+     * - squelette : Code du squelette
524
+     * - id_mere : Identifiant de la boucle parente
525
+     * - documents : Pour embed et img dans les textes
526
+     * - session : Pour un cache sessionné par auteur
527
+     * - niv : Niveau de tabulation
528
+     *
529
+     * @var array
530
+     */
531
+    public $descr = [];
532
+
533
+    /**
534
+     * Numéro de ligne dans le code source du squelette
535
+     *
536
+     * @var int
537
+     */
538
+    public $ligne = 0;
539
+
540
+
541
+    public $modificateur = []; // table pour stocker les modificateurs de boucle tels que tout, plat ..., utilisable par les plugins egalement
542
+
543
+    /**
544
+     * Type d'itérateur utilisé pour cette boucle
545
+     *
546
+     * - 'SQL' dans le cadre d'une boucle sur une table SQL
547
+     * - 'DATA' pour l'itérateur DATA, ...
548
+     *
549
+     * @var string
550
+     */
551
+    public $iterateur = ''; // type d'iterateur
552
+
553
+    /**
554
+     * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug
555
+     */
556
+    public $debug = [];
557
+
558
+    /**
559
+     * Index de la boucle dont le champ présent dans cette boucle est originaire,
560
+     * notamment si le champ a été trouve dans une boucle parente
561
+     *
562
+     * Tableau nom du champ => index de boucle
563
+     *
564
+     * @var array $index_champ
565
+     */
566
+    public $index_champ = [];
567
+
568
+    // obsoletes, conserves provisoirement pour compatibilite
569
+    public $tout = false;
570
+    public $plat = false;
571
+    public $lien = false;
572 572
 }
573 573
 
574 574
 /**
@@ -579,56 +579,56 @@  discard block
 block discarded – undo
579 579
  * @package SPIP\Core\Compilateur\AST
580 580
  **/
581 581
 class Critere {
582
-	/**
583
-	 * Type de noeud
584
-	 *
585
-	 * @var string
586
-	 */
587
-	public $type = 'critere';
588
-
589
-	/**
590
-	 * Opérateur (>, <, >=, IN, ...)
591
-	 *
592
-	 * @var null|string
593
-	 */
594
-	public $op;
595
-
596
-	/**
597
-	 * Présence d'une négation (truc !op valeur)
598
-	 *
599
-	 * @var null|string
600
-	 */
601
-	public $not;
602
-
603
-	/**
604
-	 * Présence d'une exclusion (!truc op valeur)
605
-	 *
606
-	 * @var null|string
607
-	 */
608
-	public $exclus;
609
-
610
-	/**
611
-	 * Présence d'une condition dans le critère (truc ?)
612
-	 *
613
-	 * @var bool
614
-	 */
615
-	public $cond = false;
616
-
617
-	/**
618
-	 * Paramètres du critère
619
-	 * - $param[0] : élément avant l'opérateur
620
-	 * - $param[1..n] : éléments après l'opérateur
621
-	 *
622
-	 * @var array
623
-	 */
624
-	public $param = [];
625
-
626
-	/**
627
-	 * Numéro de ligne dans le code source du squelette
628
-	 *
629
-	 * @var int
630
-	 */
631
-	public $ligne = 0;
582
+    /**
583
+     * Type de noeud
584
+     *
585
+     * @var string
586
+     */
587
+    public $type = 'critere';
588
+
589
+    /**
590
+     * Opérateur (>, <, >=, IN, ...)
591
+     *
592
+     * @var null|string
593
+     */
594
+    public $op;
595
+
596
+    /**
597
+     * Présence d'une négation (truc !op valeur)
598
+     *
599
+     * @var null|string
600
+     */
601
+    public $not;
602
+
603
+    /**
604
+     * Présence d'une exclusion (!truc op valeur)
605
+     *
606
+     * @var null|string
607
+     */
608
+    public $exclus;
609
+
610
+    /**
611
+     * Présence d'une condition dans le critère (truc ?)
612
+     *
613
+     * @var bool
614
+     */
615
+    public $cond = false;
616
+
617
+    /**
618
+     * Paramètres du critère
619
+     * - $param[0] : élément avant l'opérateur
620
+     * - $param[1..n] : éléments après l'opérateur
621
+     *
622
+     * @var array
623
+     */
624
+    public $param = [];
625
+
626
+    /**
627
+     * Numéro de ligne dans le code source du squelette
628
+     *
629
+     * @var int
630
+     */
631
+    public $ligne = 0;
632 632
 }
633 633
 
634 634
 /**
@@ -637,139 +637,139 @@  discard block
 block discarded – undo
637 637
  * @package SPIP\Core\Compilateur\AST
638 638
  **/
639 639
 class Champ {
640
-	/**
641
-	 * Type de noeud
642
-	 *
643
-	 * @var string
644
-	 */
645
-	public $type = 'champ';
646
-
647
-	/**
648
-	 * Nom du champ demandé. Exemple 'ID_ARTICLE'
649
-	 *
650
-	 * @var string|null
651
-	 */
652
-	public $nom_champ;
653
-
654
-	/**
655
-	 * Identifiant de la boucle parente si explicité
656
-	 *
657
-	 * @var string|null
658
-	 */
659
-	public $nom_boucle = '';
660
-
661
-	/**
662
-	 * Partie optionnelle avant
663
-	 *
664
-	 * @var null|string|array
665
-	 */
666
-	public $avant;
667
-
668
-	/**
669
-	 * Partie optionnelle après
670
-	 *
671
-	 * @var null|string|array
672
-	 */
673
-	public $apres;
674
-
675
-	/**
676
-	 * Étoiles : annuler des automatismes
677
-	 *
678
-	 * - '*' annule les filtres automatiques
679
-	 * - '**' annule en plus les protections de scripts
680
-	 *
681
-	 * @var null|string
682
-	 */
683
-	public $etoile;
684
-
685
-	/**
686
-	 * Arguments et filtres explicites sur la balise
687
-	 *
688
-	 * - $param[0] contient les arguments de la balise
689
-	 * - $param[1..n] contient les filtres à appliquer à la balise
690
-	 *
691
-	 * @var array
692
-	 */
693
-	public $param = [];
694
-
695
-	/**
696
-	 * Source des filtres  (compatibilité) (?)
697
-	 *
698
-	 * @var array|null
699
-	 */
700
-	public $fonctions = [];
701
-
702
-	/**
703
-	 * Identifiant de la boucle
704
-	 *
705
-	 * @var string
706
-	 */
707
-	public $id_boucle = '';
708
-
709
-	/**
710
-	 * AST du squelette, liste de toutes les boucles
711
-	 *
712
-	 * @var Boucles[]
713
-	 */
714
-	public $boucles;
715
-
716
-	/**
717
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
718
-	 *
719
-	 * @var string|null
720
-	 */
721
-	public $type_requete;
722
-
723
-	/**
724
-	 * Résultat de la compilation: toujours une expression PHP
725
-	 *
726
-	 * @var string
727
-	 */
728
-	public $code = '';
729
-
730
-	/**
731
-	 * Interdire les scripts
732
-	 *
733
-	 * false si on est sûr de cette balise
734
-	 *
735
-	 * @see interdire_scripts()
736
-	 * @var bool
737
-	 */
738
-	public $interdire_scripts = true;
739
-
740
-	/**
741
-	 * Description du squelette
742
-	 *
743
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
744
-	 *
745
-	 * Peut contenir les index :
746
-	 *
747
-	 * - nom : Nom du fichier de cache
748
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
749
-	 * - sourcefile : Chemin du squelette
750
-	 * - squelette : Code du squelette
751
-	 * - id_mere : Identifiant de la boucle parente
752
-	 * - documents : Pour embed et img dans les textes
753
-	 * - session : Pour un cache sessionné par auteur
754
-	 * - niv : Niveau de tabulation
755
-	 *
756
-	 * @var array
757
-	 */
758
-	public $descr = [];
759
-
760
-	/**
761
-	 * Numéro de ligne dans le code source du squelette
762
-	 *
763
-	 * @var int
764
-	 */
765
-	public $ligne = 0;
766
-
767
-	/**
768
-	 * Drapeau pour reperer les balises calculées par une fonction explicite
769
-	 *
770
-	 * @var bool
771
-	 */
772
-	public $balise_calculee = false;
640
+    /**
641
+     * Type de noeud
642
+     *
643
+     * @var string
644
+     */
645
+    public $type = 'champ';
646
+
647
+    /**
648
+     * Nom du champ demandé. Exemple 'ID_ARTICLE'
649
+     *
650
+     * @var string|null
651
+     */
652
+    public $nom_champ;
653
+
654
+    /**
655
+     * Identifiant de la boucle parente si explicité
656
+     *
657
+     * @var string|null
658
+     */
659
+    public $nom_boucle = '';
660
+
661
+    /**
662
+     * Partie optionnelle avant
663
+     *
664
+     * @var null|string|array
665
+     */
666
+    public $avant;
667
+
668
+    /**
669
+     * Partie optionnelle après
670
+     *
671
+     * @var null|string|array
672
+     */
673
+    public $apres;
674
+
675
+    /**
676
+     * Étoiles : annuler des automatismes
677
+     *
678
+     * - '*' annule les filtres automatiques
679
+     * - '**' annule en plus les protections de scripts
680
+     *
681
+     * @var null|string
682
+     */
683
+    public $etoile;
684
+
685
+    /**
686
+     * Arguments et filtres explicites sur la balise
687
+     *
688
+     * - $param[0] contient les arguments de la balise
689
+     * - $param[1..n] contient les filtres à appliquer à la balise
690
+     *
691
+     * @var array
692
+     */
693
+    public $param = [];
694
+
695
+    /**
696
+     * Source des filtres  (compatibilité) (?)
697
+     *
698
+     * @var array|null
699
+     */
700
+    public $fonctions = [];
701
+
702
+    /**
703
+     * Identifiant de la boucle
704
+     *
705
+     * @var string
706
+     */
707
+    public $id_boucle = '';
708
+
709
+    /**
710
+     * AST du squelette, liste de toutes les boucles
711
+     *
712
+     * @var Boucles[]
713
+     */
714
+    public $boucles;
715
+
716
+    /**
717
+     * Alias de table d'application de la requête ou nom complet de la table SQL
718
+     *
719
+     * @var string|null
720
+     */
721
+    public $type_requete;
722
+
723
+    /**
724
+     * Résultat de la compilation: toujours une expression PHP
725
+     *
726
+     * @var string
727
+     */
728
+    public $code = '';
729
+
730
+    /**
731
+     * Interdire les scripts
732
+     *
733
+     * false si on est sûr de cette balise
734
+     *
735
+     * @see interdire_scripts()
736
+     * @var bool
737
+     */
738
+    public $interdire_scripts = true;
739
+
740
+    /**
741
+     * Description du squelette
742
+     *
743
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
744
+     *
745
+     * Peut contenir les index :
746
+     *
747
+     * - nom : Nom du fichier de cache
748
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
749
+     * - sourcefile : Chemin du squelette
750
+     * - squelette : Code du squelette
751
+     * - id_mere : Identifiant de la boucle parente
752
+     * - documents : Pour embed et img dans les textes
753
+     * - session : Pour un cache sessionné par auteur
754
+     * - niv : Niveau de tabulation
755
+     *
756
+     * @var array
757
+     */
758
+    public $descr = [];
759
+
760
+    /**
761
+     * Numéro de ligne dans le code source du squelette
762
+     *
763
+     * @var int
764
+     */
765
+    public $ligne = 0;
766
+
767
+    /**
768
+     * Drapeau pour reperer les balises calculées par une fonction explicite
769
+     *
770
+     * @var bool
771
+     */
772
+    public $balise_calculee = false;
773 773
 }
774 774
 
775 775
 
@@ -777,123 +777,123 @@  discard block
 block discarded – undo
777 777
  * Description d'une chaîne de langue
778 778
  **/
779 779
 class Idiome {
780
-	/**
781
-	 * Type de noeud
782
-	 *
783
-	 * @var string
784
-	 */
785
-	public $type = 'idiome';
786
-
787
-	/**
788
-	 * Clé de traduction demandée. Exemple 'item_oui'
789
-	 *
790
-	 * @var string
791
-	 */
792
-	public $nom_champ = '';
793
-
794
-	/**
795
-	 * Module de langue où chercher la clé de traduction. Exemple 'medias'
796
-	 *
797
-	 * @var string
798
-	 */
799
-	public $module = '';
800
-
801
-	/**
802
-	 * Arguments à passer à la chaîne
803
-	 *
804
-	 * @var array
805
-	 */
806
-	public $arg = [];
807
-
808
-	/**
809
-	 * Filtres à appliquer au résultat
810
-	 *
811
-	 * @var array
812
-	 */
813
-	public $param = [];
814
-
815
-	/**
816
-	 * Source des filtres  (compatibilité) (?)
817
-	 *
818
-	 * @var array|null
819
-	 */
820
-	public $fonctions = [];
821
-
822
-	/**
823
-	 * Inutilisé, propriété générique de l'AST
824
-	 *
825
-	 * @var string|array
826
-	 */
827
-	public $avant = '';
828
-
829
-	/**
830
-	 * Inutilisé, propriété générique de l'AST
831
-	 *
832
-	 * @var string|array
833
-	 */
834
-	public $apres = '';
835
-
836
-	/**
837
-	 * Identifiant de la boucle
838
-	 *
839
-	 * @var string
840
-	 */
841
-	public $id_boucle = '';
842
-
843
-	/**
844
-	 * AST du squelette, liste de toutes les boucles
845
-	 *
846
-	 * @var Boucles[]
847
-	 */
848
-	public $boucles;
849
-
850
-	/**
851
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
852
-	 *
853
-	 * @var string|null
854
-	 */
855
-	public $type_requete;
856
-
857
-	/**
858
-	 * Résultat de la compilation: toujours une expression PHP
859
-	 *
860
-	 * @var string
861
-	 */
862
-	public $code = '';
863
-
864
-	/**
865
-	 * Interdire les scripts
866
-	 *
867
-	 * @see interdire_scripts()
868
-	 * @var bool
869
-	 */
870
-	public $interdire_scripts = false;
871
-
872
-	/**
873
-	 * Description du squelette
874
-	 *
875
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
876
-	 *
877
-	 * Peut contenir les index :
878
-	 * - nom : Nom du fichier de cache
879
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
880
-	 * - sourcefile : Chemin du squelette
881
-	 * - squelette : Code du squelette
882
-	 * - id_mere : Identifiant de la boucle parente
883
-	 * - documents : Pour embed et img dans les textes
884
-	 * - session : Pour un cache sessionné par auteur
885
-	 * - niv : Niveau de tabulation
886
-	 *
887
-	 * @var array
888
-	 */
889
-	public $descr = [];
890
-
891
-	/**
892
-	 * Numéro de ligne dans le code source du squelette
893
-	 *
894
-	 * @var int
895
-	 */
896
-	public $ligne = 0;
780
+    /**
781
+     * Type de noeud
782
+     *
783
+     * @var string
784
+     */
785
+    public $type = 'idiome';
786
+
787
+    /**
788
+     * Clé de traduction demandée. Exemple 'item_oui'
789
+     *
790
+     * @var string
791
+     */
792
+    public $nom_champ = '';
793
+
794
+    /**
795
+     * Module de langue où chercher la clé de traduction. Exemple 'medias'
796
+     *
797
+     * @var string
798
+     */
799
+    public $module = '';
800
+
801
+    /**
802
+     * Arguments à passer à la chaîne
803
+     *
804
+     * @var array
805
+     */
806
+    public $arg = [];
807
+
808
+    /**
809
+     * Filtres à appliquer au résultat
810
+     *
811
+     * @var array
812
+     */
813
+    public $param = [];
814
+
815
+    /**
816
+     * Source des filtres  (compatibilité) (?)
817
+     *
818
+     * @var array|null
819
+     */
820
+    public $fonctions = [];
821
+
822
+    /**
823
+     * Inutilisé, propriété générique de l'AST
824
+     *
825
+     * @var string|array
826
+     */
827
+    public $avant = '';
828
+
829
+    /**
830
+     * Inutilisé, propriété générique de l'AST
831
+     *
832
+     * @var string|array
833
+     */
834
+    public $apres = '';
835
+
836
+    /**
837
+     * Identifiant de la boucle
838
+     *
839
+     * @var string
840
+     */
841
+    public $id_boucle = '';
842
+
843
+    /**
844
+     * AST du squelette, liste de toutes les boucles
845
+     *
846
+     * @var Boucles[]
847
+     */
848
+    public $boucles;
849
+
850
+    /**
851
+     * Alias de table d'application de la requête ou nom complet de la table SQL
852
+     *
853
+     * @var string|null
854
+     */
855
+    public $type_requete;
856
+
857
+    /**
858
+     * Résultat de la compilation: toujours une expression PHP
859
+     *
860
+     * @var string
861
+     */
862
+    public $code = '';
863
+
864
+    /**
865
+     * Interdire les scripts
866
+     *
867
+     * @see interdire_scripts()
868
+     * @var bool
869
+     */
870
+    public $interdire_scripts = false;
871
+
872
+    /**
873
+     * Description du squelette
874
+     *
875
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
876
+     *
877
+     * Peut contenir les index :
878
+     * - nom : Nom du fichier de cache
879
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
880
+     * - sourcefile : Chemin du squelette
881
+     * - squelette : Code du squelette
882
+     * - id_mere : Identifiant de la boucle parente
883
+     * - documents : Pour embed et img dans les textes
884
+     * - session : Pour un cache sessionné par auteur
885
+     * - niv : Niveau de tabulation
886
+     *
887
+     * @var array
888
+     */
889
+    public $descr = [];
890
+
891
+    /**
892
+     * Numéro de ligne dans le code source du squelette
893
+     *
894
+     * @var int
895
+     */
896
+    public $ligne = 0;
897 897
 }
898 898
 
899 899
 /**
@@ -902,28 +902,28 @@  discard block
 block discarded – undo
902 902
  * @package SPIP\Core\Compilateur\AST
903 903
  **/
904 904
 class Polyglotte {
905
-	/**
906
-	 * Type de noeud
907
-	 *
908
-	 * @var string
909
-	 */
910
-	public $type = 'polyglotte';
911
-
912
-	/**
913
-	 * Tableau des traductions possibles classées par langue
914
-	 *
915
-	 * Tableau code de langue => texte
916
-	 *
917
-	 * @var array
918
-	 */
919
-	public $traductions = [];
920
-
921
-	/**
922
-	 * Numéro de ligne dans le code source du squelette
923
-	 *
924
-	 * @var int
925
-	 */
926
-	public $ligne = 0;
905
+    /**
906
+     * Type de noeud
907
+     *
908
+     * @var string
909
+     */
910
+    public $type = 'polyglotte';
911
+
912
+    /**
913
+     * Tableau des traductions possibles classées par langue
914
+     *
915
+     * Tableau code de langue => texte
916
+     *
917
+     * @var array
918
+     */
919
+    public $traductions = [];
920
+
921
+    /**
922
+     * Numéro de ligne dans le code source du squelette
923
+     *
924
+     * @var int
925
+     */
926
+    public $ligne = 0;
927 927
 }
928 928
 
929 929
 
@@ -948,88 +948,88 @@  discard block
 block discarded – undo
948 948
  */
949 949
 function declarer_interfaces() {
950 950
 
951
-	$GLOBALS['table_des_tables']['articles'] = 'articles';
952
-	$GLOBALS['table_des_tables']['auteurs'] = 'auteurs';
953
-	$GLOBALS['table_des_tables']['rubriques'] = 'rubriques';
954
-	$GLOBALS['table_des_tables']['hierarchie'] = 'rubriques';
955
-
956
-	// definition des statuts de publication
957
-	$GLOBALS['table_statut'] = [];
958
-
959
-	//
960
-	// tableau des tables de jointures
961
-	// Ex: gestion du critere {id_mot} dans la boucle(ARTICLES)
962
-	$GLOBALS['tables_jointures'] = [];
963
-	$GLOBALS['tables_jointures']['spip_jobs'][] = 'jobs_liens';
964
-
965
-	// $GLOBALS['exceptions_des_jointures']['titre_mot'] = array('spip_mots', 'titre'); // pour exemple
966
-	$GLOBALS['exceptions_des_jointures']['profondeur'] = ['spip_rubriques', 'profondeur'];
967
-
968
-
969
-	if (!defined('_TRAITEMENT_TYPO')) {
970
-		define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])');
971
-	}
972
-	if (!defined('_TRAITEMENT_RACCOURCIS')) {
973
-		define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])');
974
-	}
975
-	if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) {
976
-		define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s, "TYPO", $connect, $Pile[0]))');
977
-	}
978
-	$GLOBALS['table_des_traitements']['BIO'][] = _TRAITEMENT_RACCOURCIS;
979
-	$GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS;
980
-	$GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)';
981
-	$GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)';
982
-	$GLOBALS['table_des_traitements']['DATE_MODIF'][] = 'normaliser_date(%s)';
983
-	$GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][] = 'normaliser_date(%s)';
984
-	$GLOBALS['table_des_traitements']['DESCRIPTIF'][] = _TRAITEMENT_RACCOURCIS;
985
-	$GLOBALS['table_des_traitements']['INTRODUCTION'][] = _TRAITEMENT_RACCOURCIS;
986
-	$GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][] = _TRAITEMENT_TYPO;
987
-	$GLOBALS['table_des_traitements']['NOM'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
988
-	$GLOBALS['table_des_traitements']['AUTEUR'][] = _TRAITEMENT_TYPO;
989
-	$GLOBALS['table_des_traitements']['PS'][] = _TRAITEMENT_RACCOURCIS;
990
-	$GLOBALS['table_des_traitements']['SOURCE'][] = _TRAITEMENT_TYPO;
991
-	$GLOBALS['table_des_traitements']['SOUSTITRE'][] = _TRAITEMENT_TYPO;
992
-	$GLOBALS['table_des_traitements']['SURTITRE'][] = _TRAITEMENT_TYPO;
993
-	$GLOBALS['table_des_traitements']['TAGS'][] = '%s';
994
-	$GLOBALS['table_des_traitements']['TEXTE'][] = _TRAITEMENT_RACCOURCIS;
995
-	$GLOBALS['table_des_traitements']['TITRE'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
996
-	$GLOBALS['table_des_traitements']['TYPE'][] = _TRAITEMENT_TYPO;
997
-	$GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][] = _TRAITEMENT_RACCOURCIS;
998
-	$GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][] = _TRAITEMENT_TYPO;
999
-	$GLOBALS['table_des_traitements']['ENV'][] = 'entites_html(%s,true)';
1000
-
1001
-	// valeur par defaut pour les balises non listees ci-dessus
1002
-	$GLOBALS['table_des_traitements']['*'][] = false; // pas de traitement, mais permet au compilo de trouver la declaration suivante
1003
-	// toujours securiser les DATA
1004
-	$GLOBALS['table_des_traitements']['*']['DATA'] = 'safehtml(%s)';
1005
-	// expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all *
1006
-	$GLOBALS['table_des_traitements']['VALEUR']['DATA'] = 'safehtml(%s)';
1007
-
1008
-
1009
-	// gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales
1010
-	$interfaces = pipeline(
1011
-		'declarer_tables_interfaces',
1012
-		[
1013
-			'table_des_tables' => $GLOBALS['table_des_tables'],
1014
-			'exceptions_des_tables' => $GLOBALS['exceptions_des_tables'],
1015
-			'table_date' => $GLOBALS['table_date'],
1016
-			'table_titre' => $GLOBALS['table_titre'],
1017
-			'tables_jointures' => $GLOBALS['tables_jointures'],
1018
-			'exceptions_des_jointures' => $GLOBALS['exceptions_des_jointures'],
1019
-			'table_des_traitements' => $GLOBALS['table_des_traitements'],
1020
-			'table_statut' => $GLOBALS['table_statut'],
1021
-		]
1022
-	);
1023
-	if ($interfaces) {
1024
-		$GLOBALS['table_des_tables'] = $interfaces['table_des_tables'];
1025
-		$GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables'];
1026
-		$GLOBALS['table_date'] = $interfaces['table_date'];
1027
-		$GLOBALS['table_titre'] = $interfaces['table_titre'];
1028
-		$GLOBALS['tables_jointures'] = $interfaces['tables_jointures'];
1029
-		$GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures'];
1030
-		$GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements'];
1031
-		$GLOBALS['table_statut'] = $interfaces['table_statut'];
1032
-	}
951
+    $GLOBALS['table_des_tables']['articles'] = 'articles';
952
+    $GLOBALS['table_des_tables']['auteurs'] = 'auteurs';
953
+    $GLOBALS['table_des_tables']['rubriques'] = 'rubriques';
954
+    $GLOBALS['table_des_tables']['hierarchie'] = 'rubriques';
955
+
956
+    // definition des statuts de publication
957
+    $GLOBALS['table_statut'] = [];
958
+
959
+    //
960
+    // tableau des tables de jointures
961
+    // Ex: gestion du critere {id_mot} dans la boucle(ARTICLES)
962
+    $GLOBALS['tables_jointures'] = [];
963
+    $GLOBALS['tables_jointures']['spip_jobs'][] = 'jobs_liens';
964
+
965
+    // $GLOBALS['exceptions_des_jointures']['titre_mot'] = array('spip_mots', 'titre'); // pour exemple
966
+    $GLOBALS['exceptions_des_jointures']['profondeur'] = ['spip_rubriques', 'profondeur'];
967
+
968
+
969
+    if (!defined('_TRAITEMENT_TYPO')) {
970
+        define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])');
971
+    }
972
+    if (!defined('_TRAITEMENT_RACCOURCIS')) {
973
+        define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])');
974
+    }
975
+    if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) {
976
+        define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s, "TYPO", $connect, $Pile[0]))');
977
+    }
978
+    $GLOBALS['table_des_traitements']['BIO'][] = _TRAITEMENT_RACCOURCIS;
979
+    $GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS;
980
+    $GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)';
981
+    $GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)';
982
+    $GLOBALS['table_des_traitements']['DATE_MODIF'][] = 'normaliser_date(%s)';
983
+    $GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][] = 'normaliser_date(%s)';
984
+    $GLOBALS['table_des_traitements']['DESCRIPTIF'][] = _TRAITEMENT_RACCOURCIS;
985
+    $GLOBALS['table_des_traitements']['INTRODUCTION'][] = _TRAITEMENT_RACCOURCIS;
986
+    $GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][] = _TRAITEMENT_TYPO;
987
+    $GLOBALS['table_des_traitements']['NOM'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
988
+    $GLOBALS['table_des_traitements']['AUTEUR'][] = _TRAITEMENT_TYPO;
989
+    $GLOBALS['table_des_traitements']['PS'][] = _TRAITEMENT_RACCOURCIS;
990
+    $GLOBALS['table_des_traitements']['SOURCE'][] = _TRAITEMENT_TYPO;
991
+    $GLOBALS['table_des_traitements']['SOUSTITRE'][] = _TRAITEMENT_TYPO;
992
+    $GLOBALS['table_des_traitements']['SURTITRE'][] = _TRAITEMENT_TYPO;
993
+    $GLOBALS['table_des_traitements']['TAGS'][] = '%s';
994
+    $GLOBALS['table_des_traitements']['TEXTE'][] = _TRAITEMENT_RACCOURCIS;
995
+    $GLOBALS['table_des_traitements']['TITRE'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
996
+    $GLOBALS['table_des_traitements']['TYPE'][] = _TRAITEMENT_TYPO;
997
+    $GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][] = _TRAITEMENT_RACCOURCIS;
998
+    $GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][] = _TRAITEMENT_TYPO;
999
+    $GLOBALS['table_des_traitements']['ENV'][] = 'entites_html(%s,true)';
1000
+
1001
+    // valeur par defaut pour les balises non listees ci-dessus
1002
+    $GLOBALS['table_des_traitements']['*'][] = false; // pas de traitement, mais permet au compilo de trouver la declaration suivante
1003
+    // toujours securiser les DATA
1004
+    $GLOBALS['table_des_traitements']['*']['DATA'] = 'safehtml(%s)';
1005
+    // expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all *
1006
+    $GLOBALS['table_des_traitements']['VALEUR']['DATA'] = 'safehtml(%s)';
1007
+
1008
+
1009
+    // gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales
1010
+    $interfaces = pipeline(
1011
+        'declarer_tables_interfaces',
1012
+        [
1013
+            'table_des_tables' => $GLOBALS['table_des_tables'],
1014
+            'exceptions_des_tables' => $GLOBALS['exceptions_des_tables'],
1015
+            'table_date' => $GLOBALS['table_date'],
1016
+            'table_titre' => $GLOBALS['table_titre'],
1017
+            'tables_jointures' => $GLOBALS['tables_jointures'],
1018
+            'exceptions_des_jointures' => $GLOBALS['exceptions_des_jointures'],
1019
+            'table_des_traitements' => $GLOBALS['table_des_traitements'],
1020
+            'table_statut' => $GLOBALS['table_statut'],
1021
+        ]
1022
+    );
1023
+    if ($interfaces) {
1024
+        $GLOBALS['table_des_tables'] = $interfaces['table_des_tables'];
1025
+        $GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables'];
1026
+        $GLOBALS['table_date'] = $interfaces['table_date'];
1027
+        $GLOBALS['table_titre'] = $interfaces['table_titre'];
1028
+        $GLOBALS['tables_jointures'] = $interfaces['tables_jointures'];
1029
+        $GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures'];
1030
+        $GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements'];
1031
+        $GLOBALS['table_statut'] = $interfaces['table_statut'];
1032
+    }
1033 1033
 }
1034 1034
 
1035 1035
 declarer_interfaces();
Please login to merge, or discard this patch.