From 62c143a8ea6f226afce1dce148541c11b66f358d Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Wed, 10 Jan 2007 21:39:24 +0000
Subject: [PATCH] "direction_css prend en charge les css en url absolues, et se
 propage dans les import de la css traitee les images backgrounds sont passees
 en url absolues aussi"

---
 ecrire/inc/filtres.php | 48 ++++++++++++++++++++++++++++++++++--------
 1 file changed, 39 insertions(+), 9 deletions(-)

diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php
index 6de7c3a6b1..fe930e9b22 100644
--- a/ecrire/inc/filtres.php
+++ b/ecrire/inc/filtres.php
@@ -1609,24 +1609,54 @@ function direction_css ($css, $voulue='') {
 		return $f;
 
 	// 2.
-	$f = sous_repertoire (_DIR_VAR, 'cache-css')
+	$dir_var = sous_repertoire (_DIR_VAR, 'cache-css');
+	$f = $dir_var
 		. preg_replace(',.*/(.*?)(_rtl)?\.css,', '\1', $css)
 		. '.' . substr(md5($css), 0,4) . '_' . $ndir . '.css';
 
-	if ((@filemtime($f) > @filemtime($css))
-	AND ($GLOBALS['var_mode'] != 'recalcul'))
-		return $f;
-
-	if (!lire_fichier($css, $contenu))
-		return $css;
+	// la css peut etre distante (url absolue !)
+	if (preg_match(",^http:,i",$css)){
+		include_spip('inc/distant');
+		$contenu = recuperer_page($css);
+		if (!$contenu) return $css;
+	}
+	else {
+		if ((@filemtime($f) > @filemtime($css))
+			AND ($GLOBALS['var_mode'] != 'recalcul'))
+			return $f;
+		if (!lire_fichier($css, $contenu))
+			return $css;
+	}
 
 	$contenu = str_replace(
 		array('right', 'left', '@@@@L E F T@@@@'),
 		array('@@@@L E F T@@@@', 'right', 'left'),
 		$contenu);
 	
+	// reperer les @import auxquels il faut propager le direction_css
+	preg_match_all(",\@import\s*url\s*\(\s*['\"]?([^'\"/][^:]*)['\"]?\s*\),Uims",$contenu,$regs);
+	$src = array();$src_direction_css = array();$src_faux_abs=array();
+	$d = dirname($css);
+	foreach($regs[1] as $k=>$import_css){
+		$css_direction = direction_css("$d/$import_css",$voulue);
+		// si la css_direction est dans le meme path que la css d'origine, on tronque le path, elle sera passee en absolue
+		if (substr($css_direction,0,strlen($d)+1)=="$d/") $css_direction = substr($css_direction,strlen($d)+1);
+		// si la css_direction commence par $dir_var on la fait passer pour une absolue
+		elseif (substr($css_direction,0,strlen($dir_var))==$dir_var) {
+			$css_direction = substr($css_direction,strlen($dir_var));
+			$src_faux_abs["/@@@@@@/".$css_direction] = $css_direction;
+			$css_direction = "/@@@@@@/".$css_direction;
+		}
+		$src[] = $regs[0][$k];
+		$src_direction_css[] = str_replace($import_css,$css_direction,$regs[0][$k]);
+	}
+	$contenu = str_replace($src,$src_direction_css,$contenu);
+	
 	// passer les url relatives a la css d'origine en url absolues
-	$contenu = preg_replace(",url\(([^/][^:]*)\),Uims","url($path\\1)",$contenu);
+	$contenu = preg_replace(",url\s*\(\s*['\"]?([^'\"/][^:]*)['\"]?\s*\),Uims","url($path\\1)",$contenu);
+	// virer les fausses url absolues que l'on a mis dans les import
+	if (count($src_faux_abs))
+		$contenu = str_replace(array_keys($src_faux_abs),$src_faux_abs,$contenu);
 
 	if (!ecrire_fichier($f, $contenu))
 		return $css;
@@ -1655,7 +1685,7 @@ function url_absolue_css ($css) {
 		return $css;
 
 	// passer les url relatives a la css d'origine en url absolues
-	$contenu = preg_replace(",url\(([^/][^:]*)\),Uims","url($path\\1)",$contenu);
+	$contenu = preg_replace(",url\s*\(\s*['\"]?([^'\"/][^:]*)['\"]?\s*\),Uims","url($path\\1)",$contenu);
 
 	// ecrire la css
 	if (!ecrire_fichier($f, $contenu))
-- 
GitLab