我有一個用於創建模板的HTML類。 我班的工作原理是這樣的:我有一個我想合併的css數組
<?php
$page = \TEST\HTML::dispense(':html');
$page->mainWrapper(':div') //creates a child object by using __call() and sets the "div" model
->id('mainWrapper') //sets id
->style('background','red') //adds a style
->text('blah') //adds a text
->addClass('someClass'); //adds a class
->someSpan(':span')
->addClass('spanClass')->addClass('someClass')
->style('font-size','12pt')
->style('border-bottom','1pt dashed black')
->style('background','red');
?>
這讓我對HTML標記的快速發展,而不必擔心對缺少的字符或錯誤引用屬性。一切都得到緩存,我沒有任何性能問題。
現在我想更進一步。在生產模式下,一切工作正常,但對於最終的輸出,我想刪除所有內聯「樣式」屬性,並將它們最小化並將它們緩存在一個css文件中。 現在,我有一個循環遍歷所有HTML對象的函數,並根據標記,id和類聚合數據。 我的問題是:一旦我有這種形式我整齊的CSS陣列:
$style['tag']['.class']['#id']['styleKey'] = styleValue
如何修剪掉冗餘值,所以我留下了一個相關的css文件?縮小和壓縮可以在稍後階段進行。我現在想要的是比較值並在轉儲之前對數組進行優化,以便將所有具有相同tag/id/class的元素共有的'styleKeys'分組在一起。因此,在上面的例子中,因爲兩個元素(div和span)共享樣式「background:red」和類「someClass」,所以我會有一個「someClass」CSS規則和「background :紅色的」
如果是任何利益,這是我的‘extractstyles’功能:
<?php
public static function extractStyles($element, array &$styles=array()){
if($element instanceof \TEST\HTML){$element = $element->htmlData();}
$tag = isset($element['#acronym']) ? $element['#acronym'] : NULL;
$id = isset($element['#id']) ? '#'.$element['#id'] : NULL;
$classes = isset($element['#class']) ? $element['#class'] : NULL;
if(isset($element['#style']) && ($tag || $id || $class)){
$ref = &$styles;
if($id){if(!isset($ref[$id])){$ref[$id] = array();};$ref = &$ref[$id];}
if($classes){
if(\is_array($classes)){$classes = '.'.implode('.',$classes);}
if(!isset($ref[$classes])){$ref[$classes] = array();};$ref = &$ref[$classes];
}
if($tag){if(!isset($ref[$tag])){$ref[$tag] = array();};$ref = &$ref[$tag];}
foreach($element[self::ATTRIBUTES]['#style'] as $style=>$value){
$ref[$style] = $value;
}
}
if(isset($element[self::CHILDREN]) && count($element[self::CHILDREN])){
foreach($element[self::CHILDREN] as $child){
self::extractStyles($child, $styles);
}
}
return $styles;
}
?>
任何指針會更受歡迎...我真的失去了。我甚至不知道我在找什麼是可行的。
如上所述,性能現在不是問題。如果它有效,我會找到一種方法來優化它。 另外,請不要鏈接到xCSS和其他框架,因爲它們處理字符串,而我的CSS是作爲數組創建的。 在此先感謝您的幫助!
「我該如何修剪掉多餘的值」,你能提供一個例子嗎?我有點困惑,爲什麼你會同時將類和樣式應用於同一個對象。 – 2011-04-13 23:19:01