Compresser (minimiser) un fichier css

Soyez le premier à donner votre avis sur cette source.

Vue 4 935 fois - Téléchargée 330 fois

Description

Cette classe vous permet de minimiser le contenu d'un fichier CSS afin de réduire la taille de vos fichiers.

Source / Exemple :

<?php

/**
 * CSSSkrinker class
 * 
 * Compress your css files
 *
 * @author ShevAbam
 * @version 1.0 - 22 Sept 2009
 */
class CSSShrinker
{
    private $_file_original;
    private $_file_minimized;
    private $_file_content_original;
    private $_file_content_shrink;
    
    private $_config = array(
        'suffix'        => '.min', 
        'comments'      => true,    // remove /* */ comments
        'fontweight'    => true,    // font-weight: bold ==> font-weight: 700
        'zerodotvalues' => true,    // 0.2 ==> .2
        'zerounits'     => true,    // 0px ==> 0
        'quotes'        => true,    // background-url: url('test.png') ==> background-url: url(test.png)
        'hex'           => true     // #ffffff ==> #fff
    );
    
    
    
    /**
     * Constructor
     * 
     * @access public
     * @param   string  $file_original
     * @param   array   $config
     * @return void
     */
    public function __construct($file_original, $config = array())
    {
        $this->_setConfig($config);
        
        if (empty($file_original))
            throw new Exception('CSSShrinker::__construct - First parameter must be filled');
        else
            $this->_file_original = $file_original;
        
        
        // Generate minimized filename
        $this->_file_minimized = $this->_generateMinimizedFileName();
        
        // Run compression
        $this->_shrinkFile();
    }
    
    
    
    /**
     * Sets configuration
     * 
     * @access   private
     * @param    array    $array  Configuration array
     * @return   void
     */
    private function _setConfig($array)
    {
        if (!empty($array))
            $this->_config = array_merge($this->_config, $array);
    }
    
    
    
    /**
     * Generate minimized filename
     * 
     * @access   private
     * @return   string
     */
    private function _generateMinimizedFileName()
    {
        $extAndDot = strrchr($this->_file_original, '.');
        
        return substr($this->_file_original, 0, -strlen($extAndDot)).$this->_config['suffix'].$extAndDot;
    }
    
    
    /**
     * Read file
     * 
     * @access   private
     * @param    string    $file
     * @return   string
     */
    private function _readFile($file)
    {
        if (!file_exists($file) || filesize($file) == 0)
            throw new Exception('CSSShrinker::_readFile - $file doesn\'t exists');
        else
            return file_get_contents($file);
    }
    
    /**
     * Write into minimized file
     * 
     * @access   private
     * @return   bool
     */
    private function _writeFile()
    {
        if (!empty($this->_file_content_shrink))
        {
            $fput = file_put_contents($this->_file_minimized, $this->_file_content_shrink);
            
            if (!$fput)
                throw new Exception('CSSShrinker::_writeFile - file_put_contents error');
            else
                return true;
        }
    }
    
    
    /**
     * Compress file
     * 
     * @access    private
     * @return    bool
     */
    private function _shrinkFile()
    {
        // If minimized file already exists or if original file is newer than the minimized
        if (!file_exists($this->_file_minimized) || filemtime($this->_file_minimized) < filemtime($this->_file_original))
        {
            $this->_file_content_original = $this->_readFile($this->_file_original);
            
            $this->_shrinkString();
            
            return $this->_writeFile() ? true : false;
        }
        else
            return false;
    }
    
    
    
    
    /**
     * Removes comments
     * 
     * @access   private
     * @param    string    $str
     * @return   string
     */
    private function _strip_comments($str)
    {
        return preg_replace('#/\*.*?\*/#s', '', $str);
    }
    
    
    /**
     * Sets font-weight
     * 
     * @access   private
     * @param    string    $str
     * @return   string
     */
    private function _strip_fontWeight($str)
    {
        $one = array('lighter' , 'normal' , 'bold' , 'bolder' );
        $two = array('100'     , '400'    , '700'  , '900'    );
        
        return str_replace($one, $two, $str);
    }
    
    
    /**
     * Removes unnecessary zeros : 0.2 ==> .2
     * 
     * @access   private
     * @param    string    $str
     * @return   string
     */
    private function _strip_zerodotValues($str)
    {
        return trim(eregi_replace('([^0-9])0\.([0-9]+)em', '\\1.\\2em', ' '.$str));
    }
    
    
    /**
     * Removes unnecessary units : 0px ==> 0
     * 
     * @access   private
     * @param    string    $str
     * @return   string
     */
    private function _strip_zeroUnits($str)
    {
        return trim(eregi_replace('([^0-9])0(px|em|\%)', '\\10', ' '.$str));
    }
    
    
    /**
     * Removes the quotes before and after the parentheses
     * 
     * @access   private
     * @param    string    $str
     * @return   string
     */
    private function _strip_quotes($str)
    {
        $one = array('("' , '(\'' , '")' , '\')' );
        $two = array('('  , '('   , ')'  , ')'   );
        
        return str_replace($one, $two, $str);
    }
    
    
    /**
     * Changes the color hex : #ffffff ==> #fff
     * 
     * @access    private
     * @param    string   $str
     * @return    string
     */
    private function _strip_hexColors($str)
    {
        return preg_replace('/([^=])#([a-f\\d])\\2([a-f\\d])\\3([a-f\\d])\\4([\\s;\\}])/i', '$1#$2$3$4$5', $str);
    }
    
    
    
    /**
     * Main execution
     * 
     * @access    private
     * @param    none
     * @return    void
     */
    private function _shrinkString()
    {
        $content = $this->_file_content_original;
        
        $content = preg_replace('#\s+#', ' ', $content);    // Removes spaces
        
        $content = str_replace('; ' , ';' , $content);
        $content = str_replace(': ' , ':' , $content);
        $content = str_replace(' {' , '{' , $content);
        $content = str_replace('{ ' , '{' , $content);
        $content = str_replace(', ' , ',' , $content);
        $content = str_replace('} ' , '}' , $content);
        $content = str_replace(';}' , '}' , $content);
        
        $content = str_replace(array("\n", "\r", "\t"), '', $content);
        
        
        if ($this->_config['comments'])
            $content = $this->_strip_comments($content);
        
        if ($this->_config['fontweight'])
            $content = $this->_strip_fontWeight($content);
        
        if ($this->_config['zerodotvalues'])
            $content = $this->_strip_zerodotValues($content);
        
        if ($this->_config['zerounits'])
            $content = $this->_strip_zeroUnits($content);
        
        if ($this->_config['quotes'])
            $content = $this->_strip_quotes($content);
        
        if ($this->_config['hex'])
            $content = $this->_strip_hexColors($content);
        
        
        $this->_file_content_shrink = trim($content);
    }
    
    
    /**
     * Returns the name of the minimized file
     * 
     * @access   public
     * @param    none
     * @return   string
     */
    public function getMinimizedFilename()
    {
        return $this->_file_minimized;
    }
}



// -- Example
$oCSSShrinker = new CSSShrinker('style_original.css');

echo $oCSSShrinker->getMinimizedFilename();
?>

Conclusion :

Exemple complet dans le ZIP ;)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
91
Date d'inscription
mercredi 15 novembre 2006
Statut
Membre
Dernière intervention
25 juillet 2011

@->kohntark
j'aimerais s-t-p que t'apportes tes propositions de modification au lieu de juste critiquer .
Bref les critiques se doivent d'etre constructives sur site.
Messages postés
25
Date d'inscription
samedi 18 mars 2006
Statut
Membre
Dernière intervention
30 août 2010

Merci pour cette classe,

pour info, j'utilise la fonction JavaScript toute faite du site http://fmarcia.info/jsmin/test.html

http://fmarcia.info/jsmin/fulljsmin.js

qui permet de compresser sur 3 niveaux (minimum, conservateur et agressif) un code CSS ou JS
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
25
Salut,

Je n'ai que parcouru (donc je peux dire des bêtises dans ce qui suit)

Il y a sans doute plusieurs bugs dans ta classe.
Par exemple que se passe t-il avec cette propriété :
color : rgb(100%, 64%, 0%);
Le '%' du '0%' va être supprimé, ce qui n'est pas valide.

Que se passe t-il si je renseigne $file_original mais que ce n'est pas un fichier valide ?
Que se passe t-il si j'ai une classe nommée .machin0em{...} ?
...

"return trim(eregi_replace('([^0-9])0(px|em|\%)', '\\10', ' '.$str));"
eregi_replace() est dépréciée et génère une alerte, utilise preg_replace() comme tu le fait ailleurs

Un truc comme ça peut être :
preg_replace('`[^\d.]0(px|em|%)`i', '0', $str);

Puisque tu cherches 'la petite bête' :) en tentant de gagner quelques octets par ci par là :
- tu devrais prendre en charge les différentes notations de couleurs et retenir celle qui prends le moins de place :
par exemple :
rgb(254,163,0) => #FEA300
#FEA300 => red

Valider automatiquement le fichier CSS avant et après son traitement serait un plus
Eventuellement parser une page HTML à la recherche de styles intégrés et leurs appliquer la même "punition"

Cordialement,

KOhntark-
Messages postés
75
Date d'inscription
samedi 3 décembre 2005
Statut
Membre
Dernière intervention
30 juin 2013

merci, en l'ocurence le regex est deja (mal) utilisé:
il faut remplacer ça:
$content = preg_replace('#\s+#', ' ', $content); // Removes spaces
par:
$content = preg_replace('#\s#', '', $content);

et là, la batterie de str_replace n'a plus aucune utilité
Messages postés
167
Date d'inscription
mardi 21 septembre 2004
Statut
Membre
Dernière intervention
2 mai 2009

Bien vu kertimanoff il faudrait utiliser les regex pour celà et virer les espaces
Afficher les 23 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.