Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function jaw_css_to_array($css) {
- if (empty($css)) return array();
- $css_array = array();
- $css = preg_replace('#/\*.*\*/#U', '', str_replace(array("\n","\r"), array('',''), $css));
- preg_match_all("/([^{}]*)\{(([^{}]*|(?R))*)\}/",$css,$matches);
- foreach ($matches[2] as $key => $rules) {
- $rules = trim($rules,"; \t\n\r\0\x0B");
- if (strpos($rules,'{') !== false) {
- $css_array[trim($matches[1][$key])] = jaw_css_to_array($rules);
- } else {
- $selectors = explode(',',$matches[1][$key]);
- $rules = preg_replace_callback('/\([^\)]*\)/', function ($matches) { return str_replace(';', '[ENCLOSED_DELIMITER]', $matches[0]); }, $rules);
- $rules = explode(';',$rules);
- $rules_array = array();
- foreach ($rules as $rule) {
- if (!empty($rule)) {
- $rule = explode(':', $rule, 2);
- $rules_array[] = strtolower(trim($rule[0])) . ': ' . str_replace('[ENCLOSED_DELIMITER]',';', trim($rule[1]));
- }
- }
- foreach ($selectors as $selector) {
- $selector = trim($selector);
- $selector = preg_replace_callback('/(\:)([a-z0-9\-]+)(\(|>|#|\.|\:|\s|$)/i', function ($matches) { return strtolower($matches[0]); }, $selector);
- $selector = preg_replace_callback('/(^|\s|>)([a-z0-9\s>]+)(>|#|\.|\:|\s|$)/i', function ($matches) { return strtoupper($matches[0]); }, $selector);
- $css_array[$selector] = (is_array($css_array[$selector]) ? array_merge($css_array[$selector],$rules_array) : $rules_array);
- }
- }
- }
- return $css_array;
- }
- function jaw_css_array_depth($Array,$DepthCount=-1,$DepthArray=array()) {
- $DepthCount++;
- if (is_array($Array))
- foreach ($Array as $Key => $Value)
- $DepthArray[]=jaw_css_array_depth($Value,$DepthCount);
- else
- return $DepthCount;
- foreach($DepthArray as $Value)
- $Depth=$Value>$Depth?$Value:$Depth;
- return $Depth;
- }
- function jaw_css_group_selectors($css_array) {
- if (empty($css_array)) return array();
- $css_agrupado = array();
- $css_checked = array();
- foreach ($css_array as $selector => $rules) {
- if (jaw_css_array_depth($rules) > 1) {
- $css_array[$selector] = jaw_css_group_selectors($css_array[$selector]);
- } else {
- unset($css_same_rules, $maior_quantidade, $mesmas_regras);
- $css_checked[] = $selector;
- foreach ($css_array as $check_selector => $check_rules) {
- if (!in_array($check_selector,$css_checked)) {
- $intersect = array_intersect($css_array[$selector], $check_rules);
- $quantidade = sizeof($intersect);
- $restante = sizeof($check_rules) - $quantidade;
- $check_mesmas_regras = $intersect;
- sort($check_mesmas_regras);
- if (($quantidade > 0 && $quantidade >= $maior_quantidade) || (is_array($mesmas_regras) && $check_mesmas_regras == $mesmas_regras)) {
- if ($quantidade <= 2 && $restante > 0) continue;
- if ($check_mesmas_regras != $mesmas_regras) $css_same_rules = array();
- $maior_quantidade = $quantidade;
- $mesmas_regras = $intersect;
- sort($mesmas_regras);
- if (!@in_array($selector, $css_same_rules[$selector]['selectors'])) $css_same_rules[$selector]['selectors'][] = $selector;
- $css_same_rules[$selector]['selectors'][] = $check_selector;
- $css_same_rules[$selector]['rules'] = $intersect;
- }
- }
- }
- if (!empty($css_same_rules)) foreach($css_same_rules as $primeiro_selector => $css_same_rule) {
- foreach($css_same_rule['selectors'] as $selector) {
- $css_array[$selector] = array_diff($css_array[$selector], $css_same_rule['rules']);
- }
- $css_agrupado = array(implode(', ', $css_same_rule['selectors']) => $css_same_rule['rules']);
- $i=0;
- foreach ($css_array as $selector => $rules) {
- if ($primeiro_selector == $selector) break;
- $i++;
- }
- $css_array = array_slice($css_array, 0, $i) + $css_agrupado + array_slice($css_array, $i);
- }
- }
- }
- return array_filter($css_array);
- }
- function jaw_css_render($css_array,$min=false,$nivel=0) {
- $css = NULL;
- if ($nivel==0) $css_array = jaw_css_group_selectors($css_array);
- foreach ($css_array as $selector => $rules) {
- $rules_str = NULL;
- foreach($rules as $rule => $value) {
- if (jaw_css_array_depth($value) > 0) {
- $rules_str .= jaw_css_render(array($rule => $value),$min,$nivel+1);
- } else {
- $rules_str .= ($min ? '' : str_repeat("\t", $nivel+1)) . $value. ($min ? '; ' : ";\r\n");
- }
- }
- $css .= ($min ? '' : str_repeat("\t", $nivel)) . $selector . ($min ? ' { ' : " {\r\n") . $rules_str . ($min ? '' : str_repeat("\t", $nivel)) . "}\r\n";
- }
- return $css;
- }
Add Comment
Please, Sign In to add comment