function css_emimage_advagg_filenames_alter in CSS Embedded Images 6.2
Implementation of hook_advagg_filenames_alter().
See if any CSS file in the desired bundle contains a local image in it.
File
- ./
css_emimage.module, line 65 - CSS Embedded Images module.
Code
function css_emimage_advagg_filenames_alter(&$filenames) {
global $base_path;
$output = array();
foreach ($filenames as $values) {
// Set values.
$filetype = $values['filetype'];
$files = $values['files'];
$counter = $values['counter'];
$bundle_md5 = $values['bundle_md5'];
// Only operate on CSS files.
if ($filetype != 'css') {
$output[] = $values;
continue;
}
$cached_data_key = 'css_emimage_' . $bundle_md5;
// Try cache first; cache table is cache_advagg_bundle_reuse.
$cached_data = advagg_cached_bundle_get($cached_data_key, 'css_emimage_filenames_alter');
if (!empty($cached_data)) {
// verify cache_css_emimage_advagg has the data we need.
$good = TRUE;
foreach ($cached_data as $info) {
$saved = cache_get($info['bundle_md5'], 'cache_css_emimage_advagg');
if (empty($saved->data)) {
$good = FALSE;
}
}
if ($good) {
$output = array_merge($output, $cached_data);
continue;
}
}
$cached_data = array();
// Load up each CSS file.
$has_image = FALSE;
foreach ($files as $filename) {
$filename_md5 = md5($filename);
$data = advagg_get_file_data($filename_md5);
if (!empty($data['css_emimage'])) {
$has_image = TRUE;
break;
}
if (!isset($data['css_emimage'])) {
// Search css file to see if it contains an image.
if (!advagg_file_exists($filename)) {
continue;
}
$css = file_get_contents($filename);
// See if CSS file contains an image.
$pattern = '/(background(?:-image)?|list-style(?:-image)?):[^{};)]*?((?:none|url\\([\'"]?(.+?)[\'"]?\\)))([^{};]*)/i';
if (preg_match_all($pattern, $css, $matches) > 0) {
$images = $matches[3];
foreach ($matches[3] as $imagename) {
if (empty($imagename)) {
continue;
}
// Strip base path from filename.
$imagename = preg_replace('/^' . preg_quote($base_path, '/') . '/i', '', $imagename);
// If not a local file, continue the search.
if (file_exists($filename) == FALSE) {
continue;
}
// Break on the first local image we hit.
$has_image = TRUE;
break;
}
}
if (!$has_image) {
$lock_name = 'advagg_set_file_data_' . $filename_md5;
if (!lock_acquire($lock_name, 10)) {
lock_wait($lock_name);
}
$data = advagg_get_file_data($filename_md5);
$data['css_emimage'] = 0;
advagg_set_file_data($filename_md5, $data);
lock_release($lock_name);
}
}
// Jump out of loop if we found a local image.
if ($has_image) {
break;
}
}
if ($has_image) {
// See if this has already been "processed".
$saved = cache_get($bundle_md5, 'cache_css_emimage_advagg');
if (!empty($saved->data)) {
if ($saved->data != 'none') {
$output[] = $values;
$cached_data = array(
$values,
);
cache_set($cached_data_key, $cached_data, 'cache_advagg_bundle_reuse', CACHE_TEMPORARY);
continue;
}
else {
// css file used to not have any images, now it does.
cache_clear_all($bundle_md5, 'cache_advagg');
}
}
// Insert base css md5 into cache_css_emimage_advagg.
$values['bundle_md5'] = md5($bundle_md5 . 'base');
$saved = cache_get($values['bundle_md5'], 'cache_css_emimage_advagg');
if (empty($saved->data)) {
cache_set($values['bundle_md5'], 'base', 'cache_css_emimage_advagg');
}
$output[] = $values;
$cached_data[] = $values;
// Insert emimage css md5 into cache_css_emimage_advagg.
$values['bundle_md5'] = md5($bundle_md5 . 'emimage');
$saved = cache_get($values['bundle_md5'], 'cache_css_emimage_advagg');
if (empty($saved->data)) {
cache_set($values['bundle_md5'], 'emimage', 'cache_css_emimage_advagg');
}
$output[] = $values;
$cached_data[] = $values;
// Insert orig css md5 into cache_css_emimage_advagg.
$values['bundle_md5'] = md5($bundle_md5 . 'orig');
$saved = cache_get($values['bundle_md5'], 'cache_css_emimage_advagg');
if (empty($saved->data)) {
cache_set($values['bundle_md5'], 'orig', 'cache_css_emimage_advagg');
}
$output[] = $values;
$cached_data[] = $values;
cache_set($cached_data_key, $cached_data, 'cache_advagg_bundle_reuse', CACHE_TEMPORARY);
}
else {
// Insert none css md5 into cache_css_emimage_advagg; no processing needed.
$saved = cache_get($values['bundle_md5'], 'cache_css_emimage_advagg');
if (empty($saved->data)) {
cache_set($values['bundle_md5'], 'none', 'cache_css_emimage_advagg');
}
$output[] = $values;
$data = array(
$values,
);
cache_set($cached_data_key, $data, 'cache_advagg_bundle_reuse', CACHE_TEMPORARY);
// Remove bundle_md5s if file use to have an image and now does not.
$key = md5($bundle_md5 . 'base');
$saved = cache_get($key, 'cache_css_emimage_advagg');
if (!empty($saved->data)) {
cache_clear_all($key, 'cache_advagg');
}
$key = md5($bundle_md5 . 'emimage');
$saved = cache_get($key, 'cache_css_emimage_advagg');
if (!empty($saved->data)) {
cache_clear_all($key, 'cache_advagg');
}
$key = md5($bundle_md5 . 'orig');
$saved = cache_get($key, 'cache_css_emimage_advagg');
if (!empty($saved->data)) {
cache_clear_all($key, 'cache_advagg');
}
}
}
$filenames = $output;
}