You are here

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