You are here

function advagg_parse_media_blocks in Advanced CSS/JS Aggregation 7.2

Split up as CSS string by @media queries.

Parameters

string $css: String of CSS.

string $starting_string: What to look for when starting to parse the string.

Return value

array array of css with only media queries.

See also

http://stackoverflow.com/a/14145856/125684

2 calls to advagg_parse_media_blocks()
advagg_get_css_aggregate_contents in ./advagg.missing.inc
Given a list of files, grab their contents and glue it into one big string.
advagg_split_css_file in ./advagg.inc
Given a file info array it will split the file up.

File

./advagg.missing.inc, line 1555
Advanced CSS/JS aggregation module.

Code

function advagg_parse_media_blocks($css, $starting_string = '@media') {
  $media_blocks = array();
  $start = 0;
  $last_start = 0;

  // Using the string as an array throughout this function.
  // http://php.net/types.string#language.types.string.substr
  while (($start = strpos($css, $starting_string, $start)) !== FALSE) {

    // Stack to manage brackets.
    $s = array();

    // Get the first opening bracket.
    $i = strpos($css, "{", $start);

    // If $i is false, then there is probably a css syntax error.
    if ($i === FALSE) {
      continue;
    }

    // Push bracket onto stack.
    array_push($s, $css[$i]);

    // Move past first bracket.
    ++$i;

    // Find the closing bracket for the @media statement. But ensure we don't
    // overflow if there's an error.
    while (!empty($s) && isset($css[$i])) {

      // If the character is an opening bracket, push it onto the stack,
      // otherwise pop the stack.
      if ($css[$i] === "{") {
        array_push($s, "{");
      }
      elseif ($css[$i] === "}") {
        array_pop($s);
      }
      ++$i;
    }

    // Get CSS before @media and store it.
    if ($last_start != $start) {
      $insert = trim(substr($css, $last_start, $start - $last_start));
      if (!empty($insert)) {
        $media_blocks[] = $insert;
      }
    }

    // Cut @media block out of the css and store.
    $media_blocks[] = trim(substr($css, $start, $i - $start));

    // Set the new $start to the end of the block.
    $start = $i;
    $last_start = $start;
  }

  // Add in any remaining css rules after the last @media statement.
  if (strlen($css) > $last_start) {
    $insert = trim(substr($css, $last_start));
    if (!empty($insert)) {
      $media_blocks[] = $insert;
    }
  }
  return $media_blocks;
}