php script na minimalizaci CSS

Re: CSS - hromadná deklarace
Autor: R.U.R. (jsrosa.wz.cz)
Datum: 31. 07. 2008 11:32

No třeba já to prostě napíšu rovnou do jednoho CSS souboru ;-) Ale asi by bylo zajímavý mít na webu skript co bude komprimovat css - jako že odstraní white chars a komentáře a tak... Možná na to něco existuje, jestli ne, tak to rád zkusim napsat :-)



Toho by jsem se chytl, mohli by jsme takovy propracovany udelat a vychytat v nem chyby.



google.com php css compression

<?php
header('Content-type: text/css');
ob_start("compress");
function compress($buffer) {
// remove comments
$buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer);
// remove tabs, spaces, newlines, etc.
$buffer = str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', $buffer);
return $buffer;
}
?>

prvni replacuje komentare, druhy rusi vsechny nove radky, tab a mezery.
Co jeste jeste pod stromecek chces vymyslet?
Snad jen reg. vyraz, ktery
- 6ti mistny kod barvy zkontroluje, zda by se nedal zapsat jako 3 mistny
- zkusi zapsat opakovane jednotky 0px 0px 0px 0px jako 1x0 nebo 2x0 a odstranit px, pokud nejsou nutne
- pokusi se odstranit strednik pred konecnou zavorkou

Mno, ale problem nastava v okamziku, kdy tam pouzijes JS, typu expresion.
A problem zmineneho php je napr v tom, ze odstranuje, co nema a neodstranuje, co ma :)
$buffer = str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '',
komentare jsem nekontroloval.

dalsi clanek na jina slova
php minimalize css
http://ajaxian.com/archives/how-to-minimize-your-javascript-and-css-files-for-faster-page-loads

z minify
// odstraneni mezer vsude mozne i nemozne
$css = preg_replace('/>\\/\\*\\s*\\*\\//', '>/*keep*/', $css);
$css = preg_replace('/\\/\\*\\s*\\*\\/\\s*:/', '/*keep*/:', $css);
$css = preg_replace('/:\\s*\\/\\*\\s*\\*\\//', ':/*keep*/', $css);
$css = preg_replace_callback('/\\s*\\/\\*([\\s\\S]*?)\\*\\/\\s*/'
,array('Minify_CSS', '_commentCB'), $css);
$css = preg_replace('/\s+/', ' ', $css);
$css = str_replace('/*keep*/', '//', $css);
$css = preg_replace('/\\s*{\\s*/', '{', $css);
$css = preg_replace('/;?\\s*}\\s*/', '}', $css);
$css = preg_replace('/\\s*;\\s*/', ';', $css);
$css = preg_replace('/url\\([\\s]*([^\\)]+?)[\\s]*\\)/', 'url($1)', $css);
$css = preg_replace('/\\s*([{;])\\s*([\\w\\-]+)\\s*:\\s*\\b/', '$1$2:', $css);
$css = preg_replace_callback('/(?:\\s*[^~>+,\\s]+\\s*[,>+~])+\\s*[^~>+,\\s]+{/'
,array('Minify_CSS', '_selectorsCB'), $css);
// komprese hex barev
$css = preg_replace('/([^=])#([a-f\\d])\\2([a-f\\d])\\3([a-f\\d])\\4([\\s;\\}])/i'
, '$1#$2$3$4$5', $css);



pro R.U.R. (jsrosa.wz.cz)
klidne se do tomo muzes pustit. Ti tam najdu vsechny chyby. Vsechny JS a dalsi kraviny bych do toho nezahrnoval. Pouze bezny CSS. Vse, co neznas, bych z tama smazal. Cili script by mel fungovat asi na principu Tokenizovani a zvyraznovani syntaxe, ze si to najde prislusne povolene vyrazy.
Slusny zvyraznovac jsem nasel pro JS jako Highlight.js , treba by se to dalo pro tvuj pripad pouzit
Doufám že to pak budeš cachovat a pak odkazovat na něj! Pokud ne, tak to ztrácí význam, protože serveru udělá větší zátěž parsovat kód než posílat nezkomprimovaný CSS/JS..