CSS optimizer Multifile. Optimizes multiple css resources into 1 css output.
HotScript @ RoŲnašn index for more scripts and extensions.
Run this script as an example.
<?php
/**********************************************************************
* (c)2004 RoŲnašn
*
* CSS_OPTIMIZER MULTIFILE EDITION
*
* If you do not use this multifile capability, download cssoptimizer instead:
* http://www.roonaan.nl/hotscripts/index.php?script=cssoptimizer.php
*
*
* Use this tool online @ www.roonaan.nl/tools/cssopt/
*
*
*
* This file servers as index.php for a dir containing css stylesheet
* files. In order to activate the cache you should redirect all calls
* to your stylesheets through this file.
* ie: <link rel="stylesheet" href="css/file1.css" />
* becomes
*     <link rel="stylesheet" href="css/?file1" />
*
* In addition to the original css optimizer, this optimizer supports
* optimizing multiple files into one cache file:
* ie: <link rel="stylesheet" href="css/file1.css" />
*     <link rel="stylesheet" href="css/file2.css" />
*     ..
*     <link rel="stylesheet" href="css/fileN.css" />
* becomes
*     <link rel="stylesheet" href="css/?file1,file2,..,fileN" />
*
* Note: To increase bandwidth reduction, do not add the .css
* extension and use '/?' instead of '/index.php?'
*
* The optimized file will be stores as file1file2..fileN.cch (Ccs caCHe)
*
* Your original css-files will not be tampered and maintain as readable
* as you programmed it to be.
*
* On each call file updates to file1.css-fileN.css will be noticed and
* the cache will be reconstructed. When the cache is up
* to date, this file will be passed thru directly.
*
* Note: As you might discover, this file needs to have file creation
*       rights and file writing rights in order to create and maintain
*       the optimized file.
*
* Questions on css_optimizer will be answered thru email:
* hotscripts@roonaan.nl.
*
* Please add "css_optimizer" to the message subject.
*
* In order to gain additional parsing speed, you can remove all but 
* the first line (copyright statement) of comments.
**********************************************************************/
error_reporting(E_ALL);
$s  explode(',',$_SERVER['QUERY_STRING']);
$f2 dirname(__FILE__).'/'.str_replace(',','',$_SERVER['QUERY_STRING']).'.cch';
$d2 is_file($f2) ? filemtime($f2) : 0;
$update_needed false;
$f1 = array();
foreach(
$s as $f)
{
  
$f $f.'.css';
  if(
is_file($f))
  {
    if(
filemtime($f) > $d2)
    {
      
$update_needed true;
      echo 
'/*updating on file "'.$f.'"*/';
    }
    
$f1[] = $f;
  }
  elseif(
$f != '.css')
  {
    echo 
'/*'.$f.' is not a file*/';
  }
}

if(
$d2 filemtime(__FILE__)) $update_needed true;

if(
$update_needed)
{
  function 
css_opt($d)
  {
    while((
$i strpos($d'/*')) !== false)
    {
      
$i2 strpos($d'*/',$i);
      if(
$i2===false) break;
      
$d substr($d0$i).substr($d,$i2+2);
    }
    
$d str_replace('/*','',$d);
    
$d str_replace("\n",'',$d);
    
$d str_replace("\r",'',$d);
    
$d str_replace("\t",'',$d);
    
$d ereg_replace('[ ]+',' ',$d);
    
$d str_replace(': ',':'$d);
    
$d str_replace('; ',';'$d);
    
$d str_replace(', ',','$d);
    
$d str_replace(' :',':'$d);
    
$d str_replace(' ;',';'$d);
    
$d str_replace(' ,',','$d);
    
$d color_opt($d);
    
    return 
$d;
  }
  
  function 
color_opt($d)
  {
    
/* Replace color names with hex representation and vice versa. */
    
$cn = array('AliceBlue' => '#F0F8FF','AntiqueWhite' => '#FAEBD7',
    
'Aqua' => '#00FFFF','Aquamarine' => '#7FFFD4','Azure' => '#F0FFFF',
    
'Beige' => '#F5F5DC','Bisque' => '#FFE4C4','Black' => '#000000',
    
'BlanchedAlmond' => '#FFEBCD','Blue' => '#0000FF','BlueViolet' => '#8A2BE2',
    
'Brown' => '#A52A2A','BurlyWood' => '#DEB887','CadetBlue' => '#5F9EA0',
    
'Chartreuse' => '#7FFF00','Chocolate' => '#D2691E','Coral' => '#FF7F50',
    
'CornflowerBlue' => '#6495ED','Cornsilk' => '#FFF8DC','Crimson' => '#DC143C',
    
'Cyan' => '#00FFFF','DarkBlue' => '#00008B','DarkCyan' => '#008B8B',
    
'DarkGoldenRod' => '#B8860B','DarkGray' => '#A9A9A9','DarkGreen' => '#006400',
    
'DarkKhaki' => '#BDB76B','DarkMagenta' => '#8B008B','DarkOliveGreen' => '#556B2F',
    
'Darkorange' => '#FF8C00','DarkOrchid' => '#9932CC','DarkRed' => '#8B0000',
    
'DarkSalmon' => '#E9967A','DarkSeaGreen' => '#8FBC8F','DarkSlateBlue' => '#483D8B',
    
'DarkSlateGray' => '#2F4F4F','DarkTurquoise' => '#00CED1','DarkViolet' => '#9400D3',
    
'DeepPink' => '#FF1493','DeepSkyBlue' => '#00BFFF','DimGray' => '#696969',
    
'DodgerBlue' => '#1E90FF','Feldspar' => '#D19275','FireBrick' => '#B22222',
    
'FloralWhite' => '#FFFAF0','ForestGreen' => '#228B22','Fuchsia' => '#FF00FF',
    
'Gainsboro' => '#DCDCDC','GhostWhite' => '#F8F8FF','Gold' => '#FFD700',
    
'GoldenRod' => '#DAA520','Gray' => '#808080','Green' => '#008000',
    
'GreenYellow' => '#ADFF2F','HoneyDew' => '#F0FFF0','HotPink' => '#FF69B4',
    
'IndianRed ' => '#CD5C5C','Indigo ' => '#4B0082','Ivory' => '#FFFFF0',
    
'Khaki' => '#F0E68C','Lavender' => '#E6E6FA','LavenderBlush' => '#FFF0F5',
    
'LawnGreen' => '#7CFC00','LemonChiffon' => '#FFFACD','LightBlue' => '#ADD8E6',
    
'LightCoral' => '#F08080','LightCyan' => '#E0FFFF','LightGoldenRodYellow' => '#FAFAD2',
    
'LightGrey' => '#D3D3D3','LightGreen' => '#90EE90','LightPink' => '#FFB6C1',
    
'LightSalmon' => '#FFA07A','LightSeaGreen' => '#20B2AA','LightSkyBlue' => '#87CEFA',
    
'LightSlateBlue' => '#8470FF','LightSlateGray' => '#778899','LightSteelBlue' => '#B0C4DE',
    
'LightYellow' => '#FFFFE0','Lime' => '#00FF00','LimeGreen' => '#32CD32',
    
'Linen' => '#FAF0E6','Magenta' => '#FF00FF','Maroon' => '#800000',
    
'MediumAquaMarine' => '#66CDAA','MediumBlue' => '#0000CD','MediumOrchid' => '#BA55D3',
    
'MediumPurple' => '#9370D8','MediumSeaGreen' => '#3CB371','MediumSlateBlue' => '#7B68EE',
    
'MediumSpringGreen' => '#00FA9A','MediumTurquoise' => '#48D1CC','MediumVioletRed' => '#C71585',
    
'MidnightBlue' => '#191970','MintCream' => '#F5FFFA','MistyRose' => '#FFE4E1',
    
'Moccasin' => '#FFE4B5','NavajoWhite' => '#FFDEAD','Navy' => '#000080',
    
'OldLace' => '#FDF5E6','Olive' => '#808000','OliveDrab' => '#6B8E23',
    
'Orange' => '#FFA500','OrangeRed' => '#FF4500','Orchid' => '#DA70D6',
    
'PaleGoldenRod' => '#EEE8AA','PaleGreen' => '#98FB98','PaleTurquoise' => '#AFEEEE',
    
'PaleVioletRed' => '#D87093','PapayaWhip' => '#FFEFD5','PeachPuff' => '#FFDAB9',
    
'Peru' => '#CD853F','Pink' => '#FFC0CB','Plum' => '#DDA0DD','PowderBlue' => '#B0E0E6',
    
'Purple' => '#800080','Red' => '#FF0000','RosyBrown' => '#BC8F8F','RoyalBlue' => '#4169E1',
    
'SaddleBrown' => '#8B4513','Salmon' => '#FA8072','SandyBrown' => '#F4A460',
    
'SeaGreen' => '#2E8B57','SeaShell' => '#FFF5EE','Sienna' => '#A0522D',
    
'Silver' => '#C0C0C0','SkyBlue' => '#87CEEB','SlateBlue' => '#6A5ACD',
    
'SlateGray' => '#708090','Snow' => '#FFFAFA','SpringGreen' => '#00FF7F',
    
'SteelBlue' => '#4682B4','Tan' => '#D2B48C','Teal' => '#008080',
    
'Thistle' => '#D8BFD8','Tomato' => '#FF6347','Turquoise' => '#40E0D0',
    
'Violet' => '#EE82EE','VioletRed' => '#D02090','Wheat' => '#F5DEB3',
    
'White' => '#FFFFFF','WhiteSmoke' => '#F5F5F5','Yellow' => '#FFFF00',
    
'YellowGreen' => '#9ACD32');

    
$d preg_replace("/#([0-9a-fA-F]{1})\\1([0-9a-fA-F]{1})\\2([0-9a-fA-F]{1})\\3/""#\\1\\2\\3",$d);
    
    foreach(
$cn as $c => $h)
    {
      if(
strlen($c) < strlen($h))
        
$d eregi_replace($c$h$d);
      else
        
$d eregi_replace($h$c$d);
    }

    
    
    
/* Change colors to their shorthand representation: #ffcc00 -> #fc0 */
    /* This code has been updated to a single preg_replace which is much quicker
     * but does not replace #aAbBcC, but which will replace #aabbcc into #abc
     *
     * With much thanx to Axel
    $a = array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');
    foreach($a as $a1)
      foreach($a as $a2)
        foreach($a as $a3)
        {
          $d = eregi_replace('#'.$a1.$a1.$a2.$a2.$a3.$a3,"\n".'#'.$a1.$a2.$a3, $d);
        }    
    */
    
$d preg_replace("/#([0-9a-fA-F]{1})\\1([0-9a-fA-F]{1})\\2([0-9a-fA-F]{1})\\3/""#\\1\\2\\3",$d);

    return 
$d;
  }
    
  function 
css_file_opt($f1$f2)
  {
    
$d '';
    if(
is_array($f1))
    {
      foreach(
$f1 as $f)
      {
        
$d .= is_file($f) ? css_opt(implode(''file($f))) : '';
      }
    }
    else
    {
      
$d is_file($f1) ? css_opt(implode(''file($f1))) : '';
    }
    
$f = @fopen($f2'w');
    if(
is_resource($f))
    {
      
fwrite($f$d);
      
fclose($f);
    }
    else
    {
      @
unlink($f2);
    }
  }
  
css_file_opt($f1$f2);
}

if(
is_file($f2))
  include(
$f2);
else
{
  foreach(
$f1 as $f)
  {
    if(
is_file($f))include($f);
  }
}
?>