Guest User

css parser

a guest
Sep 12th, 2014
294
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 4.46 KB | None | 0 0
  1. function jaw_css_to_array($css) {
  2.     if (empty($css)) return array();
  3.     $css_array = array();
  4.     $css = preg_replace('#/\*.*\*/#U', '', str_replace(array("\n","\r"), array('',''), $css));
  5.     preg_match_all("/([^{}]*)\{(([^{}]*|(?R))*)\}/",$css,$matches);
  6.     foreach ($matches[2] as $key => $rules) {
  7.         $rules = trim($rules,"; \t\n\r\0\x0B");
  8.         if (strpos($rules,'{') !== false) {
  9.             $css_array[trim($matches[1][$key])] = jaw_css_to_array($rules);
  10.         } else {
  11.             $selectors = explode(',',$matches[1][$key]);
  12.             $rules = preg_replace_callback('/\([^\)]*\)/', function ($matches) { return str_replace(';', '[ENCLOSED_DELIMITER]', $matches[0]); }, $rules);
  13.             $rules = explode(';',$rules);
  14.             $rules_array = array();
  15.             foreach ($rules as $rule) {
  16.                 if (!empty($rule)) {
  17.                     $rule = explode(':', $rule, 2);
  18.                     $rules_array[] = strtolower(trim($rule[0])) . ': ' . str_replace('[ENCLOSED_DELIMITER]',';', trim($rule[1]));
  19.                 }
  20.             }
  21.             foreach ($selectors as $selector) {
  22.                 $selector = trim($selector);
  23.                 $selector = preg_replace_callback('/(\:)([a-z0-9\-]+)(\(|>|#|\.|\:|\s|$)/i', function ($matches) { return strtolower($matches[0]); }, $selector);
  24.                 $selector = preg_replace_callback('/(^|\s|>)([a-z0-9\s>]+)(>|#|\.|\:|\s|$)/i', function ($matches) { return strtoupper($matches[0]); }, $selector);
  25.                 $css_array[$selector] = (is_array($css_array[$selector]) ? array_merge($css_array[$selector],$rules_array) : $rules_array);
  26.             }
  27.         }
  28.     }
  29.     return $css_array;
  30. }
  31.  
  32. function jaw_css_array_depth($Array,$DepthCount=-1,$DepthArray=array()) {
  33.   $DepthCount++;
  34.   if (is_array($Array))
  35.     foreach ($Array as $Key => $Value)
  36.       $DepthArray[]=jaw_css_array_depth($Value,$DepthCount);
  37.   else
  38.     return $DepthCount;
  39.   foreach($DepthArray as $Value)
  40.     $Depth=$Value>$Depth?$Value:$Depth;
  41.   return $Depth;
  42. }
  43.  
  44.  
  45. function jaw_css_group_selectors($css_array) {
  46.     if (empty($css_array)) return array();
  47.     $css_agrupado = array();
  48.     $css_checked = array();
  49.     foreach ($css_array as $selector => $rules) {
  50.         if (jaw_css_array_depth($rules) > 1) {
  51.             $css_array[$selector] = jaw_css_group_selectors($css_array[$selector]);
  52.         } else {
  53.             unset($css_same_rules, $maior_quantidade, $mesmas_regras);
  54.             $css_checked[] = $selector;
  55.             foreach ($css_array as $check_selector => $check_rules) {
  56.                 if (!in_array($check_selector,$css_checked)) {
  57.                     $intersect = array_intersect($css_array[$selector], $check_rules);
  58.                     $quantidade = sizeof($intersect);
  59.                     $restante = sizeof($check_rules) - $quantidade;
  60.                     $check_mesmas_regras = $intersect;
  61.                     sort($check_mesmas_regras);
  62.                     if (($quantidade > 0 && $quantidade >= $maior_quantidade) || (is_array($mesmas_regras) && $check_mesmas_regras == $mesmas_regras)) {
  63.                         if ($quantidade <= 2 && $restante > 0) continue;
  64.                         if ($check_mesmas_regras != $mesmas_regras) $css_same_rules = array();
  65.                         $maior_quantidade = $quantidade;
  66.                         $mesmas_regras = $intersect;
  67.                         sort($mesmas_regras);
  68.                         if (!@in_array($selector, $css_same_rules[$selector]['selectors'])) $css_same_rules[$selector]['selectors'][] = $selector;
  69.                         $css_same_rules[$selector]['selectors'][] = $check_selector;
  70.                         $css_same_rules[$selector]['rules'] = $intersect;
  71.                     }
  72.                 }
  73.             }
  74.             if (!empty($css_same_rules)) foreach($css_same_rules as $primeiro_selector => $css_same_rule) {
  75.                 foreach($css_same_rule['selectors'] as $selector) {
  76.                     $css_array[$selector] = array_diff($css_array[$selector], $css_same_rule['rules']);
  77.                 }
  78.                 $css_agrupado = array(implode(', ', $css_same_rule['selectors']) => $css_same_rule['rules']);
  79.                 $i=0;
  80.                 foreach ($css_array as $selector => $rules) {
  81.                     if ($primeiro_selector == $selector) break;
  82.                     $i++;
  83.                 }
  84.                 $css_array = array_slice($css_array, 0, $i) + $css_agrupado + array_slice($css_array, $i);
  85.             }
  86.         }
  87.     }
  88.     return array_filter($css_array);
  89. }
  90.  
  91.  
  92.  
  93.  
  94. function jaw_css_render($css_array,$min=false,$nivel=0) {
  95.     $css = NULL;
  96.     if ($nivel==0) $css_array = jaw_css_group_selectors($css_array);
  97.     foreach ($css_array as $selector => $rules) {
  98.         $rules_str = NULL;
  99.         foreach($rules as $rule => $value) {
  100.             if (jaw_css_array_depth($value) > 0) {
  101.                 $rules_str .= jaw_css_render(array($rule => $value),$min,$nivel+1);
  102.             } else {
  103.                 $rules_str .= ($min ? '' : str_repeat("\t", $nivel+1)) . $value. ($min ? '; ' : ";\r\n");
  104.             }
  105.         }
  106.         $css .= ($min ? '' : str_repeat("\t", $nivel)) . $selector . ($min ? ' { ' : " {\r\n") . $rules_str . ($min ? '' : str_repeat("\t", $nivel)) . "}\r\n";
  107.     }
  108.     return $css;
  109. }
Add Comment
Please, Sign In to add comment