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;
}