|
||||
|
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 |
| Css Drop Down Menü Mehere Probleme | Katrin_286 | CSS | 5 | 10.10.2008 16:22 |
| CSS - Meine Hyperlinks machen sich selbständig | mikeanic | CSS | 4 | 22.12.2006 13:02 |
| Tabledesigner wird CSS - Designer... | mk-gfx | Site- und Layoutcheck | 6 | 09.12.2006 19:08 |
| CSS Layout mit abgerundeten Ecken | dimension | CSS | 3 | 17.04.2005 18:05 |
| Tabellen mit CSS | ShadowDeath | CSS | 3 | 15.03.2005 23:54 |