From b18ae2f539d205861fe58b6fe2deb3ddffd5613c Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Thu, 2 Nov 2006 14:31:08 +0000
Subject: [PATCH] deux filtres pour traiter les css : - url_absolue_css passe
 toutes les url relatives dans la css en url absolues (a utiliser avant l'un
 des filres direction_css ou compacte_css, ou pour utiliser la webdevelopper
 toolbar) - compacte_css supprime de la css toutes les infos non
 significatives pour limiter son poids

---
 ecrire/inc/filtres.php | 62 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 61 insertions(+), 1 deletion(-)

diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php
index 6957d125ef..aee9dbfffb 100644
--- a/ecrire/inc/filtres.php
+++ b/ecrire/inc/filtres.php
@@ -1562,7 +1562,7 @@ function calcul_pagination($total, $nom, $pas, $liste = true, $modele='') {
 
 // recuperere le chemin d'une css existante et :
 // 1. regarde si une css inversee droite-gauche existe dans le meme repertoire
-// 2. sinon la cree (ou la recree) dans IMG/cache_css/
+// 2. sinon la cree (ou la recree) dans _DIR_VAR/cache_css/
 // SI on lui donne a manger une feuille nommee _rtl.css il va faire l'inverse
 // http://doc.spip.org/@direction_css
 function direction_css ($css, $voulue='') {
@@ -1611,6 +1611,66 @@ function direction_css ($css, $voulue='') {
 	return $f;
 }
 
+// recuperere le chemin d'une css existante et :
+// cree (ou recree) dans _DIR_VAR/cache_css/ une css dont les url relatives sont passees en url absolues
+function url_absolue_css ($css) {
+	if (!preg_match(',\.css$,i', $css, $r)) return $css;
+
+	$path = dirname(url_absolue($css))."/"; // pour mettre sur les images
+	
+	$f = basename($css,'.css');
+	$f = sous_repertoire (_DIR_VAR, 'cache-css') . "$f-url_absolue"
+		. '_' . substr(md5("$css-url_absolue"), 0,4) . '.css';
+
+	if ((@filemtime($f) > @filemtime($css))
+	AND ($GLOBALS['var_mode'] != 'recalcul'))
+		return $f;
+
+	if (!lire_fichier($css, $contenu))
+		return $css;
+
+	// passer les url relatives a la css d'origine en url absolues
+	$contenu = preg_replace(",url\(([^/][^:]*)\),Uims","url($path\\1)",$contenu);
+
+	// ecrire la css
+	if (!ecrire_fichier($f, $contenu))
+		return $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
+function compacte_css ($css) {
+	if (!preg_match(',\.css$,i', $css, $r)) return $css;
+	
+	$f = basename($css,'.css');
+	$f = sous_repertoire (_DIR_VAR, 'cache-css') . "$f-compacte"
+		. '_' . substr(md5("$css-compacte"), 0,4) . '.css';
+
+	if ((@filemtime($f) > @filemtime($css))
+	AND ($GLOBALS['var_mode'] != 'recalcul'))
+		return $f;
+
+	if (!lire_fichier($css, $contenu))
+		return $css;
+
+	// 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
+	$contenu = preg_replace("/\s?({|;|,|:)\s?/ms","$1",$contenu); // pas d'espaces dans les declarations css
+	$contenu = preg_replace("/\s}/ms","}",$contenu); // pas d'espaces dans les declarations css
+	$contenu = preg_replace(",#([0-9a-f])(\\1)([0-9a-f])(\\3)([0-9a-f])(\\5),i","#$1$3$5",$contenu); // passser les codes couleurs en 3 car si possible
+	$contenu = preg_replace(",([^{}]*){},Ums"," ",$contenu); // supprimer les declarations vides
+	$contenu = trim($contenu);
+
+	// ecrire la css
+	if (!ecrire_fichier($f, $contenu))
+		return $css;
+
+	return $f;
+}
+
 ### fonction depreciee, laissee ici pour compat ascendante 1.9
 // http://doc.spip.org/@entites_unicode
 function entites_unicode($texte) { return charset2unicode($texte); }
-- 
GitLab