|
||||
![]()
Gleich eines vorweg: Wer sich den Beitrag komplett durchlesen will braucht ein bisschen Zeit
![]() Ich arbeite im Moment wieder an meinem CSS Optimierer, und für die nächste Version würde ich gerne einen einzigsten Fehler beheben - leider ist das etwas komplizierter als es aussieht. Beispiel: Code:
b {color:red;} c,b {color:green;} a {color:red;} Code:
c,b { color:green } b,a { color:red } Dafür habe ich sogar auch schon eine Funktion geschrieben (die fast perfekt funktioniert), allerdings ist diese so aufwändig, dass damit schnell alle Zeit- und Speicherlimits überschritten werden (je nach Größe des Stylesheets). Und deswegen bitte ich hier um ein bisschen Hilfe, vielleicht hat ja jemand eine Idee wie man das sinnvoll machen kann (bzw. wie man meiner Funktion ein bisschen Feuer unterm Hintern macht). Hier erstmal meine Funktion + Infos: Struktur der Daten Die Daten in denen das CSS gespeichert wird, sehen etwa so aus: Code:
$css['standard']['a'][]['color'] = 'red'; $css['standard']['a'][]['size'] = '1em'; $css['standard']['b'][]['size'] = '1em'; // also $css[MEDIUM][SELEKTOR][ZAHL][EIGENSCHAFT] = WERT Das hier ist meine Funktion (das ultimative foreach-Chaos), hoffentlich gut genug kommentiert. Vorraussetzung ist, dass beim ersten Durchlauf keine Selektoren wie "a,b" oder "a,b#id,c" etc. vorhanden sind, bzw. diese zerlegt sind (dafür kann der Rest meines CSS Parsers garantieren). Code:
function merge_selectors(&$css) { $return = FALSE; Code:
foreach($css as $medium => $vali) { $diff = array(); $diff_c = array(); Code:
foreach($vali as $selector => $valj) { Code:
foreach($valj as $num_key => $valk) { foreach($valk as $property => $value) { Code:
foreach($css[$medium] as $selector2 => $vall) { Code:
$selector_combine_r = serialize(array($selector2,$selector)); Hier wird also die serialisierte Form der Selektoren 1 und 2 in umgekehrter Reichenfolge gespeichert, womit wir... Code:
// Prevent duplicate comparisions (a-b, b-a) and self-comparisons (a-a) if($selector2 === $selector || isset($diff[$selector_combine_r])) { continue; } Code:
$selector_combine = serialize(array($selector,$selector2)); if(!isset($diff[$selector_combine])) { $diff[$selector_combine] = 0; $diff_[$selector_combine] = array(); } Code:
foreach($vall as $num_key2 => $valm) { foreach($valm as $property2 => $value2) { Code:
if($property2 === $property && $value2 === $value) { $diff[$selector_combine] += (strlen($property)+strlen($value)); $diff_c[$selector_combine][][$property] = $value; } Code:
} } if($diff[$selector_combine] === 0) { unset($diff[$selector_combine]); unset($diff_c[$selector_combine]); } Code:
} } } } Code:
// Move best matches to the top array_multisort($diff,SORT_NUMERIC,SORT_DESC); Code:
foreach($diff as $key => $value) { $key_u = unserialize($key); foreach($key_u as $selector) { // If there are no matches or if selector is already dissolved if(!isset($diff_c[$key]) || !isset($css[$medium][$selector])) { continue; } Code:
foreach($diff_c[$key] as $num_key => $valj) { foreach($valj as $property => $value) { rm_subkey($property,$css[$medium][$selector],$value); } } Code:
// If no properties are left, remove selector if(empty($css[$medium][$selector])) { unset($css[$medium][$selector]); } Code:
// Create the new selector if matches are left if(!empty($diff_c[$key])) { $css[$medium][implode(',',$key_u)] = $diff_c[$key]; $return = TRUE; } Code:
} // Go through diff_c and remove no-more-shareable properties // and possibly the complete entry foreach($diff_c as $keyi => $valuei) { $selectors = unserialize($keyi); if(in_array($key_u[0],$selectors) || in_array($key_u[1],$selectors)) { unset($diff_c[$keyi]); } } Code:
} } return $return; } Code:
while(csspp::merge_selectors($this->css)) {} Das einzigste was die Funktion noch beachten müsste ist, dass ein gewisses Verhältnis zwischen Größe der optimierten Eigenschaften und Anzahl der Selektoren erhalten bleibt (damit nacher nicht sowas wie Code:
ein,ganz,langer,langer,................................,selektor{size:1em;} Wer alles nochmal im Zusammenhang sehen möchte: http://cdburnerxp.se/cssparse/css_parser.txt Die Funktion ist da komplett drin, wer will kann den Parser damit mal durchlaufen lassen (in der Klasse die Funktion parse($string) [diese "Superoptimierung wird automatisch mit ausgeführt), das Ergebnis als Array befindet sich danach in der Variable $css). Ich hoffe auf zahlreiche Antworten ![]() Edit: Vielleicht nochmal ein kleines Beispiel damit ihr besser nachvollziehen könnt was die Funktion macht. Das wird optimiert: Code:
$css['standard']['a'][]['margin'] = '0'; $css['standard']['a'][]['color'] = 'red'; $css['standard']['a'][]['text'] = 'none'; $css['standard']['a'][]['text'] = '!important'; $css['standard']['b'][]['text'] = 'none'; $css['standard']['b'][]['color'] = 'red'; $css['standard']['d'][]['color'] = 'red'; $css['standard']['e'][]['margin'] = '2'; Code:
Array ( [a:2:{i:0;s:1:"a";i:1;s:1:"b";}] => 16 [a:2:{i:0;s:1:"a";i:1;s:1:"d";}] => 8 [a:2:{i:0;s:1:"b";i:1;s:1:"d";}] => 8 ) Code:
Array ( [a:2:{i:0;s:1:"a";i:1;s:1:"b";}] => Array ( [0] => Array ( [color] => red ) [1] => Array ( [text] => none ) ) [a:2:{i:0;s:1:"a";i:1;s:1:"d";}] => Array ( [0] => Array ( [color] => red ) ) [a:2:{i:0;s:1:"b";i:1;s:1:"d";}] => Array ( [0] => Array ( [color] => red ) ) ) Code:
Array ( [standard] => Array ( [a] => Array ( [0] => Array ( [margin] => 0 ) [3] => Array ( [text] => !important ) ) [e] => Array ( [0] => Array ( [margin] => 2 ) ) [a,b] => Array ( [1] => Array ( [text] => none ) ) [d,a,b] => Array ( [0] => Array ( [color] => red ) ) ) )
__________________
CSS Optimierer und Formatierer (CSSTidy) |
Sponsored Links |
|
|||
![]()
Hi!
Schlag das ganze doch als PEAR Paket vor? Schon daran gedacht? http://pear.php.net/ Wenn du hier schaust, dann siehst du das es einen XML_Beautifier und einen PHP_Beautifier bereits gibt. Ein CSS_Beautifier fehlt noch! Ich bin gespannt was du von meinem Vorschlag hälst ![]() mfg Lestat |
Sponsored Links |
|
||||
![]()
Ich kann ja mal drüber nachdenken...aber erstmal muss das Ding fertig werden
![]()
__________________
CSS Optimierer und Formatierer (CSSTidy) |
![]() |
Themen-Optionen | |
Ansicht | |
|
|
![]() |
||||
Thema | Autor | Forum | Antworten | Letzter Beitrag |
Redesign für Steiner Cycling Team | pkipper | Site- und Layoutcheck | 11 | 09.02.2011 12:25 |
Einbindung von frei erhältlichen Scripten - CSS Problem | DonL | CSS | 1 | 22.01.2011 16:09 |
MYspace mehr als nur CSS oder ? | Vinceone | CSS | 0 | 12.07.2007 02:21 |
Eric Meyer's CSS | Petty | Ressourcen | 0 | 21.11.2005 08:18 |
Mozilla ignoriert externes css | DarkWanderer | CSS | 9 | 22.09.2005 11:39 |