diff --git a/.gitattributes b/.gitattributes
index 645649360acf190a3091a08dd23177e689c203be..c7693b4818b774cb37e34a2d0879e81848b7731f 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -275,7 +275,6 @@ dist/javascript/jquery.ifixpng.js -text
 dist/javascript/jquery.js -text
 dist/javascript/multilang.js -text
 dist/javascript/pause.js -text
-dist/jquery.js.html -text
 dist/minipres.css -text
 dist/modeles/application.html -text
 dist/modeles/article_mots.html -text
diff --git a/dist/inc-head.html b/dist/inc-head.html
index fc461b85b993039b40d1e2384758087d387845dc..81dffbb9d1d6c957108aeea20fdc23daf47e7f7d 100644
--- a/dist/inc-head.html
+++ b/dist/inc-head.html
@@ -32,3 +32,9 @@
 	C'est ici que SPIP va inserer l'appel de la librairie jQuery
 ]
 #INSERT_HEAD
+
+
+[(#REM) Agreger et compacter tout cela dans des fichiers statiques
+	TODO : creer une configuration dans l'espace prive
+]
+#FILTRE{compacte_head}
diff --git a/dist/javascript/SearchHighlight.js b/dist/javascript/SearchHighlight.js
index 9c72c169420e5d1e370049594207e25d956f8451..013e650d31800872fe7bbaeba66fcc504cd887b1 100644
--- a/dist/javascript/SearchHighlight.js
+++ b/dist/javascript/SearchHighlight.js
@@ -6,7 +6,7 @@
  *    
  * @author Renato Formato <renatoformato@virgilio.it> 
  *  
- * @version 0.34
+ * @version 0.35
  *
  *  Options
  *  - exact (string, default:"exact") 
@@ -45,6 +45,7 @@
  *   
  */
 
+if (window.jQuery)
 (function($){
   jQuery.fn.SearchHighlight = function(options) {
     var ref = options.debug_referrer || document.referrer;
diff --git a/dist/jquery.js.html b/dist/jquery.js.html
deleted file mode 100644
index 5c06ddc330fbbbdfe78393c0c614fee2e83a7058..0000000000000000000000000000000000000000
--- a/dist/jquery.js.html
+++ /dev/null
@@ -1,22 +0,0 @@
-[(#REM)
-
-	Charger la librairie jQuery et ses plugins
-
-]#CACHE{7*24*3600,cache-client}
-#HTTP_HEADER{'Content-Type: text/javascript'}
-/*
- * jQuery 1.2.3 - New Wave Javascript
- *
- * Copyright (c) 2008 John Resig (jquery.com)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * + form.js (plugins @ jQuery.com)
- * + ajaxCallback.js (www.spip.net)
- */
-[(#INCLURE{javascript/jquery.js}|compacte_js)]
-[(#INCLURE{javascript/jquery.form.js}|compacte_js)]
-[(#INCLURE{javascript/ajaxCallback.js}|compacte_js)]
-
-[(#REM) js ajoutee par les plugin et a la volee]
-[(#ENV{script}|charge_scripts|compacte_js)]
diff --git a/dist/sommaire.html b/dist/sommaire.html
index ffd29985f206719945656cb150006af254e7eb87..4980268c65b21af4fe8275c820f36988d3672758 100644
--- a/dist/sommaire.html
+++ b/dist/sommaire.html
@@ -105,4 +105,4 @@
 	
 </div><!--#page-->
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/ecrire/balise/formulaire_admin.php b/ecrire/balise/formulaire_admin.php
index 26dde4a3f814366997f620f9308ec42c8c5dd99a..60d0cac87878b0c8bb2bb5bd37ec07454c68681e 100644
--- a/ecrire/balise/formulaire_admin.php
+++ b/ecrire/balise/formulaire_admin.php
@@ -101,7 +101,7 @@ function admin_objet()
 	as $id => $obj) {
 		if (is_int($id)) $id = $obj;
 		$_id_type = id_table_objet($id);
-		if ($id_type = $GLOBALS[$_id_type]) {
+		if ($id_type = $GLOBALS['contexte'][$_id_type]) {
 			$id_type = sql_getfetsel($_id_type, table_objet_sql($id), "$_id_type=".intval($id_type));
 			if ($id_type) {
 				$env[$_id_type] = $id_type;
diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php
index 38eb37837727e4408e0d8167822eb0a189f4133d..c6c79eb108faedad21e126b9faf7b636a44041d4 100644
--- a/ecrire/inc/filtres.php
+++ b/ecrire/inc/filtres.php
@@ -2123,8 +2123,15 @@ function f_jQuery ($texte) {
 			array("#INSERT_HEAD",_T('double_occurrence')))
 		) . $texte;
 	} else {
-		$texte = "\n<script src=\"".generer_url_public('jquery.js')
-			. "\" type=\"text/javascript\"></script>\n".$texte;
+		foreach (pipeline('jquery_plugins',
+		array(
+			'javascript/jquery.js',
+			'javascript/jquery.form.js',
+			'javascript/ajaxCallback.js'
+		)) as $script)
+			if ($script = find_in_path($script))
+				$x .= "\n<script src=\"$script\" type=\"text/javascript\"></script>\n";
+		$texte = $x.$texte;
 	}
 	return $texte;
 }
@@ -2309,15 +2316,18 @@ function filtre_cache_static($scripts,$type='js'){
 		  (_request('var_mode')=='recalcul')
 		  OR (!file_exists($nom))){
 		  	$fichier = "";
+		  	$comms = array();
+		  	$total = 0;
 		  	foreach($scripts as $script){
 		  		if (!is_array($script)) {
-		  			$fichier .= "/* $script */\n";
+		  			$comm = $script;
 				  	if ($type=='css')
 				  		$script = url_absolue_css($script);
 		  			lire_fichier($script, $contenu);
 		  		}
 		  		else {
-		  			$fichier .= "/* page: $script[0] $script[1] */\n";
+		  			$comm = "page=$script[0]"
+		  				. (strlen($script[1])?"($script[1])":'');
 		  			parse_str($script[1],$contexte);
 		  			$contenu = evaluer_fond($script[0],$contexte);
 		  			$contenu = $contenu['texte'];
@@ -2330,19 +2340,26 @@ function filtre_cache_static($scripts,$type='js'){
 		  			}
 		  		}
 				$f = 'compacte_'.$type;
-	  			$fichier .= $f($contenu) . "\n\n";
+	  			$fichier .= "/* $comm */\n". $f($contenu) . "\n\n";
+				$comms[] = $comm;
+				$total += strlen($contenu);
 		  	}
+			// calcul du % de compactage
+			$pc = intval(1000*strlen($fichier)/$total)/10;
+			$comms = "compact [\n\t".join("\n\t", $comms)."\n] $pc%";
+			$fichier = "/* $comms */\n\n".$fichier;
+
 		  	// ecrire
 		  	ecrire_fichier($nom,$fichier);
 		  	// ecrire une version .gz pour content-negociation par apache, cf. [11539]
 		  	ecrire_fichier("$nom.gz",$fichier);
 		  }
 	}
-	return $nom;
+	return array($nom, "<!-- $comms -->\n");
 }
 
-// http://doc.spip.org/@f_compacte_head
-function f_compacte_head($flux){
+// http://doc.spip.org/@compacte_head
+function compacte_head($flux){
 	$url_page = substr(generer_url_public('A'), 0, -1);
 	$dir = preg_quote($url_page,',').'|'.preg_quote(url_absolue($url_page,','));
 
@@ -2366,10 +2383,11 @@ function f_compacte_head($flux){
 				$scripts[$s] = $src;
 		}
 	}
-	if ($src = filtre_cache_static($scripts,'js')){
+	if (list($src,$comms) = filtre_cache_static($scripts,'js')){
 		$scripts = array_keys($scripts);
 		$flux = str_replace(reset($scripts),
-			"<script type='text/javascript' src='$src'></script>\n",$flux);
+			$comms
+			."<script type='text/javascript' src='$src'></script>\n",$flux);
 		$flux = str_replace($scripts,"",$flux);
 	}
 
@@ -2403,10 +2421,11 @@ function f_compacte_head($flux){
 	foreach($css as $m=>$s){
 		// si plus d'une css pour ce media ou si c'est une css dynamique
 		if (count($s)>1 OR is_array(reset($s))){
-			if ($src = filtre_cache_static($s,'css')){
+			if (list($src,$comms) = filtre_cache_static($s,'css')){
 				$s = array_keys($s);
 				$flux = str_replace(reset($s),
-					"<link rel='stylesheet'".($m?" media='$m'":"")." href='$src' type='text/css' />\n",$flux);
+					$comms
+					."<link rel='stylesheet'".($m?" media='$m'":"")." href='$src' type='text/css' />\n",$flux);
 				$flux = str_replace($s,"",$flux);
 			}
 		}
diff --git a/ecrire/inc/iconifier.php b/ecrire/inc/iconifier.php
index 635ed58abf95e2c01143bb8413929dcca4681b39..1dfd616037ecdb81c057abb7332f3c9129e9229a 100644
--- a/ecrire/inc/iconifier.php
+++ b/ecrire/inc/iconifier.php
@@ -68,7 +68,6 @@ function inc_iconifier_dist($id_objet, $id,  $script, $visible=false, $flag_modi
 		    . http_script('$("form.form_upload_icon").async_upload(async_upload_icon)');
 
 		} else $js = "";
-		spip_log($js);
 		return ajax_action_greffe("iconifier", $id, $res).$js;
 	}
 	else return '';
diff --git a/ecrire/inc/surligne.php b/ecrire/inc/surligne.php
index 78ecf99871ab5928a1c4e4d3bc7e23cda67be92d..22189f92020117620f0a5a690a6f88a0fd4326e9 100644
--- a/ecrire/inc/surligne.php
+++ b/ecrire/inc/surligne.php
@@ -53,9 +53,12 @@ function surligner_mots($page) {
     if($surcharge_surligne || (preg_match($engine[0],$ref) && preg_match($engine[1],$ref))) { 
       
       //good referrer found or var_recherche is not null
-      $script = "<script type='text/javascript'>
-        jQuery(function(){
-          jQuery(document).SearchHighlight({
+      $script = "
+      <script type='text/javascript' src='".url_absolue(find_in_path('javascript/SearchHighlight.js'))."'></script>
+      <script type='text/javascript'>
+      if (window.jQuery)
+        (function(\$){\$(function(){
+          \$(document).SearchHighlight({
             style_name:'spip_surligne',
             exact:'whole',
             style_name_suffix:false,
@@ -67,14 +70,13 @@ function surligner_mots($page) {
             min_length: 3
           })
         });
+      })(jQuery);
       </script>
       ";
-      if(jquery_chargee($page)) {
-       //add javascript/SearchHighlight.js to the template jquery.js.html
-       $page = ajouter_js_affichage_final($page,"SearchHighlight");
-       //add a script inline into the <head>
-       $page = ajouter_js_affichage_final($page,$script,true);        
-      }
+      // on l'insere juste avant </head>, sinon tout en bas
+       if (is_null($l = strpos($page,'</head>')))
+       	$l = strlen($page);
+       $page = substr_replace($page, $script, $l,0);
       break;
     }
   return $page;
diff --git a/ecrire/inc_version.php b/ecrire/inc_version.php
index dd1db3fae5881b6a5fda65c91232920158b53ab8..89ddee1abda58a43356a6935a2009523bda2217f 100644
--- a/ecrire/inc_version.php
+++ b/ecrire/inc_version.php
@@ -227,11 +227,12 @@ $spip_pipeline = array(
 	'delete_all' => '',
 	'delete_statistiques' => '',
 	'exec_init' => '',
-	'header_prive' => '|f_jQuery||f_compacte_head',
-	'insert_head' => '|f_jQuery||f_compacte_head',
-	'insert_js' => '',
+	'header_prive' => '|f_jQuery',
+	'insert_head' => '|f_jQuery',
+	'jquery_plugins' => '',
+#	'insert_js' => '',
 	'lister_tables_noexport' => '',
-	'verifie_js_necessaire' => '',
+#	'verifie_js_necessaire' => '',
 	'mots_indexation' => '',
 	'nettoyer_raccourcis_typo' => '',
 	'pre_boucle' => '',
diff --git a/ecrire/public.php b/ecrire/public.php
index 4dba9ca06674f9bb7b217ab9ff1c1761e9a7b1a9..e64b26213463410f2e041267657a71b5ba243d45 100644
--- a/ecrire/public.php
+++ b/ecrire/public.php
@@ -217,8 +217,6 @@ if ($GLOBALS['_INC_PUBLIC']>0) {
 
 	}
 
-	if ($html) $page = analyse_js_ajoutee($page);
-
 	// Passer la main au debuggueur le cas echeant
 
 	if ($var_mode == 'debug') {
diff --git a/ecrire/public/assembler.php b/ecrire/public/assembler.php
index 96e978d0bcc244a8f9d40944216578ed42f9605b..1d706e5f2156610165a1f1a0537f2139df5cc26e 100644
--- a/ecrire/public/assembler.php
+++ b/ecrire/public/assembler.php
@@ -233,18 +233,17 @@ function assembler_page ($fond, $connect='') {
 
 	// Si requete HEAD ou Last-modified compatible, ignorer le texte
 	// et pas de content-type (pour contrer le bouton admin de inc-public)
-
 	if ($headers_only) {
 		$page['entetes']["Connection"] = "close";
 		$page['texte'] = "";
 	} else {
+		// si la page est prise dans le cache
 		if (!$use_cache)  {
-			if (isset($page['contexte'])){
-				// Remplir les globals pour les boutons d'admin
-				foreach ($page['contexte'] as $var=>$val)
-					$GLOBALS[$var] = $val;
-			}
-		} else {
+			// Informer les boutons d'admin du contexte
+			$GLOBALS['contexte'] = $page['contexte'];
+		}
+		// sinon analyser le contexte & calculer la page
+		else {
 			$parametrer = charger_fonction('parametrer', 'public');
 			$page = $parametrer($fond, '', $chemin_cache, $connect);
 
@@ -510,99 +509,6 @@ function f_msie ($texte) {
 }
 
 
-// Ajoute a la volee scripts a le squelette jquery.js.html
-// http://doc.spip.org/@ajouter_js_affichage_final
-function ajouter_js_affichage_final($page,$scripts,$inline = false) {
-	if(!$scripts || (!$inline && !preg_match(",\w+\|?,",$scripts)) || ($inline && !preg_match(",^\s*<script.*</script>\s*$,Us",$scripts))) {
-		spip_log("ajouter_js_afficaghe_final interdite $scripts");
-		return $page;
-	}
-	if($inline) {
-		$page = substr_replace($page,$scripts."\n",strpos($page,"</head>"),0);
-	}
-	//verifie c'est un script HTML et que jquery.js.html est la
-	else if($res = jquery_chargee($page)) {
-		list($pos_script,$appelle) = $res;
-		$params = $appelle.(strpos($appelle,"&")?"|":"&amp;script=").$scripts; 
-		$page = substr_replace($page,$params,$pos_script,strlen($appelle));
-	}
-	return $page;
-}
-
-//verifie si le squelette jquery.js.html est appelle dans un flux de page et donnee 
-//false ou un tableau avec la position et la chaine de l'appelle
-// http://doc.spip.org/@jquery_chargee
-function jquery_chargee($page) {
-	$pos_debut_head=strpos($page,"<head>");
-	$pos_fin_head=strpos($page,"</head>",$pos_debut_head);
-	if($pos_debut_head!==false && $pos_fin_head!==false) { 
-		$head = substr($page,$pos_debut_head,$pos_fin_head-$pos_debut_head);
-		// verifie on a l'appelle a le squelette jquery.js
-		if ($pos_script = strpos($head, generer_url_public('jquery.js'))){
-			$pos_script += $pos_debut_head;
-			$appelle = substr($page,$pos_script,strpos($page,'"',$pos_script)-$pos_script);
-			return array($pos_script,$appelle);
-		}
-	}
-	return false;
-}
-
-// http://doc.spip.org/@analyse_js_ajoutee
-function analyse_js_ajoutee($page) {
-	//verifie si jquery.js.html est chargee
-	$corps = $page['texte'];
-	if(!($jquery_chargee = jquery_chargee($corps))) return $page;
-	//verifie js necessaire
-	$js_necessaire = pipeline("verifie_js_necessaire",array("page" => $page, "data" => ""));
-	$scripts_fichier = $page['insert_js_fichier'];
-	$scripts_inline = $page['insert_js_inline'];
-	$scripts_a_ajouter = array();
-	if (is_array($scripts_fichier))
-		foreach($scripts_fichier as $nom => $script)
-		if (!isset($js_necessaire[$nom]) || $js_necessaire[$nom]) {
-			//ajoute script fichier
-			if(is_array($script)) 
-				foreach($script as $code)
-					push_script($scripts_a_ajouter,$code);
-			else
-				push_script($scripts_a_ajouter,$script);
-		}
-	// ajoute le scripts trouvee
-	if(count($scripts_a_ajouter)) {
-		$scripts_a_ajouter = join("|",$scripts_a_ajouter);
-		list($pos_script,$appelle) = $jquery_chargee;
-		$params = $appelle.(strpos($appelle,"&")?"|":"&amp;script=").$scripts_a_ajouter; 
-		$corps = substr_replace($corps,$params,$pos_script,strlen($appelle));
-	}
-	$scripts_a_ajouter = array();
-	if (is_array($scripts_inline))
-	foreach($scripts_inline as $nom => $script)
-	if (!isset($js_necessaire[$nom]) || $js_necessaire[$nom]) {
-		//ajoute script inline
-		if (is_array($script)) {
-			foreach($script as $code)
-				push_script($scripts_a_ajouter,$code,true);
-		} else
-			push_script($scripts_a_ajouter,$script,true);
-	}
-	// ajoute le scripts trouvee
-	if (count($scripts_a_ajouter)) {
-		list($pos_script,$appelle) = $jquery_chargee;
-		$pos_fin_script = strpos($corps,"</script>",$pos_script)+strlen("</script>");
-		$corps = substr_replace($corps,join("\n",$scripts_a_ajouter),$pos_fin_script,0);
-	}
-	$page['texte'] = $corps;
-	return $page;
-}
-
-// http://doc.spip.org/@push_script
-function push_script(&$scripts,$script,$inline = false) {
-  if(($inline && preg_match(",^\s*<script.*</script>\s*$,Us",$script)) || (!$inline && preg_match(",^\w+$,",$script)))
-    $scripts[]= $script;
-  else
-    spip_log("insert_js ".($inline?"inline":"")." interdite $script");
-}
-
 // http://doc.spip.org/@message_erreur_404
 function message_erreur_404 ($erreur= "") {
 	if (defined('_PAS_DE_PAGE_404'))
diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php
index e92464df555a5219788e11d875efeb4c7378839b..be79b2faa0541b1a986ca16a89bb82242993a882 100644
--- a/ecrire/public/balises.php
+++ b/ecrire/public/balises.php
@@ -975,6 +975,23 @@ function balise_HTTP_HEADER_dist($p) {
 	return $p;
 }
 
+// Filtre a appliquer a l'ensemble de la page une fois calculee
+// (filtrage fait au niveau du squelette, et sans s'appliquer aux <INCLURE>)
+function balise_FILTRE_dist($p) {
+	if ($p->param) {
+		$args = array();
+		foreach ($p->param as $i => $ignore)
+			$args[] = interprete_argument_balise($i+1,$p);
+		$p->code = '\'<'
+			.'?php header("X-Spip-Filtre: \'.'
+				.join('.', $args)
+			. " . '\"); ?'.'>'";
+
+		$p->interdire_scripts = false;
+		return $p;
+	}
+}
+
 //
 // #CACHE
 // definit la duree de vie ($delais) du squelette
diff --git a/ecrire/public/compiler.php b/ecrire/public/compiler.php
index 80026a34789d3926c3e59f73c89b874356d9a25e..b4f4dc7b7eaa5218746dec1a7a3b39587800fa84 100644
--- a/ecrire/public/compiler.php
+++ b/ecrire/public/compiler.php
@@ -892,7 +892,8 @@ function " . $nom . '($Cache, $Pile, $doublons=array(), $Numrows=array(), $SP=0)
 	// avant de referencer $Cache
 	$corps . ";
 
-	return analyse_resultat_skel('$nom', \$Cache, \$page);
+	return analyse_resultat_skel(".var_export($nom,true)
+		.", \$Cache, \$page, ".var_export($sourcefile,true).");
 }
 
 ?".">";
diff --git a/ecrire/public/parametrer.php b/ecrire/public/parametrer.php
index 6f81f0b659a2599f4b4fabe7a12670f93bfd0091..bdb714981dcabf0e88163fe328f14f111df3927b 100644
--- a/ecrire/public/parametrer.php
+++ b/ecrire/public/parametrer.php
@@ -58,8 +58,26 @@ function calculer_contexte() {
 	return $contexte;
 }
 
+
+function echapper_php_callback($r) {
+	static $src = array();
+	static $dst = array();
+
+	// si on recoit un tableau, on est en mode echappement
+	// on enregistre le code a echapper dans dst, et le code echappe dans src
+	if (is_array($r)) {
+		$dst[] = $r[0];
+		return $src[] = ' ___'.md5($r[0]).'___ ';
+	}
+
+	// si on recoit une chaine, on est en mode remplacement
+	$r = str_replace($src, $dst, $r);
+	$src = $dst = array(); // raz de la memoire
+	return $r;
+}
+
 // http://doc.spip.org/@analyse_resultat_skel
-function analyse_resultat_skel($nom, $cache, $corps) {
+function analyse_resultat_skel($nom, $cache, $corps, $source='') {
 	$headers = array();
 
 	// Recupere les < ?php header('Xx: y'); ? > pour $page['headers']
@@ -82,8 +100,25 @@ function analyse_resultat_skel($nom, $cache, $corps) {
 		? 'html'
 		: 'php';
 
+	// traiter #FILTRE{} ?
+	if (isset($headers['X-Spip-Filtre'])
+	AND strlen($headers['X-Spip-Filtre'])) {
+		// proteger les <INCLUDE> et tous les morceaux de php
+		if ($process_ins == 'php')
+			$corps = preg_replace_callback(',<[?](\s|php|=).*[?]>,UimsS',
+				echapper_php_callback, $corps);
+		foreach (explode(',', $headers['X-Spip-Filtre']) as $filtre) {
+			$corps = appliquer_filtre($corps, $filtre);
+		}
+		// restaurer les echappements
+		$corps = echapper_php_callback($corps);
+		unset($headers['X-Spip-Filtre']);
+	}
+
+
 	return array('texte' => $corps,
 		'squelette' => $nom,
+		'source' => $source,
 		'process_ins' => $process_ins,
 		'invalideurs' => $cache,
 		'entetes' => $headers,
@@ -244,22 +279,17 @@ function public_parametrer_dist($fond, $local='', $cache='', $connect='')  {
 		// 2. $fond est passe par reference, pour la meme raison
 		// Bref,  les URL dites propres ont une implementation sale.
 		// Interdit de nettoyer, faut assumer l'histoire.
-		global $contexte;
-		$contexte = calculer_contexte();
+		$GLOBALS['contexte'] = calculer_contexte();
 		if (!$renommer_urls) {
 			// compatibilite < 1.9.3
 			charger_generer_url();
 			if (function_exists('recuperer_parametres_url'))
 				$renommer_urls = 'recuperer_parametres_url';
 		}
-		if ($renommer_urls) {
+		if ($renommer_urls)
 			$renommer_urls($fond, nettoyer_uri());
-			// remettre les globales (bouton "Modifier cet article" etc)
-			foreach ($contexte as $var=>$val) {
-				if (substr($var,0,3) == 'id_') $GLOBALS[$var] = $val;
-			}
-		}
-		$local = $contexte;
+
+		$local = $GLOBALS['contexte'];
 
 		// si le champ chapo commence par '=' c'est une redirection.
 		// avec un eventuel raccourci Spip
@@ -340,14 +370,19 @@ function public_parametrer_dist($fond, $local='', $cache='', $connect='')  {
 		$GLOBALS['les_notes'] = $notes;
 
 		// spip_log: un joli contexte
-		$info = array();
-		foreach($local as $var => $val)
-			if($val)
-				$info[] = "$var='$val'";
+		$infos = array();
+		foreach (array_filter($local) as $var => $val) {
+			if (is_array($val)) $val = "[".join($val)."]";
+			if (strlen("$val") > 20)
+				$val = substr("$val", 0,17).'..';
+			if (strstr($val,' '))
+				$val = "'$val'";
+			$infos[] = $var.'='.$val;
+		}
 		spip_log("calcul ("
 			.($profile = spip_timer($a))
 			.") [$skel] "
-			. join(', ',$info)
+			. join(', ', $infos)
 			.' ('.strlen($page['texte']).' octets)'
 		);
 		if ($debug)