diff --git a/.gitattributes b/.gitattributes
index f78906355f86c10cf1e5143f754b14471c923f84..367490a7ffbb7dbf9f2cc1bb51da54e2eb90f533 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -471,6 +471,7 @@ ecrire/inc/boutons.php -text
 ecrire/inc/chercher_logo.php -text
 ecrire/inc/chercher_rubrique.php -text
 ecrire/inc/commencer_page.php -text
+ecrire/inc/compacte_js.php -text
 ecrire/inc/cookie.php -text
 ecrire/inc/dater.php -text
 ecrire/inc/discuter.php -text
@@ -500,7 +501,6 @@ ecrire/inc/informer_auteur.php -text
 ecrire/inc/instituer_article.php -text
 ecrire/inc/instituer_auteur.php -text
 ecrire/inc/joindre.php -text
-ecrire/inc/jscompressor.php -text
 ecrire/inc/lang_liste.php -text
 ecrire/inc/legender.php -text
 ecrire/inc/legender_auteur.php -text
diff --git a/dist/jquery.js.html b/dist/jquery.js.html
index 2f87350119866a925e1584d5ba933d4c7462acfc..3ffc0c1c2827b4df77daef63ec179a9c51a7210a 100644
--- a/dist/jquery.js.html
+++ b/dist/jquery.js.html
@@ -14,6 +14,6 @@
  * + form.js (jquery.com)
  * + ajaxCallback.js (www.spip.net)
  */
-[(#CHEMIN{javascript/jquery-1.1.js}|spip_file_get_contents|compacte_js)]
-[(#CHEMIN{javascript/form.js}|spip_file_get_contents|compacte_js)]
-[(#CHEMIN{javascript/ajaxCallback.js}|spip_file_get_contents|compacte_js)]
+[(#CHEMIN{javascript/jquery-1.1.js}|compacte|spip_file_get_contents)]
+[(#CHEMIN{javascript/form.js}|compacte|spip_file_get_contents)]
+[(#CHEMIN{javascript/ajaxCallback.js}|compacte|spip_file_get_contents)]
diff --git a/ecrire/inc/jscompressor.php b/ecrire/inc/compacte_js.php
similarity index 93%
rename from ecrire/inc/jscompressor.php
rename to ecrire/inc/compacte_js.php
index f30f54d486359201e7599d5430fa0a9a03e4beba..0b6284ec9d1484708b720b700926cbe85496682d 100644
--- a/ecrire/inc/jscompressor.php
+++ b/ecrire/inc/compacte_js.php
@@ -56,7 +56,6 @@ class SourceMap {
          * @param	string		generic source code
          * @param	array		array with nested array with code rules
 	 */
-// http://doc.spip.org/@getMap
 	function getMap(&$source, &$delimeters) {
 		
 		# "unsigned" integer variables
@@ -151,7 +150,6 @@ class SourceMap {
 		return $tempMap;
 	}
 	
-// http://doc.spip.org/@__endCharNoSlash
 	function __endCharNoSlash(&$source, $position, &$find, &$len) {
 		$temp = strlen($find);
 		do {
@@ -161,7 +159,6 @@ class SourceMap {
 		return $position + $temp;
 	}
 	
-// http://doc.spip.org/@__charNoSlash
 	function __charNoSlash(&$source, &$position) {
 		$next = 1; $len = $position - $next;
 		while($len > 0 && $source{$len} === '\\') $len = $position - (++$next);
@@ -196,13 +193,11 @@ class BaseConvert {
 	
 	var	$base, $baseLength;
 	
-// http://doc.spip.org/@BaseConvert
 	function BaseConvert($base) {
 		$this->base = &$base;
 		$this->baseLength = strlen($base);
 	}
 	
-// http://doc.spip.org/@toBase
 	function toBase($num) {
 		$module = 0; $result = '';
 		while($num) {
@@ -212,7 +207,6 @@ class BaseConvert {
 		return $result !== '' ? $result : $this->base{0};
 	}
 	
-// http://doc.spip.org/@fromBase
 	function fromBase($str) {
 		$pos = 0; $len = strlen($str) - 1; $result = 0;
 		while($pos < $len)
@@ -312,7 +306,6 @@ class JavaScriptCompressor {
 	 * public constructor
          * 	creates a new BaseConvert class variable (base 36)
 	 */
-// http://doc.spip.org/@JavaScriptCompressor
 	function JavaScriptCompressor() {
 		$this->__SourceMap = new SourceMap();
 		$this->__BC = new BaseConvert('0123456789abcdefghijklmnopqrstuvwxyz');
@@ -331,7 +324,6 @@ class JavaScriptCompressor {
          *      compress JavaScript removing comments and somespaces (on by default)
          * @param	mixed		view example and notes on class comments
 	 */
-// http://doc.spip.org/@getClean
 	function getClean($jsSource) {
 		return $this->__commonInitMethods($jsSource, false);
 	}
@@ -342,24 +334,20 @@ class JavaScriptCompressor {
          *      compress JavaScript replaceing words and removing comments and some spaces
          * @param	mixed		view example and notes on class comments
 	 */
-// http://doc.spip.org/@getPacked
 	function getPacked($jsSource) {
 		return $this->__commonInitMethods($jsSource, true);
 	}
 	
 	/** 'private' methods, any comment sorry */
-// http://doc.spip.org/@__addCleanCode
 	function __addCleanCode($str) {
 		return preg_replace($this->__cleanFinder, $this->__cleanReplacer, trim($str));
 	}
-// http://doc.spip.org/@__addClean
 	function __addClean(&$arr, &$str, &$start, &$end, $clean) {
 		if($clean)
 			array_push($arr, $this->__addCleanCode(substr($str, $start, $end - $start)));
 		else
 			array_push($arr, substr($str, $start, $end - $start));
 	}
-// http://doc.spip.org/@__clean
 	function __clean(&$str) {
 		$len = strlen($str);
 		$type = '';
@@ -380,7 +368,6 @@ class JavaScriptCompressor {
  		}
 		return preg_replace("/(\n)+/", "\n", trim(implode('', $clean)));
 	}
-// http://doc.spip.org/@__commonInitMethods
 	function __commonInitMethods(&$jsSource, $packed) { 
 		$header = '';
 		$this->__startTime = $this->__getTime();
@@ -398,7 +385,6 @@ class JavaScriptCompressor {
 		$this->__setStats();
 		return $header.$this->__sources;
 	}
-// http://doc.spip.org/@__getHeader
 	function __getHeader() {
 		return implode('', array(
 			'/* ',$this->__getScriptNames(),'JavaScriptCompressor ',$this->version,' [www.devpro.it], ',
@@ -406,7 +392,6 @@ class JavaScriptCompressor {
 			" */\r\n"		
 		));
 	}
-// http://doc.spip.org/@__getScriptNames
 	function __getScriptNames() {
 		$a = 0;
 		$result = array();
@@ -419,7 +404,6 @@ class JavaScriptCompressor {
 			$result[$a] .= ' with ';
 		return $a < 0 ? '' : implode(', ', $result);
 	}
-// http://doc.spip.org/@__getSize
 	function __getSize($size, $dec = 2) {
 		$toEval = '';
 		$type = array('bytes', 'Kb', 'Mb', 'Gb');
@@ -438,7 +422,6 @@ class JavaScriptCompressor {
 		}
 		return $fSize;
 	}
-// http://doc.spip.org/@__getTime
 	function __getTime($startTime = null) {
 		list($usec, $sec) = explode(' ', microtime());
 		$newtime = (float)$usec + (float)$sec;
@@ -446,14 +429,12 @@ class JavaScriptCompressor {
 			$newtime = number_format(($newtime - $startTime), 3);
 		return $newtime;
 	}
-// http://doc.spip.org/@__pack
 	function __pack(&$str) {
 		$container = array();
 		$str = preg_replace("/(\w+)/e", '$this->__BC->toBase($this->__wordsParser("\\1",$container));', $this->__clean($str));
 		$str = str_replace("\n", '\n', addslashes($str));
 		return 'eval(function(A,G){return A.replace(/(\\w+)/g,function(a,b){return G[parseInt(b,36)]})}("'.$str.'","'.implode(',', $container).'".split(",")));';
 	}
-// http://doc.spip.org/@__setStats
 	function __setStats() {
 		$this->stats = implode(' ', array(
 			$this->__getSize($this->__sourceLength),
@@ -464,7 +445,6 @@ class JavaScriptCompressor {
 			'seconds'
 		));
 	}
-// http://doc.spip.org/@__sourceManager
 	function __sourceManager(&$jsSource) {
 		$b = count($jsSource);
 		$this->__sources = array();
@@ -484,12 +464,10 @@ class JavaScriptCompressor {
 		}
 		$this->__totalSources = count($this->__sources);
 	}
-// http://doc.spip.org/@__sourcePusher
 	function __sourcePusher(&$code, $name) {
 		$this->__sourceLength += strlen($code);
 		array_push($this->__sources, array('code'=>$code, 'name'=>$name));
 	}
-// http://doc.spip.org/@__wordsParser
 	function __wordsParser($str, &$d) {
 		if(is_null($key = array_shift($key = array_keys($d,$str))))
 			$key = array_push($d, $str) - 1;
diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php
index f82389fb0cce22a868c0473aecc5dfd0f6a86995..b1e46357e736a9d9c4044d0b954191dc7c6d46fd 100644
--- a/ecrire/inc/filtres.php
+++ b/ecrire/inc/filtres.php
@@ -1752,24 +1752,8 @@ function url_absolue_css ($css) {
 	return $f;
 }
 
-// recuperere le chemin d'une css existante et :
-// cree (ou recree) dans _DIR_VAR/cache_css/ une css compactee en nettoyant tout ce qui n'est pas significatif
 // http://doc.spip.org/@compacte_css
-function compacte_css ($css) {
-	if (!preg_match(',\.css$,i', $css, $r)) return $css;
-	
-	$f = basename($css,'.css');
-	$f = sous_repertoire (_DIR_VAR, 'cache-css') 
-		. preg_replace(",(.*?)(_rtl|_ltr)?$,","\\1-compacte-" . substr(md5("$css-compacte"), 0,4) . "\\2",$f) 
-		. '.css';
-
-	if ((@filemtime($f) > @filemtime($css))
-	AND ($GLOBALS['var_mode'] != 'recalcul'))
-		return $f;
-
-	if (!lire_fichier($css, $contenu))
-		return $css;
-
+function compacte_css ($contenu) {
 	// nettoyer la css de tout ce qui sert pas
 	$contenu = preg_replace(",/\*.*\*/,Ums","",$contenu); // pas de commentaires
 	$contenu = preg_replace(",\s(?=\s),Ums","",$contenu); // pas d'espaces consecutifs
@@ -1779,17 +1763,9 @@ function compacte_css ($css) {
 	$contenu = preg_replace(",([^{}]*){},Ums"," ",$contenu); // supprimer les declarations vides
 	$contenu = trim($contenu);
 
-	// ecrire la css
-	if (!ecrire_fichier($f, $contenu))
-		return $css;
-
-	return $f;
+	return $contenu;
 }
 
-### fonction depreciee, laissee ici pour compat ascendante 1.9
-// http://doc.spip.org/@entites_unicode
-function entites_unicode($texte) { return charset2unicode($texte); }
-
 // filtre table_valeur
 // permet de recuperer la valeur d'un tableau pour une cle donnee
 // prend en entree un tableau serialise ou non (ce qui permet d'enchainer le filtre)
@@ -1892,13 +1868,12 @@ function concat(){
 	return join('', $args);
 }
 
+
 // Compacte du javascript grace a javascriptcompressor
 // utile pour dist/jquery.js par exemple
-// attention contrairement a compacte_css ici c'est un flux qui est compacte
-// et pas un fichier ... comment unifier ?
 // http://doc.spip.org/@compacte_js
 function compacte_js($flux) {
-	include_spip('inc/jscompressor');
+	include_spip('inc/compacte_js');
 	$k = new JavaScriptCompressor();
 	// en cas d'echec (?) renvoyer l'original
 	if (strlen($t = $k->getClean($flux)))
@@ -1907,4 +1882,45 @@ function compacte_js($flux) {
 		return $flux;
 }
 
+// Si la source est un chemin, on retourne un chemin avec le contenu compacte
+// dans _DIR_VAR/cache_$format/
+// Si c'est un flux on le renvoit compacte
+// Si on ne sait pas compacter, on renvoie ce qu'on a recu
+function compacte($source, $format = null) {
+	if (!$format AND preg_match(',\.(js|css)$,', $source, $r))
+		$format = $r[1];
+	if (!function_exists($compacte = 'compacte_'.$format))
+		return $source;
+
+	// Si on n'importe pas, est-ce un fichier ?
+	if (!preg_match(',[\s{}],', $source)
+	AND preg_match(',\.'.$format.'$,i', $source, $r)
+	AND file_exists($source)) {
+		$f = basename($source,'.'.$format);
+		$f = sous_repertoire (_DIR_VAR, 'cache-'.$format) 
+		. preg_replace(",(.*?)(_rtl|_ltr)?$,","\\1-compacte-"
+		. substr(md5("$source-compacte"), 0,4) . "\\2", $f, 1)
+		. '.' . $format;
+
+		if ((@filemtime($f) > @filemtime($css))
+		AND ($GLOBALS['var_mode'] != 'recalcul'))
+			return $f;
+
+		if (!lire_fichier($source, $contenu))
+			return $source;
+
+		// traiter le contenu
+		$contenu = $compacte($contenu);
+
+		// ecrire le fichier destination, en cas d'echec renvoyer la source
+		if (ecrire_fichier($f, $contenu))
+			return $f;
+		else
+			return $source;
+	}
+
+	// Sinon simple compactage de contenu
+	return $compacte($source);
+}
+
 ?>
diff --git a/ecrire/inc/vieilles_defs.php b/ecrire/inc/vieilles_defs.php
index 823d4250b6537b9e0a2244359a968f449ce6a63a..90e50ddcbe943afaf6e34694b41abc2484e9daad 100644
--- a/ecrire/inc/vieilles_defs.php
+++ b/ecrire/inc/vieilles_defs.php
@@ -16,7 +16,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 /* qui ont fait partie des fichiers de configurations de Spip	*/
 /* mais en ont ete retires ensuite.				*/
 /* Ce fichier n'est donc jamais charge par la presente version	*/
-/* mais est present pour que les contributions à Spip puissent	*/
+/* mais est present pour que les contributions a Spip puissent	*/
 /* fonctionner en chargeant ce fichier, en attendant d'etre	*/
 /* reecrites conformement a la nouvelle interface.		*/
 
@@ -167,7 +167,6 @@ spip_log('debut_page() '.$GLOBALS['REQUEST_URI'].' - '.$_SERVER['SCRIPT_NAME'],
 }
 
 // obsolete, utiliser calculer_url
-
 // http://doc.spip.org/@extraire_lien
 function extraire_lien ($regs) {
 spip_log('extraire_lien() '.$GLOBALS['REQUEST_URI'].' - '.$_SERVER['SCRIPT_NAME'], 'vieilles_defs');
@@ -204,6 +203,7 @@ spip_log('afficher_formulaire_date() '.$GLOBALS['REQUEST_URI'].' - '.$_SERVER['S
 
 // http://doc.spip.org/@ratio_image
 function ratio_image($logo, $nom, $format, $taille, $taille_y, $attributs) {
+spip_log('ratio_image() '.$GLOBALS['REQUEST_URI'].' - '.$_SERVER['SCRIPT_NAME'], 'vieilles_defs');
 	// $logo est le nom complet du logo ($logo = "chemin/$nom.$format)
 	// $nom et $format ne servent plus du fait du passage par le filtre image_reduire
 	include_spip('inc/filtres_images');
@@ -211,4 +211,10 @@ function ratio_image($logo, $nom, $format, $taille, $taille_y, $attributs) {
 	return $res;
 }
 
+// http://doc.spip.org/@entites_unicode
+function entites_unicode($texte) {
+spip_log('entites_unicode() '.$GLOBALS['REQUEST_URI'].' - '.$_SERVER['SCRIPT_NAME'], 'vieilles_defs');
+	return charset2unicode($texte);
+}
+
 ?>