Completed
Pull Request — master (#34)
by
unknown
09:52 queued 04:14
created
ecrire/public/assembler.php 1 patch
Indentation   +532 added lines, -532 removed lines patch added patch discarded remove patch
@@ -20,155 +20,155 @@  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
 // http://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 = array('contexte_implicite' => calculer_contexte_implicite());
40
-	$page['contexte_implicite']['cache'] = $fond . preg_replace(',\.[a-zA-Z0-9]*$,', '',
41
-			preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI']));
42
-	// Cette fonction est utilisee deux fois
43
-	$cacher = charger_fonction('cacher', 'public', true);
44
-	// Les quatre derniers parametres sont modifies par la fonction:
45
-	// emplacement, validite, et, s'il est valide, contenu & age
46
-	if ($cacher) {
47
-		$res = $cacher($GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, $page, $lastmodified);
48
-	} else {
49
-		$GLOBALS['use_cache'] = -1;
50
-	}
51
-	// Si un resultat est retourne, c'est un message d'impossibilite
52
-	if ($res) {
53
-		return array('texte' => $res);
54
-	}
55
-
56
-	if (!$chemin_cache || !$lastmodified) {
57
-		$lastmodified = time();
58
-	}
59
-
60
-	$headers_only = ($_SERVER['REQUEST_METHOD'] == 'HEAD');
61
-	$calculer_page = true;
62
-
63
-	// Pour les pages non-dynamiques (indiquees par #CACHE{duree,cache-client})
64
-	// une perennite valide a meme reponse qu'une requete HEAD (par defaut les
65
-	// pages sont dynamiques)
66
-	if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
67
-		and (!defined('_VAR_MODE') or !_VAR_MODE)
68
-		and $chemin_cache
69
-		and isset($page['entetes'])
70
-		and isset($page['entetes']['Cache-Control'])
71
-		and strstr($page['entetes']['Cache-Control'], 'max-age=')
72
-		and !strstr($_SERVER['SERVER_SOFTWARE'], 'IIS/')
73
-	) {
74
-		$since = preg_replace('/;.*/', '',
75
-			$_SERVER['HTTP_IF_MODIFIED_SINCE']);
76
-		$since = str_replace('GMT', '', $since);
77
-		if (trim($since) == gmdate("D, d M Y H:i:s", $lastmodified)) {
78
-			$page['status'] = 304;
79
-			$headers_only = true;
80
-			$calculer_page = false;
81
-		}
82
-	}
83
-
84
-	// Si requete HEAD ou Last-modified compatible, ignorer le texte
85
-	// et pas de content-type (pour contrer le bouton admin de inc-public)
86
-	if (!$calculer_page) {
87
-		$page['texte'] = "";
88
-	} else {
89
-		// si la page est prise dans le cache
90
-		if (!$GLOBALS['use_cache']) {
91
-			// Informer les boutons d'admin du contexte
92
-			// (fourni par urls_decoder_url ci-dessous lors de la mise en cache)
93
-			$GLOBALS['contexte'] = $page['contexte'];
94
-
95
-			// vider les globales url propres qui ne doivent plus etre utilisees en cas
96
-			// d'inversion url => objet
97
-			// plus necessaire si on utilise bien la fonction urls_decoder_url
98
-			#unset($_SERVER['REDIRECT_url_propre']);
99
-			#unset($_ENV['url_propre']);
100
-		} else {
101
-			// Compat ascendante :
102
-			// 1. $contexte est global
103
-			// (a evacuer car urls_decoder_url gere ce probleme ?)
104
-			// et calculer la page
105
-			if (!test_espace_prive()) {
106
-				include_spip('inc/urls');
107
-				list($fond, $GLOBALS['contexte'], $url_redirect) = urls_decoder_url(nettoyer_uri(), $fond, $GLOBALS['contexte'],
108
-					true);
109
-			}
110
-			// squelette par defaut
111
-			if (!strlen($fond)) {
112
-				$fond = 'sommaire';
113
-			}
114
-
115
-			// produire la page : peut mettre a jour $lastmodified
116
-			$produire_page = charger_fonction('produire_page', 'public');
117
-			$page = $produire_page($fond, $GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, null, $page,
118
-				$lastmodified, $connect);
119
-			if ($page === '') {
120
-				$erreur = _T('info_erreur_squelette2',
121
-					array('fichier' => spip_htmlspecialchars($fond) . '.' . _EXTENSION_SQUELETTES));
122
-				erreur_squelette($erreur);
123
-				// eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
124
-				$page = array('texte' => '', 'erreur' => $erreur);
125
-			}
126
-		}
127
-
128
-		if ($page and $chemin_cache) {
129
-			$page['cache'] = $chemin_cache;
130
-		}
131
-
132
-		auto_content_type($page);
133
-
134
-		$GLOBALS['flag_preserver'] |= headers_sent();
135
-
136
-		// Definir les entetes si ce n'est fait 
137
-		if (!$GLOBALS['flag_preserver']) {
138
-			if ($GLOBALS['flag_ob']) {
139
-				// Si la page est vide, produire l'erreur 404 ou message d'erreur pour les inclusions
140
-				if (trim($page['texte']) === ''
141
-					and _VAR_MODE != 'debug'
142
-					and !isset($page['entetes']['Location']) // cette page realise une redirection, donc pas d'erreur
143
-				) {
144
-					$GLOBALS['contexte']['fond_erreur'] = $fond;
145
-					$page = message_page_indisponible($page, $GLOBALS['contexte']);
146
-				}
147
-				// pas de cache client en mode 'observation'
148
-				if (defined('_VAR_MODE') and _VAR_MODE) {
149
-					$page['entetes']["Cache-Control"] = "no-cache,must-revalidate";
150
-					$page['entetes']["Pragma"] = "no-cache";
151
-				}
152
-			}
153
-		}
154
-	}
155
-
156
-	// Entete Last-Modified:
157
-	// eviter d'etre incoherent en envoyant un lastmodified identique
158
-	// a celui qu'on a refuse d'honorer plus haut (cf. #655)
159
-	if ($lastmodified
160
-		and !isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
161
-		and !isset($page['entetes']["Last-Modified"])
162
-	) {
163
-		$page['entetes']["Last-Modified"] = gmdate("D, d M Y H:i:s", $lastmodified) . " GMT";
164
-	}
165
-
166
-	// fermer la connexion apres les headers si requete HEAD
167
-	if ($headers_only) {
168
-		$page['entetes']["Connection"] = "close";
169
-	}
170
-
171
-	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 = array('contexte_implicite' => calculer_contexte_implicite());
40
+    $page['contexte_implicite']['cache'] = $fond . preg_replace(',\.[a-zA-Z0-9]*$,', '',
41
+            preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI']));
42
+    // Cette fonction est utilisee deux fois
43
+    $cacher = charger_fonction('cacher', 'public', true);
44
+    // Les quatre derniers parametres sont modifies par la fonction:
45
+    // emplacement, validite, et, s'il est valide, contenu & age
46
+    if ($cacher) {
47
+        $res = $cacher($GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, $page, $lastmodified);
48
+    } else {
49
+        $GLOBALS['use_cache'] = -1;
50
+    }
51
+    // Si un resultat est retourne, c'est un message d'impossibilite
52
+    if ($res) {
53
+        return array('texte' => $res);
54
+    }
55
+
56
+    if (!$chemin_cache || !$lastmodified) {
57
+        $lastmodified = time();
58
+    }
59
+
60
+    $headers_only = ($_SERVER['REQUEST_METHOD'] == 'HEAD');
61
+    $calculer_page = true;
62
+
63
+    // Pour les pages non-dynamiques (indiquees par #CACHE{duree,cache-client})
64
+    // une perennite valide a meme reponse qu'une requete HEAD (par defaut les
65
+    // pages sont dynamiques)
66
+    if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
67
+        and (!defined('_VAR_MODE') or !_VAR_MODE)
68
+        and $chemin_cache
69
+        and isset($page['entetes'])
70
+        and isset($page['entetes']['Cache-Control'])
71
+        and strstr($page['entetes']['Cache-Control'], 'max-age=')
72
+        and !strstr($_SERVER['SERVER_SOFTWARE'], 'IIS/')
73
+    ) {
74
+        $since = preg_replace('/;.*/', '',
75
+            $_SERVER['HTTP_IF_MODIFIED_SINCE']);
76
+        $since = str_replace('GMT', '', $since);
77
+        if (trim($since) == gmdate("D, d M Y H:i:s", $lastmodified)) {
78
+            $page['status'] = 304;
79
+            $headers_only = true;
80
+            $calculer_page = false;
81
+        }
82
+    }
83
+
84
+    // Si requete HEAD ou Last-modified compatible, ignorer le texte
85
+    // et pas de content-type (pour contrer le bouton admin de inc-public)
86
+    if (!$calculer_page) {
87
+        $page['texte'] = "";
88
+    } else {
89
+        // si la page est prise dans le cache
90
+        if (!$GLOBALS['use_cache']) {
91
+            // Informer les boutons d'admin du contexte
92
+            // (fourni par urls_decoder_url ci-dessous lors de la mise en cache)
93
+            $GLOBALS['contexte'] = $page['contexte'];
94
+
95
+            // vider les globales url propres qui ne doivent plus etre utilisees en cas
96
+            // d'inversion url => objet
97
+            // plus necessaire si on utilise bien la fonction urls_decoder_url
98
+            #unset($_SERVER['REDIRECT_url_propre']);
99
+            #unset($_ENV['url_propre']);
100
+        } else {
101
+            // Compat ascendante :
102
+            // 1. $contexte est global
103
+            // (a evacuer car urls_decoder_url gere ce probleme ?)
104
+            // et calculer la page
105
+            if (!test_espace_prive()) {
106
+                include_spip('inc/urls');
107
+                list($fond, $GLOBALS['contexte'], $url_redirect) = urls_decoder_url(nettoyer_uri(), $fond, $GLOBALS['contexte'],
108
+                    true);
109
+            }
110
+            // squelette par defaut
111
+            if (!strlen($fond)) {
112
+                $fond = 'sommaire';
113
+            }
114
+
115
+            // produire la page : peut mettre a jour $lastmodified
116
+            $produire_page = charger_fonction('produire_page', 'public');
117
+            $page = $produire_page($fond, $GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, null, $page,
118
+                $lastmodified, $connect);
119
+            if ($page === '') {
120
+                $erreur = _T('info_erreur_squelette2',
121
+                    array('fichier' => spip_htmlspecialchars($fond) . '.' . _EXTENSION_SQUELETTES));
122
+                erreur_squelette($erreur);
123
+                // eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
124
+                $page = array('texte' => '', 'erreur' => $erreur);
125
+            }
126
+        }
127
+
128
+        if ($page and $chemin_cache) {
129
+            $page['cache'] = $chemin_cache;
130
+        }
131
+
132
+        auto_content_type($page);
133
+
134
+        $GLOBALS['flag_preserver'] |= headers_sent();
135
+
136
+        // Definir les entetes si ce n'est fait 
137
+        if (!$GLOBALS['flag_preserver']) {
138
+            if ($GLOBALS['flag_ob']) {
139
+                // Si la page est vide, produire l'erreur 404 ou message d'erreur pour les inclusions
140
+                if (trim($page['texte']) === ''
141
+                    and _VAR_MODE != 'debug'
142
+                    and !isset($page['entetes']['Location']) // cette page realise une redirection, donc pas d'erreur
143
+                ) {
144
+                    $GLOBALS['contexte']['fond_erreur'] = $fond;
145
+                    $page = message_page_indisponible($page, $GLOBALS['contexte']);
146
+                }
147
+                // pas de cache client en mode 'observation'
148
+                if (defined('_VAR_MODE') and _VAR_MODE) {
149
+                    $page['entetes']["Cache-Control"] = "no-cache,must-revalidate";
150
+                    $page['entetes']["Pragma"] = "no-cache";
151
+                }
152
+            }
153
+        }
154
+    }
155
+
156
+    // Entete Last-Modified:
157
+    // eviter d'etre incoherent en envoyant un lastmodified identique
158
+    // a celui qu'on a refuse d'honorer plus haut (cf. #655)
159
+    if ($lastmodified
160
+        and !isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
161
+        and !isset($page['entetes']["Last-Modified"])
162
+    ) {
163
+        $page['entetes']["Last-Modified"] = gmdate("D, d M Y H:i:s", $lastmodified) . " GMT";
164
+    }
165
+
166
+    // fermer la connexion apres les headers si requete HEAD
167
+    if ($headers_only) {
168
+        $page['entetes']["Connection"] = "close";
169
+    }
170
+
171
+    return $page;
172 172
 }
173 173
 
174 174
 /**
@@ -187,19 +187,19 @@  discard block
 block discarded – undo
187 187
  */
188 188
 function calculer_contexte() {
189 189
 
190
-	$contexte = array();
191
-	foreach ($_GET as $var => $val) {
192
-		if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
193
-			$contexte[$var] = $val;
194
-		}
195
-	}
196
-	foreach ($_POST as $var => $val) {
197
-		if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
198
-			$contexte[$var] = $val;
199
-		}
200
-	}
201
-
202
-	return $contexte;
190
+    $contexte = array();
191
+    foreach ($_GET as $var => $val) {
192
+        if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
193
+            $contexte[$var] = $val;
194
+        }
195
+    }
196
+    foreach ($_POST as $var => $val) {
197
+        if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
198
+            $contexte[$var] = $val;
199
+        }
200
+    }
201
+
202
+    return $contexte;
203 203
 }
204 204
 
205 205
 /**
@@ -210,25 +210,25 @@  discard block
 block discarded – undo
210 210
  * @return array
211 211
  */
212 212
 function calculer_contexte_implicite() {
213
-	static $notes = null;
214
-	if (is_null($notes)) {
215
-		$notes = charger_fonction('notes', 'inc', true);
216
-	}
217
-	$contexte_implicite = array(
218
-		'squelettes' => $GLOBALS['dossier_squelettes'], // devrait etre 'chemin' => $GLOBALS['path_sig'], ?
219
-		'host' => (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : null),
220
-		'https' => (isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : ''),
221
-		'espace' => test_espace_prive(),
222
-		'marqueur' => (isset($GLOBALS['marqueur']) ? $GLOBALS['marqueur'] : ''),
223
-		'marqueur_skel' => (isset($GLOBALS['marqueur_skel']) ? $GLOBALS['marqueur_skel'] : ''),
224
-		'notes' => $notes ? $notes('', 'contexter_cache') : '',
225
-		'spip_version_code' => $GLOBALS['spip_version_code'],
226
-	);
227
-	if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
228
-		$contexte_implicite['host'] .= "|" . $_SERVER['HTTP_X_FORWARDED_HOST'];
229
-	}
230
-
231
-	return $contexte_implicite;
213
+    static $notes = null;
214
+    if (is_null($notes)) {
215
+        $notes = charger_fonction('notes', 'inc', true);
216
+    }
217
+    $contexte_implicite = array(
218
+        'squelettes' => $GLOBALS['dossier_squelettes'], // devrait etre 'chemin' => $GLOBALS['path_sig'], ?
219
+        'host' => (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : null),
220
+        'https' => (isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : ''),
221
+        'espace' => test_espace_prive(),
222
+        'marqueur' => (isset($GLOBALS['marqueur']) ? $GLOBALS['marqueur'] : ''),
223
+        'marqueur_skel' => (isset($GLOBALS['marqueur_skel']) ? $GLOBALS['marqueur_skel'] : ''),
224
+        'notes' => $notes ? $notes('', 'contexter_cache') : '',
225
+        'spip_version_code' => $GLOBALS['spip_version_code'],
226
+    );
227
+    if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
228
+        $contexte_implicite['host'] .= "|" . $_SERVER['HTTP_X_FORWARDED_HOST'];
229
+    }
230
+
231
+    return $contexte_implicite;
232 232
 }
233 233
 
234 234
 //
@@ -238,50 +238,50 @@  discard block
 block discarded – undo
238 238
 // http://code.spip.net/@auto_content_type
239 239
 function auto_content_type($page) {
240 240
 
241
-	if (!isset($GLOBALS['flag_preserver'])) {
242
-		$GLOBALS['flag_preserver'] = ($page && preg_match("/header\s*\(\s*.content\-type:/isx",
243
-				$page['texte']) || (isset($page['entetes']['Content-Type'])));
244
-	}
241
+    if (!isset($GLOBALS['flag_preserver'])) {
242
+        $GLOBALS['flag_preserver'] = ($page && preg_match("/header\s*\(\s*.content\-type:/isx",
243
+                $page['texte']) || (isset($page['entetes']['Content-Type'])));
244
+    }
245 245
 }
246 246
 
247 247
 // http://code.spip.net/@inclure_page
248 248
 function inclure_page($fond, $contexte, $connect = '') {
249
-	static $cacher, $produire_page;
250
-
251
-	// enlever le fond de contexte inclus car sinon il prend la main
252
-	// dans les sous inclusions -> boucle infinie d'inclusion identique
253
-	// (cette precaution n'est probablement plus utile)
254
-	unset($contexte['fond']);
255
-	$page = array('contexte_implicite' => calculer_contexte_implicite());
256
-	$page['contexte_implicite']['cache'] = $fond;
257
-	if (is_null($cacher)) {
258
-		$cacher = charger_fonction('cacher', 'public', true);
259
-	}
260
-	// Les quatre derniers parametres sont modifies par la fonction:
261
-	// emplacement, validite, et, s'il est valide, contenu & age
262
-	if ($cacher) {
263
-		$res = $cacher($contexte, $use_cache, $chemin_cache, $page, $lastinclude);
264
-	} else {
265
-		$use_cache = -1;
266
-	}
267
-	// $res = message d'erreur : on sort de la
268
-	if ($res) {
269
-		return array('texte' => $res);
270
-	}
271
-
272
-	// Si use_cache ne vaut pas 0, la page doit etre calculee
273
-	// produire la page : peut mettre a jour $lastinclude
274
-	// le contexte_cache envoye a cacher() a ete conserve et est passe a produire
275
-	if ($use_cache) {
276
-		if (is_null($produire_page)) {
277
-			$produire_page = charger_fonction('produire_page', 'public');
278
-		}
279
-		$page = $produire_page($fond, $contexte, $use_cache, $chemin_cache, $contexte, $page, $lastinclude, $connect);
280
-	}
281
-	// dans tous les cas, mettre a jour $GLOBALS['lastmodified']
282
-	$GLOBALS['lastmodified'] = max((isset($GLOBALS['lastmodified']) ? $GLOBALS['lastmodified'] : 0), $lastinclude);
283
-
284
-	return $page;
249
+    static $cacher, $produire_page;
250
+
251
+    // enlever le fond de contexte inclus car sinon il prend la main
252
+    // dans les sous inclusions -> boucle infinie d'inclusion identique
253
+    // (cette precaution n'est probablement plus utile)
254
+    unset($contexte['fond']);
255
+    $page = array('contexte_implicite' => calculer_contexte_implicite());
256
+    $page['contexte_implicite']['cache'] = $fond;
257
+    if (is_null($cacher)) {
258
+        $cacher = charger_fonction('cacher', 'public', true);
259
+    }
260
+    // Les quatre derniers parametres sont modifies par la fonction:
261
+    // emplacement, validite, et, s'il est valide, contenu & age
262
+    if ($cacher) {
263
+        $res = $cacher($contexte, $use_cache, $chemin_cache, $page, $lastinclude);
264
+    } else {
265
+        $use_cache = -1;
266
+    }
267
+    // $res = message d'erreur : on sort de la
268
+    if ($res) {
269
+        return array('texte' => $res);
270
+    }
271
+
272
+    // Si use_cache ne vaut pas 0, la page doit etre calculee
273
+    // produire la page : peut mettre a jour $lastinclude
274
+    // le contexte_cache envoye a cacher() a ete conserve et est passe a produire
275
+    if ($use_cache) {
276
+        if (is_null($produire_page)) {
277
+            $produire_page = charger_fonction('produire_page', 'public');
278
+        }
279
+        $page = $produire_page($fond, $contexte, $use_cache, $chemin_cache, $contexte, $page, $lastinclude, $connect);
280
+    }
281
+    // dans tous les cas, mettre a jour $GLOBALS['lastmodified']
282
+    $GLOBALS['lastmodified'] = max((isset($GLOBALS['lastmodified']) ? $GLOBALS['lastmodified'] : 0), $lastinclude);
283
+
284
+    return $page;
285 285
 }
286 286
 
287 287
 /**
@@ -299,40 +299,40 @@  discard block
 block discarded – undo
299 299
  * @return array
300 300
  */
301 301
 function public_produire_page_dist(
302
-	$fond,
303
-	$contexte,
304
-	$use_cache,
305
-	$chemin_cache,
306
-	$contexte_cache,
307
-	&$page,
308
-	&$lastinclude,
309
-	$connect = ''
302
+    $fond,
303
+    $contexte,
304
+    $use_cache,
305
+    $chemin_cache,
306
+    $contexte_cache,
307
+    &$page,
308
+    &$lastinclude,
309
+    $connect = ''
310 310
 ) {
311
-	static $parametrer, $cacher;
312
-	if (!$parametrer) {
313
-		$parametrer = charger_fonction('parametrer', 'public');
314
-	}
315
-	$page = $parametrer($fond, $contexte, $chemin_cache, $connect);
316
-	// et on l'enregistre sur le disque
317
-	if ($chemin_cache
318
-		and $use_cache > -1
319
-		and is_array($page)
320
-		and count($page)
321
-		and isset($page['entetes']['X-Spip-Cache'])
322
-		and $page['entetes']['X-Spip-Cache'] > 0
323
-	) {
324
-		if (is_null($cacher)) {
325
-			$cacher = charger_fonction('cacher', 'public', true);
326
-		}
327
-		$lastinclude = time();
328
-		if ($cacher) {
329
-			$cacher($contexte_cache, $use_cache, $chemin_cache, $page, $lastinclude);
330
-		} else {
331
-			$use_cache = -1;
332
-		}
333
-	}
334
-
335
-	return $page;
311
+    static $parametrer, $cacher;
312
+    if (!$parametrer) {
313
+        $parametrer = charger_fonction('parametrer', 'public');
314
+    }
315
+    $page = $parametrer($fond, $contexte, $chemin_cache, $connect);
316
+    // et on l'enregistre sur le disque
317
+    if ($chemin_cache
318
+        and $use_cache > -1
319
+        and is_array($page)
320
+        and count($page)
321
+        and isset($page['entetes']['X-Spip-Cache'])
322
+        and $page['entetes']['X-Spip-Cache'] > 0
323
+    ) {
324
+        if (is_null($cacher)) {
325
+            $cacher = charger_fonction('cacher', 'public', true);
326
+        }
327
+        $lastinclude = time();
328
+        if ($cacher) {
329
+            $cacher($contexte_cache, $use_cache, $chemin_cache, $page, $lastinclude);
330
+        } else {
331
+            $use_cache = -1;
332
+        }
333
+    }
334
+
335
+    return $page;
336 336
 }
337 337
 
338 338
 // Fonction inseree par le compilateur dans le code compile.
@@ -346,12 +346,12 @@  discard block
 block discarded – undo
346 346
 // 4: langue
347 347
 
348 348
 function inserer_balise_dynamique($contexte_exec, $contexte_compil) {
349
-	if (!is_array($contexte_exec)) {
350
-		echo $contexte_exec;
351
-	} // message d'erreur etc
352
-	else {
353
-		inclure_balise_dynamique($contexte_exec, true, $contexte_compil);
354
-	}
349
+    if (!is_array($contexte_exec)) {
350
+        echo $contexte_exec;
351
+    } // message d'erreur etc
352
+    else {
353
+        inclure_balise_dynamique($contexte_exec, true, $contexte_compil);
354
+    }
355 355
 }
356 356
 
357 357
 /**
@@ -366,124 +366,124 @@  discard block
 block discarded – undo
366 366
  * @return string
367 367
  */
368 368
 function inclure_balise_dynamique($texte, $echo = true, $contexte_compil = array()) {
369
-	if (is_array($texte)) {
370
-
371
-		list($fond, $delainc, $contexte_inclus) = $texte;
372
-
373
-		// delais a l'ancienne, c'est pratiquement mort
374
-		$d = isset($GLOBALS['delais']) ? $GLOBALS['delais'] : null;
375
-		$GLOBALS['delais'] = $delainc;
376
-
377
-		$page = recuperer_fond($fond, $contexte_inclus,
378
-			array('trim' => false, 'raw' => true, 'compil' => $contexte_compil));
379
-
380
-		$texte = $page['texte'];
381
-
382
-		$GLOBALS['delais'] = $d;
383
-		// Faire remonter les entetes
384
-		if (is_array($page['entetes'])) {
385
-			// mais pas toutes
386
-			unset($page['entetes']['X-Spip-Cache']);
387
-			unset($page['entetes']['Content-Type']);
388
-			if (isset($GLOBALS['page']) and is_array($GLOBALS['page'])) {
389
-				if (!is_array($GLOBALS['page']['entetes'])) {
390
-					$GLOBALS['page']['entetes'] = array();
391
-				}
392
-				$GLOBALS['page']['entetes'] =
393
-					array_merge($GLOBALS['page']['entetes'], $page['entetes']);
394
-			}
395
-		}
396
-		// _pipelines au pluriel array('nom_pipeline' => $args...) avec une syntaxe permettant plusieurs pipelines
397
-		if (isset($page['contexte']['_pipelines'])
398
-			and is_array($page['contexte']['_pipelines'])
399
-			and count($page['contexte']['_pipelines'])
400
-		) {
401
-			foreach ($page['contexte']['_pipelines'] as $pipe => $args) {
402
-				$args['contexte'] = $page['contexte'];
403
-				unset($args['contexte']['_pipelines']); // par precaution, meme si le risque de boucle infinie est a priori nul
404
-				$texte = pipeline(
405
-					$pipe,
406
-					array(
407
-						'data' => $texte,
408
-						'args' => $args
409
-					),
410
-					false
411
-				);
412
-			}
413
-		}
414
-	}
415
-
416
-	if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
417
-		// compatibilite : avant on donnait le numero de ligne ou rien.
418
-		$ligne = intval(isset($contexte_compil[3]) ? $contexte_compil[3] : $contexte_compil);
419
-		$GLOBALS['debug_objets']['resultat'][$ligne] = $texte;
420
-	}
421
-	if ($echo) {
422
-		echo $texte;
423
-	} else {
424
-		return $texte;
425
-	}
369
+    if (is_array($texte)) {
370
+
371
+        list($fond, $delainc, $contexte_inclus) = $texte;
372
+
373
+        // delais a l'ancienne, c'est pratiquement mort
374
+        $d = isset($GLOBALS['delais']) ? $GLOBALS['delais'] : null;
375
+        $GLOBALS['delais'] = $delainc;
376
+
377
+        $page = recuperer_fond($fond, $contexte_inclus,
378
+            array('trim' => false, 'raw' => true, 'compil' => $contexte_compil));
379
+
380
+        $texte = $page['texte'];
381
+
382
+        $GLOBALS['delais'] = $d;
383
+        // Faire remonter les entetes
384
+        if (is_array($page['entetes'])) {
385
+            // mais pas toutes
386
+            unset($page['entetes']['X-Spip-Cache']);
387
+            unset($page['entetes']['Content-Type']);
388
+            if (isset($GLOBALS['page']) and is_array($GLOBALS['page'])) {
389
+                if (!is_array($GLOBALS['page']['entetes'])) {
390
+                    $GLOBALS['page']['entetes'] = array();
391
+                }
392
+                $GLOBALS['page']['entetes'] =
393
+                    array_merge($GLOBALS['page']['entetes'], $page['entetes']);
394
+            }
395
+        }
396
+        // _pipelines au pluriel array('nom_pipeline' => $args...) avec une syntaxe permettant plusieurs pipelines
397
+        if (isset($page['contexte']['_pipelines'])
398
+            and is_array($page['contexte']['_pipelines'])
399
+            and count($page['contexte']['_pipelines'])
400
+        ) {
401
+            foreach ($page['contexte']['_pipelines'] as $pipe => $args) {
402
+                $args['contexte'] = $page['contexte'];
403
+                unset($args['contexte']['_pipelines']); // par precaution, meme si le risque de boucle infinie est a priori nul
404
+                $texte = pipeline(
405
+                    $pipe,
406
+                    array(
407
+                        'data' => $texte,
408
+                        'args' => $args
409
+                    ),
410
+                    false
411
+                );
412
+            }
413
+        }
414
+    }
415
+
416
+    if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
417
+        // compatibilite : avant on donnait le numero de ligne ou rien.
418
+        $ligne = intval(isset($contexte_compil[3]) ? $contexte_compil[3] : $contexte_compil);
419
+        $GLOBALS['debug_objets']['resultat'][$ligne] = $texte;
420
+    }
421
+    if ($echo) {
422
+        echo $texte;
423
+    } else {
424
+        return $texte;
425
+    }
426 426
 }
427 427
 
428 428
 // http://code.spip.net/@message_page_indisponible
429 429
 function message_page_indisponible($page, $contexte) {
430
-	static $deja = false;
431
-	if ($deja) {
432
-		return "erreur";
433
-	}
434
-	$codes = array(
435
-		'404' => '404 Not Found',
436
-		'503' => '503 Service Unavailable',
437
-	);
438
-
439
-	$contexte['status'] = ($page !== false) ? '404' : '503';
440
-	$contexte['code'] = $codes[$contexte['status']];
441
-	$contexte['fond'] = '404'; // gere les 2 erreurs
442
-	if (!isset($contexte['lang'])) {
443
-		$contexte['lang'] = $GLOBALS['spip_lang'];
444
-	}
445
-
446
-	$deja = true;
447
-	// passer aux plugins qui peuvent decider d'une page d'erreur plus pertinent
448
-	// ex restriction d'acces => 401
449
-	$contexte = pipeline('page_indisponible', $contexte);
450
-
451
-	// produire la page d'erreur
452
-	$page = inclure_page($contexte['fond'], $contexte);
453
-	if (!$page) {
454
-		$page = inclure_page('404', $contexte);
455
-	}
456
-	$page['status'] = $contexte['status'];
457
-
458
-	return $page;
430
+    static $deja = false;
431
+    if ($deja) {
432
+        return "erreur";
433
+    }
434
+    $codes = array(
435
+        '404' => '404 Not Found',
436
+        '503' => '503 Service Unavailable',
437
+    );
438
+
439
+    $contexte['status'] = ($page !== false) ? '404' : '503';
440
+    $contexte['code'] = $codes[$contexte['status']];
441
+    $contexte['fond'] = '404'; // gere les 2 erreurs
442
+    if (!isset($contexte['lang'])) {
443
+        $contexte['lang'] = $GLOBALS['spip_lang'];
444
+    }
445
+
446
+    $deja = true;
447
+    // passer aux plugins qui peuvent decider d'une page d'erreur plus pertinent
448
+    // ex restriction d'acces => 401
449
+    $contexte = pipeline('page_indisponible', $contexte);
450
+
451
+    // produire la page d'erreur
452
+    $page = inclure_page($contexte['fond'], $contexte);
453
+    if (!$page) {
454
+        $page = inclure_page('404', $contexte);
455
+    }
456
+    $page['status'] = $contexte['status'];
457
+
458
+    return $page;
459 459
 }
460 460
 
461 461
 // temporairement ici : a mettre dans le futur inc/modeles
462 462
 // creer_contexte_de_modele('left', 'autostart=true', ...) renvoie un array()
463 463
 // http://code.spip.net/@creer_contexte_de_modele
464 464
 function creer_contexte_de_modele($args) {
465
-	$contexte = array();
466
-	foreach ($args as $var => $val) {
467
-		if (is_int($var)) { // argument pas formate
468
-			if (in_array($val, array('left', 'right', 'center'))) {
469
-				$var = 'align';
470
-				$contexte[$var] = $val;
471
-			} else {
472
-				$args = explode('=', $val);
473
-				if (count($args) >= 2) // Flashvars=arg1=machin&arg2=truc genere plus de deux args
474
-				{
475
-					$contexte[trim($args[0])] = substr($val, strlen($args[0]) + 1);
476
-				} else // notation abregee
477
-				{
478
-					$contexte[trim($val)] = trim($val);
479
-				}
480
-			}
481
-		} else {
482
-			$contexte[$var] = $val;
483
-		}
484
-	}
485
-
486
-	return $contexte;
465
+    $contexte = array();
466
+    foreach ($args as $var => $val) {
467
+        if (is_int($var)) { // argument pas formate
468
+            if (in_array($val, array('left', 'right', 'center'))) {
469
+                $var = 'align';
470
+                $contexte[$var] = $val;
471
+            } else {
472
+                $args = explode('=', $val);
473
+                if (count($args) >= 2) // Flashvars=arg1=machin&arg2=truc genere plus de deux args
474
+                {
475
+                    $contexte[trim($args[0])] = substr($val, strlen($args[0]) + 1);
476
+                } else // notation abregee
477
+                {
478
+                    $contexte[trim($val)] = trim($val);
479
+                }
480
+            }
481
+        } else {
482
+            $contexte[$var] = $val;
483
+        }
484
+    }
485
+
486
+    return $contexte;
487 487
 }
488 488
 
489 489
 /**
@@ -502,94 +502,94 @@  discard block
 block discarded – undo
502 502
  */
503 503
 function inclure_modele($type, $id, $params, $lien, $connect = '', $env = array()) {
504 504
 
505
-	static $compteur;
506
-	if (++$compteur > 10) {
507
-		return '';
508
-	} # ne pas boucler indefiniment
509
-
510
-	$type = strtolower($type);
511
-
512
-	$fond = $class = '';
513
-
514
-	$params = array_filter(explode('|', $params));
515
-	if ($params) {
516
-		$soustype = current($params);
517
-		$soustype = strtolower(trim($soustype));
518
-		if (in_array($soustype, array('left', 'right', 'center', 'ajax'))) {
519
-			$soustype = next($params);
520
-			$soustype = strtolower($soustype);
521
-		}
522
-
523
-		if (preg_match(',^[a-z0-9_]+$,', $soustype)) {
524
-			if (!trouve_modele($fond = ($type . '_' . $soustype))) {
525
-				$fond = '';
526
-				$class = $soustype;
527
-			}
528
-			// enlever le sous type des params
529
-			$params = array_diff($params, array($soustype));
530
-		}
531
-	}
532
-
533
-	// Si ca marche pas en precisant le sous-type, prendre le type
534
-	if (!$fond and !trouve_modele($fond = $type)) {
535
-		spip_log("Modele $type introuvable", _LOG_INFO_IMPORTANTE);
536
-
537
-		return false;
538
-	}
539
-	$fond = 'modeles/' . $fond;
540
-	// Creer le contexte
541
-	$contexte = $env;
542
-	$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
543
-
544
-	// Le numero du modele est mis dans l'environnement
545
-	// d'une part sous l'identifiant "id"
546
-	// et d'autre part sous l'identifiant de la cle primaire
547
-	// par la fonction id_table_objet,
548
-	// (<article1> =>> article =>> id_article =>> id_article=1)
549
-	$_id = id_table_objet($type);
550
-	$contexte['id'] = $contexte[$_id] = $id;
551
-
552
-	if (isset($class)) {
553
-		$contexte['class'] = $class;
554
-	}
555
-
556
-	// Si un lien a ete passe en parametre, ex: [<modele1>->url] ou [<modele1|title_du_lien{hreflang}->url]
557
-	if ($lien) {
558
-		# un eventuel guillemet (") sera reechappe par #ENV
559
-		$contexte['lien'] = str_replace("&quot;", '"', $lien['href']);
560
-		$contexte['lien_class'] = $lien['class'];
561
-		$contexte['lien_mime'] = $lien['mime'];
562
-		$contexte['lien_title'] = $lien['title'];
563
-		$contexte['lien_hreflang'] = $lien['hreflang'];
564
-	}
565
-
566
-	// Traiter les parametres
567
-	// par exemple : <img1|center>, <emb12|autostart=true> ou <doc1|lang=en>
568
-	$arg_list = creer_contexte_de_modele($params);
569
-	$contexte['args'] = $arg_list; // on passe la liste des arguments du modeles dans une variable args
570
-	$contexte = array_merge($contexte, $arg_list);
571
-
572
-	// Appliquer le modele avec le contexte
573
-	$retour = recuperer_fond($fond, $contexte, array(), $connect);
574
-
575
-	// Regarder si le modele tient compte des liens (il *doit* alors indiquer
576
-	// spip_lien_ok dans les classes de son conteneur de premier niveau ;
577
-	// sinon, s'il y a un lien, on l'ajoute classiquement
578
-	if (strstr(' ' . ($classes = extraire_attribut($retour, 'class')) . ' ',
579
-		'spip_lien_ok')) {
580
-		$retour = inserer_attribut($retour, 'class',
581
-			trim(str_replace(' spip_lien_ok ', ' ', " $classes ")));
582
-	} else {
583
-		if ($lien) {
584
-			$retour = "<a href='" . $lien['href'] . "' class='" . $lien['class'] . "'>" . $retour . "</a>";
585
-		}
586
-	}
587
-
588
-	$compteur--;
589
-
590
-	return (isset($arg_list['ajax']) and $arg_list['ajax'] == 'ajax')
591
-		? encoder_contexte_ajax($contexte, '', $retour)
592
-		: $retour;
505
+    static $compteur;
506
+    if (++$compteur > 10) {
507
+        return '';
508
+    } # ne pas boucler indefiniment
509
+
510
+    $type = strtolower($type);
511
+
512
+    $fond = $class = '';
513
+
514
+    $params = array_filter(explode('|', $params));
515
+    if ($params) {
516
+        $soustype = current($params);
517
+        $soustype = strtolower(trim($soustype));
518
+        if (in_array($soustype, array('left', 'right', 'center', 'ajax'))) {
519
+            $soustype = next($params);
520
+            $soustype = strtolower($soustype);
521
+        }
522
+
523
+        if (preg_match(',^[a-z0-9_]+$,', $soustype)) {
524
+            if (!trouve_modele($fond = ($type . '_' . $soustype))) {
525
+                $fond = '';
526
+                $class = $soustype;
527
+            }
528
+            // enlever le sous type des params
529
+            $params = array_diff($params, array($soustype));
530
+        }
531
+    }
532
+
533
+    // Si ca marche pas en precisant le sous-type, prendre le type
534
+    if (!$fond and !trouve_modele($fond = $type)) {
535
+        spip_log("Modele $type introuvable", _LOG_INFO_IMPORTANTE);
536
+
537
+        return false;
538
+    }
539
+    $fond = 'modeles/' . $fond;
540
+    // Creer le contexte
541
+    $contexte = $env;
542
+    $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
543
+
544
+    // Le numero du modele est mis dans l'environnement
545
+    // d'une part sous l'identifiant "id"
546
+    // et d'autre part sous l'identifiant de la cle primaire
547
+    // par la fonction id_table_objet,
548
+    // (<article1> =>> article =>> id_article =>> id_article=1)
549
+    $_id = id_table_objet($type);
550
+    $contexte['id'] = $contexte[$_id] = $id;
551
+
552
+    if (isset($class)) {
553
+        $contexte['class'] = $class;
554
+    }
555
+
556
+    // Si un lien a ete passe en parametre, ex: [<modele1>->url] ou [<modele1|title_du_lien{hreflang}->url]
557
+    if ($lien) {
558
+        # un eventuel guillemet (") sera reechappe par #ENV
559
+        $contexte['lien'] = str_replace("&quot;", '"', $lien['href']);
560
+        $contexte['lien_class'] = $lien['class'];
561
+        $contexte['lien_mime'] = $lien['mime'];
562
+        $contexte['lien_title'] = $lien['title'];
563
+        $contexte['lien_hreflang'] = $lien['hreflang'];
564
+    }
565
+
566
+    // Traiter les parametres
567
+    // par exemple : <img1|center>, <emb12|autostart=true> ou <doc1|lang=en>
568
+    $arg_list = creer_contexte_de_modele($params);
569
+    $contexte['args'] = $arg_list; // on passe la liste des arguments du modeles dans une variable args
570
+    $contexte = array_merge($contexte, $arg_list);
571
+
572
+    // Appliquer le modele avec le contexte
573
+    $retour = recuperer_fond($fond, $contexte, array(), $connect);
574
+
575
+    // Regarder si le modele tient compte des liens (il *doit* alors indiquer
576
+    // spip_lien_ok dans les classes de son conteneur de premier niveau ;
577
+    // sinon, s'il y a un lien, on l'ajoute classiquement
578
+    if (strstr(' ' . ($classes = extraire_attribut($retour, 'class')) . ' ',
579
+        'spip_lien_ok')) {
580
+        $retour = inserer_attribut($retour, 'class',
581
+            trim(str_replace(' spip_lien_ok ', ' ', " $classes ")));
582
+    } else {
583
+        if ($lien) {
584
+            $retour = "<a href='" . $lien['href'] . "' class='" . $lien['class'] . "'>" . $retour . "</a>";
585
+        }
586
+    }
587
+
588
+    $compteur--;
589
+
590
+    return (isset($arg_list['ajax']) and $arg_list['ajax'] == 'ajax')
591
+        ? encoder_contexte_ajax($contexte, '', $retour)
592
+        : $retour;
593 593
 }
594 594
 
595 595
 // Un inclure_page qui marche aussi pour l'espace prive
@@ -599,92 +599,92 @@  discard block
 block discarded – undo
599 599
 // http://code.spip.net/@evaluer_fond
600 600
 function evaluer_fond($fond, $contexte = array(), $connect = null) {
601 601
 
602
-	$page = inclure_page($fond, $contexte, $connect);
603
-
604
-	if (!$page) {
605
-		return $page;
606
-	}
607
-	// eval $page et affecte $res
608
-	include _ROOT_RESTREINT . "public/evaluer_page.php";
609
-
610
-	// Lever un drapeau (global) si le fond utilise #SESSION
611
-	// a destination de public/parametrer
612
-	// pour remonter vers les inclusions appelantes
613
-	// il faut bien lever ce drapeau apres avoir evalue le fond
614
-	// pour ne pas faire descendre le flag vers les inclusions appelees
615
-	if (isset($page['invalideurs'])
616
-		and isset($page['invalideurs']['session'])
617
-	) {
618
-		$GLOBALS['cache_utilise_session'] = $page['invalideurs']['session'];
619
-	}
620
-
621
-	return $page;
602
+    $page = inclure_page($fond, $contexte, $connect);
603
+
604
+    if (!$page) {
605
+        return $page;
606
+    }
607
+    // eval $page et affecte $res
608
+    include _ROOT_RESTREINT . "public/evaluer_page.php";
609
+
610
+    // Lever un drapeau (global) si le fond utilise #SESSION
611
+    // a destination de public/parametrer
612
+    // pour remonter vers les inclusions appelantes
613
+    // il faut bien lever ce drapeau apres avoir evalue le fond
614
+    // pour ne pas faire descendre le flag vers les inclusions appelees
615
+    if (isset($page['invalideurs'])
616
+        and isset($page['invalideurs']['session'])
617
+    ) {
618
+        $GLOBALS['cache_utilise_session'] = $page['invalideurs']['session'];
619
+    }
620
+
621
+    return $page;
622 622
 }
623 623
 
624 624
 
625 625
 // http://code.spip.net/@page_base_href
626 626
 function page_base_href(&$texte) {
627
-	static $set_html_base = null;
628
-	if (is_null($set_html_base)) {
629
-		if (!defined('_SET_HTML_BASE'))
630
-			// si la profondeur est superieure a 1
631
-			// est que ce n'est pas une url page ni une url action
632
-			// activer par defaut
633
-		{
634
-			$set_html_base = ((
635
-				$GLOBALS['profondeur_url'] >= (_DIR_RESTREINT ? 1 : 2)
636
-				and _request(_SPIP_PAGE) !== 'login'
637
-				and !_request('action')) ? true : false);
638
-		} else {
639
-			$set_html_base = _SET_HTML_BASE;
640
-		}
641
-	}
642
-
643
-	if ($set_html_base
644
-		and isset($GLOBALS['html']) and $GLOBALS['html']
645
-		and $GLOBALS['profondeur_url'] > 0
646
-		and ($poshead = strpos($texte, '</head>')) !== false
647
-	) {
648
-		$head = substr($texte, 0, $poshead);
649
-		$insert = false;
650
-		if (strpos($head, '<base') === false) {
651
-			$insert = true;
652
-		} else {
653
-			// si aucun <base ...> n'a de href c'est bon quand meme !
654
-			$insert = true;
655
-			include_spip('inc/filtres');
656
-			$bases = extraire_balises($head, 'base');
657
-			foreach ($bases as $base) {
658
-				if (extraire_attribut($base, 'href')) {
659
-					$insert = false;
660
-				}
661
-			}
662
-		}
663
-		if ($insert) {
664
-			include_spip('inc/filtres_mini');
665
-			// ajouter un base qui reglera tous les liens relatifs
666
-			$base = url_absolue('./');
667
-			$bbase = "\n<base href=\"$base\" />";
668
-			if (($pos = strpos($head, '<head>')) !== false) {
669
-				$head = substr_replace($head, $bbase, $pos + 6, 0);
670
-			} elseif (preg_match(",<head[^>]*>,i", $head, $r)) {
671
-				$head = str_replace($r[0], $r[0] . $bbase, $head);
672
-			}
673
-			$texte = $head . substr($texte, $poshead);
674
-			// gerer les ancres
675
-			$base = $_SERVER['REQUEST_URI'];
676
-			// pas de guillemets ni < dans l'URL qu'on insere dans le HTML
677
-			if (strpos($base,"'") or strpos($base,'"') or strpos($base,'<')) {
678
-				$base = str_replace(array("'",'"','<'),array("%27",'%22','%3C'), $base);
679
-			}
680
-			if (strpos($texte, "href='#") !== false) {
681
-				$texte = str_replace("href='#", "href='$base#", $texte);
682
-			}
683
-			if (strpos($texte, "href=\"#") !== false) {
684
-				$texte = str_replace("href=\"#", "href=\"$base#", $texte);
685
-			}
686
-		}
687
-	}
627
+    static $set_html_base = null;
628
+    if (is_null($set_html_base)) {
629
+        if (!defined('_SET_HTML_BASE'))
630
+            // si la profondeur est superieure a 1
631
+            // est que ce n'est pas une url page ni une url action
632
+            // activer par defaut
633
+        {
634
+            $set_html_base = ((
635
+                $GLOBALS['profondeur_url'] >= (_DIR_RESTREINT ? 1 : 2)
636
+                and _request(_SPIP_PAGE) !== 'login'
637
+                and !_request('action')) ? true : false);
638
+        } else {
639
+            $set_html_base = _SET_HTML_BASE;
640
+        }
641
+    }
642
+
643
+    if ($set_html_base
644
+        and isset($GLOBALS['html']) and $GLOBALS['html']
645
+        and $GLOBALS['profondeur_url'] > 0
646
+        and ($poshead = strpos($texte, '</head>')) !== false
647
+    ) {
648
+        $head = substr($texte, 0, $poshead);
649
+        $insert = false;
650
+        if (strpos($head, '<base') === false) {
651
+            $insert = true;
652
+        } else {
653
+            // si aucun <base ...> n'a de href c'est bon quand meme !
654
+            $insert = true;
655
+            include_spip('inc/filtres');
656
+            $bases = extraire_balises($head, 'base');
657
+            foreach ($bases as $base) {
658
+                if (extraire_attribut($base, 'href')) {
659
+                    $insert = false;
660
+                }
661
+            }
662
+        }
663
+        if ($insert) {
664
+            include_spip('inc/filtres_mini');
665
+            // ajouter un base qui reglera tous les liens relatifs
666
+            $base = url_absolue('./');
667
+            $bbase = "\n<base href=\"$base\" />";
668
+            if (($pos = strpos($head, '<head>')) !== false) {
669
+                $head = substr_replace($head, $bbase, $pos + 6, 0);
670
+            } elseif (preg_match(",<head[^>]*>,i", $head, $r)) {
671
+                $head = str_replace($r[0], $r[0] . $bbase, $head);
672
+            }
673
+            $texte = $head . substr($texte, $poshead);
674
+            // gerer les ancres
675
+            $base = $_SERVER['REQUEST_URI'];
676
+            // pas de guillemets ni < dans l'URL qu'on insere dans le HTML
677
+            if (strpos($base,"'") or strpos($base,'"') or strpos($base,'<')) {
678
+                $base = str_replace(array("'",'"','<'),array("%27",'%22','%3C'), $base);
679
+            }
680
+            if (strpos($texte, "href='#") !== false) {
681
+                $texte = str_replace("href='#", "href='$base#", $texte);
682
+            }
683
+            if (strpos($texte, "href=\"#") !== false) {
684
+                $texte = str_replace("href=\"#", "href=\"$base#", $texte);
685
+            }
686
+        }
687
+    }
688 688
 }
689 689
 
690 690
 
@@ -692,8 +692,8 @@  discard block
 block discarded – undo
692 692
 // et demarrent par X-Spip-...
693 693
 // http://code.spip.net/@envoyer_entetes
694 694
 function envoyer_entetes($entetes) {
695
-	foreach ($entetes as $k => $v) #	if (strncmp($k, 'X-Spip-', 7))
696
-	{
697
-		@header(strlen($v) ? "$k: $v" : $k);
698
-	}
695
+    foreach ($entetes as $k => $v) #	if (strncmp($k, 'X-Spip-', 7))
696
+    {
697
+        @header(strlen($v) ? "$k: $v" : $k);
698
+    }
699 699
 }
Please login to merge, or discard this patch.