Zend_Minify

Tagged:

Non ne cherchez pas ce composant n'existe pas... (remarque j'ai pas regardé si ça ce trouve j'ai bossé pour rien ... mieux vaut ne pas savoir maintenant ...)
PS: pour ceux qui veulent juste les fichiers

Pour avoir un fichier css unique et optimisé, pareil pour le javascript, j'ai fait un Zend_Minify !!

Comment on s'en sert ?

	$cssFile = 'files/css/minify.css';
	if (!file_exists($cssFile)) {
		$path = 'files/css/';
		$files = array('styles.css', 'thickbox.css');
		file_put_contents($cssFile, Zend_Minify::minifyCSS($files, $path));
	}
	$view->css = $cssFile;

Pareil pour le javascript ... voila ... C'est tout con et ça vous réduit la taille de vos fichiers a mort ! (j'ai gagné 35% sur les CSS, et 53% sur des javascript ...)

Pour la partie javascript je me suis basé sur JSMin qui marche très bien, je l'ai adapté pour le rendre compatible et hop ...

Bon je me suis secoué un peu les neurones hein ... faire simple c'est nul alors voila :

class Zend_Minify {
 
	public static function minifyJavascript($files, $path = '.') {
		return self::minify(new Zend_Minify_Engine_Javascript(), $files, $path);
	}
 
	public static function minifyCss($files, $path = '.') {
		return self::minify(new Zend_Minify_Engine_CSS(), $files, $path);
	}
	
	private static function minify(Zend_Minify_Engine $engine, $files, $path) {
		if (!is_array($files)) {
			$files = array($files);
		}
		$content = '';
		foreach ($files as $file) {
			$file = $path . '/' . $file;
			if (file_exists($file)) {
				$content .= $engine->minify(file_get_contents($file));
				$content .= "\n";
			}
		}
		return $content;
	}
}

Voila et un Engine c'est quoi ?

abstract class Zend_Minify_Engine {
	public abstract function minify($data);
}

Trop balaise ... Après pour les engines je marque le début du Javascript puisque le reste c'est exactement les mêmes fonctions j'ai rien touché, juste adapté ...

class Zend_Minify_Engine_Javascript extends Zend_Minify_Engine {
 
	const ORD_LF	= 10;
	const ORD_SPACE = 32;
 
	protected $a;
	protected $b;
	protected $input;
	protected $inputIndex;
	protected $inputLength;
	protected $lookAhead;
	protected $output;
 
	public function minify($data) {
		$this->a = '';
		$this->b = '';
		$this->lookAhead = null;
		$this->output = array();
		$this->input		= str_replace("\r\n", "\n", $data);
		$this->inputIndex = 0;
		$this->inputLength 	= strlen($this->input);
		return $this->min();
	}
 
// __construct and static access removed, the rest is the same :)

et pour le CSS, quelques gouttes suffisent :

class Zend_Minify_Engine_CSS extends Zend_Minify_Engine {
 
	public function minify($data) {
		/* Remove comments */
		$data = preg_replace("/\/\*(.*?)\*\//s", ' ', $data);
		
		/* Remove new lines, spaces */
		$data = preg_replace("/(\s{2,}|[\r\n|\n|\t|\r])/", ' ', $data);
		
		/* Join rules */
		$data = preg_replace('/([,|;|:|{|}]) /', '\\1', $data);
		$data = str_replace(' {', '{', $data);
		
		/* Remove ; for the last attribute */
		$data = str_replace(';}', '}', $data);
		$data = str_replace(' }', '}', $data);
		
		return $data;
	}
 
}

Voila ... du coup, je tiens mes fichiers complet à jour, et si je fais une modif, je supprime le fichier il est regénéré ... Il faudrait rajouter une option, pour debugging javascript, qu'il ne compacte pas mais assemble seulement, mais bon c'est trois fois rien et j'en ai pas encore eu besoin pour l'instant !!!

Comments

Humpf je viens d'améliorer un peu ... l'histoire du debug j'en ai eu besoin, et maintenant il me suffit de faire :

$view->javascript = Zend_Minify::bundle(Zend_Minify::JS, 'files/js/', $files, 'minify.js');

$view->css = Zend_Minify::bundle(Zend_Minify::CSS, 'files/css/', 'styles.css', 'minify.css');

pour minifier mes fichiers ... ils sont mis a jour automatiquement quand on les modifie et tout ... plus besoin de supprimer le fichier un check sur le filemtime est fait également ...

Je viens de mettre le fichier tar.gz à jour !

"Je viens de mettre le fichier tar.gz à jour !"

Sauf que le lien pointe toujours vers un .zip :)

Trop la honte ...

Oué j'ai l'habitude de travailler sous linux, et le mac il fait que des zip ...

donc ceux qui ont lu tar.gz il fallait bien lire zip hein ... Apprenez a lire non mais :)