Index: includes/common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/common.inc,v
retrieving revision 1.611
diff -u -F^f -r1.611 common.inc
--- includes/common.inc	10 Jan 2007 23:30:07 -0000	1.611
+++ includes/common.inc	6 Feb 2007 04:59:29 -0000
@@ -1510,13 +1510,14 @@ function drupal_build_css_cache($types, 
     foreach ($types as $type) {
       foreach ($type as $file => $cache) {
         if ($cache) {
-          $contents = file_get_contents($file);
-          // Return the path to where this CSS file originated from, stripping off the name of the file at the end of the path.
-          $path = base_path() . substr($file, 0, strrpos($file, '/')) .'/';
-          // Wraps all @import arguments in url().
-          $contents = preg_replace('/@import\s+(?!url)[\'"]?(\S*)\b[\'"]?/i', '@import url("\1")', $contents);
-          // Fix all paths within this CSS file, ignoring absolute paths.
-          $data .= preg_replace('/url\(([\'"]?)(?![a-z]+:)/i', 'url(\1'. $path . '\2', $contents);
+          $contents = drupal_load_stylesheet($file);
+
+          // Prepare the full path to the CSS file and pass it to the callback.
+          $base = base_path() . dirname($file) .'/';
+          _drupal_build_css_cache(NULL, $base);
+
+          // Prefix all paths within this CSS file, ignoring absolute paths.
+          $data .= preg_replace_callback('/url\([\'"]?(?![a-z]+:)([^\'")]+)[\'"]?\)/i', '_drupal_build_css_cache', $contents);
         }
       }
     }
@@ -1541,6 +1542,53 @@ function drupal_build_css_cache($types, 
 }
 
 /**
+ * Helper function for drupal_build_css_cache().
+ */
+function _drupal_build_css_cache($matches, $base = NULL) {
+  static $_base;
+  // Store base path.
+  if (isset($base)) {
+    $_base = $base;
+  }
+
+  // Prefix with base and remove '../' segments where possible.
+  $path = $_base . $matches[1];
+  $last = '';
+  while ($path != $last) {
+    $last = $path;
+    $path = preg_replace('`(^|/)(?!../)([^/]+)/../`', '$1', $path);
+  }
+  return 'url('. $path .')';
+}
+
+/**
+ * Loads the stylesheet and resolves all @import commands.
+ */
+function drupal_load_stylesheet($file) {
+  // Load the CSS.
+  $contents = file_get_contents($file);
+
+  // Change to the stylesheet's directory.
+  $cwd = getcwd();
+  chdir(dirname($file));
+
+  // Replace @import commands with the actual stylesheet.
+  $contents = preg_replace_callback('/@import\s*(?:url\()?["\']([^"\')]+)["\']\)?;/', '_drupal_load_stylesheet', $contents);
+
+  // Change back.
+  chdir($cwd);
+  return $contents;
+}
+
+/**
+ * Helper function for drupal_load_stylesheet().
+ */
+function _drupal_load_stylesheet($matches) {
+  // Load file and alter all url() paths.
+  return preg_replace('/url\(([\'"]?)(?![a-z]+:)/i', 'url(\1'. dirname($matches[1]) .'/', file_get_contents($matches[1]));
+}
+
+/**
  * Delete all cached CSS files.
  */
 function drupal_clear_css_cache() {
Index: modules/color/color.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/color/color.module,v
retrieving revision 1.15
diff -u -F^f -r1.15 color.module
--- modules/color/color.module	20 Jan 2007 08:12:20 -0000	1.15
+++ modules/color/color.module	6 Feb 2007 04:59:29 -0000
@@ -268,9 +268,6 @@ function color_scheme_form_submit($form_
  * Rewrite the stylesheet to match the colors in the palette.
  */
 function _color_rewrite_stylesheet($theme, &$info, &$paths, $palette) {
-  // Load stylesheet
-  $style = file_get_contents($paths['source'] .'style.css');
-
   // Prepare color conversion table
   $conversion = $palette;
   unset($conversion['base']);
@@ -279,15 +276,12 @@ function _color_rewrite_stylesheet($them
   }
   $default = color_get_palette($theme, true);
 
+  // Load stylesheet (and resolve imports).
+  $style = drupal_load_stylesheet($paths['source'] .'style.css');
+
   // Split off the "Don't touch" section of the stylesheet.
   list($style, $fixed) = explode("Color Module: Don't touch", $style);
 
-  // Look for @import commands and insert the referenced stylesheets.
-  $cwd = getcwd();
-  chdir(drupal_get_path('theme', $theme));
-  $style = preg_replace_callback('/@import\s*["\']([^"\']+)["\'];/', '_color_import_stylesheet', $style);
-  chdir($cwd);
-
   // Find all colors in the stylesheet and the chunks in between.
   $style = preg_split('/(#[0-9a-f]{6}|#[0-9a-f]{3})/i', $style, -1, PREG_SPLIT_DELIM_CAPTURE);
   $is_color = false;
@@ -342,13 +336,6 @@ function _color_rewrite_stylesheet($them
 }
 
 /**
- * Helper function for _color_rewrite_stylesheet.
- */
-function _color_import_stylesheet($matches) {
-  return preg_replace('/url\(([\'"]?)(?![a-z]+:)/i', 'url(\1'. dirname($matches[1]) .'/', file_get_contents($matches[1]));
-}
-
-/**
  * Render images that match a given palette.
  */
 function _color_render_images($theme, &$info, &$paths, $palette) {
