You are here

function css_emimage_advagg_files_table in CSS Embedded Images 6.2

Implementation of hook_advagg_files_table().

See if any images referenced in a CSS file has changed.

File

./css_emimage.module, line 297
CSS Embedded Images module.

Code

function css_emimage_advagg_files_table($row, $checksum) {
  global $base_path;

  // Only operate on CSS files.
  if ($row['filetype'] != 'css') {
    return;
  }

  // Load the CSS file.
  $images = array();
  $css = advagg_build_css_bundle(array(
    $row['filename'],
  ));

  // Get file data.
  $lock_name = 'advagg_set_file_data_' . $row['filename_md5'];
  if (!lock_acquire($lock_name)) {
    lock_wait($lock_name);
  }
  $data = advagg_get_file_data($row['filename_md5']);

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

  // If no images bail out.
  if (empty($images)) {
    if (isset($data['css_emimage']) && $data['css_emimage'] == 0) {
      lock_release($lock_name);
      return;
    }
    $data['css_emimage'] = 0;
    advagg_set_file_data($row['filename_md5'], $data);
    lock_release($lock_name);
    return;
  }
  $out = array();
  $rebuild = FALSE;
  $save = FALSE;
  foreach ($images as $filename) {
    if (empty($filename)) {
      lock_release($lock_name);
      continue;
    }

    // Strip base path from filename.
    $filename = preg_replace('/^' . preg_quote($base_path, '/') . '/i', '', $filename);
    if (file_exists($filename) == FALSE) {
      lock_release($lock_name);
      continue;
    }

    // Get the checksum of each image.
    $checksum = advagg_checksum($filename);
    if (!empty($data['css_emimage'][$filename])) {
      if ($data['css_emimage'][$filename] != $checksum) {
        $rebuild = TRUE;
        $save = TRUE;
      }
    }
    else {
      $save = TRUE;
    }
    $data['css_emimage'] = array();
    $data['css_emimage'][$filename] = $checksum;
  }
  if ($save) {
    advagg_set_file_data($row['filename_md5'], $data);
  }
  lock_release($lock_name);
  return $rebuild;
}