puggan

cssExpander.php

Mar 15th, 2021 (edited)
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 3.20 KB | None | 0 0
  1. <?php
  2.  
  3. lessSorter($argv[1] ?? 'php://stdin');
  4.  
  5. function cleanRow($key, $row): string
  6. {
  7.     return preg_replace(
  8.         '#  +#',
  9.         ' ',
  10.         str_replace(
  11.             ["\t", "\n", "\r"],
  12.             ' ',
  13.             str_replace(
  14.                 ':',
  15.                 ': ',
  16.                 str_replace(
  17.                     '>',
  18.                     ' > ',
  19.                     trim($key)
  20.                 ) . ' { ' . $row . ' }'
  21.             )
  22.         )
  23.     );
  24. }
  25.  
  26. function lessSorter($filename)
  27. {
  28.     $f = fopen($filename, 'rb');
  29.     $lastKey = '';
  30.     $buffer = '';
  31.     $dqOpen = false;
  32.     $sqOpen = false;
  33.     while (!feof($f)) {
  34.         $input = fread($f, 20480);
  35.         while ($input) {
  36.             $pos = [
  37.                 'open' => strpos($input, '{'),
  38.                 'close' => strpos($input, '}'),
  39.                 'end' => strpos($input, ';'),
  40.                 'sq' => strpos($input, "'"),
  41.                 'dq' => strpos($input, '"'),
  42.             ];
  43.             $pos = array_filter($pos, 'is_numeric');
  44.             if (!$pos) {
  45.                 $buffer .= $input;
  46.                 $input = false;
  47.                 continue;
  48.             }
  49.             asort($pos);
  50.             $firstPos = reset($pos);
  51.             switch (key($pos)) {
  52.                 case 'open':
  53.                     $lastKeys = explode(',', $buffer . substr($input, 0, $firstPos));
  54.                     $buffer = '';
  55.                     $input = substr($input, $firstPos + 1);
  56.                     break;
  57.  
  58.                 case 'close':
  59.                     $row = trim($buffer . substr($input, 0, $firstPos));
  60.                     $buffer = '';
  61.                     $input = substr($input, $firstPos + 1);
  62.                     if ($row) {
  63.                         foreach($lastKeys as $lastKey) {
  64.                             echo cleanRow($lastKey, $row . ';'), PHP_EOL;
  65.                         }
  66.                     }
  67.                     $lastKeys = [];
  68.                     break;
  69.  
  70.                 case 'end':
  71.                     $row = $buffer . substr($input, 0, $firstPos + 1);
  72.                     $buffer = '';
  73.                     $input = substr($input, $firstPos + 1);
  74.                     foreach($lastKeys as $lastKey) {
  75.                         echo cleanRow($lastKey, $row), PHP_EOL;
  76.                     }
  77.                     break;
  78.  
  79.                 case 'sq':
  80.                     $buffer .= substr($input, 0, $firstPos + 1);
  81.                     $input = substr($input, $firstPos + 1);
  82.                     $sqOpen = !$sqOpen;
  83.                     break;
  84.  
  85.                 case 'dq':
  86.                     $buffer .= substr($input, 0, $firstPos + 1);
  87.                     $input = substr($input, $firstPos + 1);
  88.                     $dqOpen = !$dqOpen;
  89.                     break;
  90.  
  91.                 default:
  92.                     die('unknown key');
  93.             }
  94.         }
  95.     }
  96.  
  97.     fclose($f);
  98.  
  99.     if (trim($buffer)) {
  100.         $buffer = preg_replace('#/\*.*\*/#', '', $buffer);
  101.         if (trim($buffer)) {
  102.             throw new \RuntimeException('Unexpected end of file: ' . $buffer);
  103.         }
  104.     }
  105.  
  106.     if ($lastKeys) {
  107.         throw new \RuntimeException('Last block not closed');
  108.     }
  109. }
  110.  
Add Comment
Please, Sign In to add comment