function advagg_split_css_file in Advanced CSS/JS Aggregation 7.2
Given a file info array it will split the file up.
Parameters
array $file_info: File info array from advagg_get_info_on_file().
string $file_contents: CSS file contents.
Return value
array Array with advagg_get_info_on_file data and split data.
4 calls to advagg_split_css_file()
- AdvAggCascadingStylesheetsTestCase::testRenderFile in tests/
advagg.test - Tests rendering the stylesheets.
- advagg_advagg_get_info_on_files_alter in ./
advagg.advagg.inc - Implements hook_advagg_get_info_on_files_alter().
- advagg_generate_groups in ./
advagg.inc - Group the CSS/JS into the biggest buckets possible.
- hook_advagg_get_info_on_files_alter in ./
advagg.api.php - Let other modules add/alter additional information about files passed in.
File
- ./
advagg.inc, line 1065 - Advanced CSS/JS aggregation module.
Code
function advagg_split_css_file(array $file_info, $file_contents = '') {
// Make advagg_parse_media_blocks() available.
module_load_include('inc', 'advagg', 'advagg.missing');
// Get the CSS file and break up by media queries.
if (empty($file_contents)) {
$file_contents = (string) @advagg_file_get_contents($file_info['data']);
}
$media_blocks = advagg_parse_media_blocks($file_contents);
// Get the advagg_ie_css_selector_limiter_value.
$selector_limit = (int) max(variable_get('advagg_ie_css_selector_limiter_value', ADVAGG_IE_CSS_SELECTOR_LIMITER_VALUE), 100);
// Group media queries together.
$part_selector_count = 0;
$counter = 0;
$values = array();
foreach ($media_blocks as $media_block) {
// Get the number of selectors.
$selector_count = advagg_count_css_selectors($media_block);
// This chunk is bigger than $selector_limit. It needs to be split.
if ($selector_count > $selector_limit) {
$inner_selector_count = 0;
// Split css string.
list($media_query, $split_css_strings) = advagg_split_css_string($media_block, $selector_limit);
foreach ($split_css_strings as $split_css_strings) {
$counter_changed = FALSE;
if (empty($split_css_strings)) {
continue;
}
// Make sure selector count doesn't go over selector limit.
$inner_selector_count = advagg_count_css_selectors($split_css_strings);
$part_selector_count += $inner_selector_count;
if ($part_selector_count > $selector_limit) {
if (!empty($values[$counter])) {
++$counter;
}
$counter_changed = TRUE;
$part_selector_count = $inner_selector_count;
}
// Add to output array.
if (isset($values[$counter])) {
if (!empty($media_query)) {
$values[$counter] .= "\n{$media_query} { {$split_css_strings} } ";
}
else {
$values[$counter] .= "{$split_css_strings}";
}
}
else {
if (!empty($media_query)) {
$values[$counter] = "{$media_query} { {$split_css_strings} } ";
}
else {
$values[$counter] = $split_css_strings;
}
}
}
// Add to current selector counter and go to the next value.
if (!$counter_changed) {
$part_selector_count += $inner_selector_count;
}
continue;
}
$part_selector_count += $selector_count;
if ($part_selector_count > $selector_limit) {
if (!empty($values[$counter])) {
++$counter;
}
$values[$counter] = $media_block;
$part_selector_count = $selector_count;
}
else {
if (isset($values[$counter])) {
$values[$counter] .= "\n{$media_block}";
}
else {
$values[$counter] = $media_block;
}
}
}
// Save data.
$parts = array();
$overall_counter = 0;
foreach ($values as $key => $value) {
$last_chunk = FALSE;
$file_info['split_last_part'] = FALSE;
if (count($values) - 1 == $key) {
$last_chunk = TRUE;
}
if ($last_chunk) {
$file_info['split_last_part'] = TRUE;
}
// Get the number of selectors.
$selector_count = advagg_count_css_selectors($value);
$overall_counter += $selector_count;
// Save file.
$subfile = advagg_create_subfile($value, $overall_counter, $file_info);
if (empty($subfile)) {
// Something broke; do not create a subfile.
$variables = array(
'@info' => var_export($file_info, TRUE),
);
watchdog('advagg', 'Spliting up a CSS file failed. File info: <code>@info</code>', $variables);
return array();
}
$parts[] = $subfile;
}
return $parts;
}