You are here

function advagg_js_compress_all_js_files_list in Advanced CSS/JS Aggregation 7.2

Get all js files and js files that are not compressed.

Return value

array Array($list, $redo_list).

4 calls to advagg_js_compress_all_js_files_list()
advagg_js_compress_admin_settings_form in advagg_js_compress/advagg_js_compress.admin.inc
Form builder; Configure advagg settings.
advagg_js_compress_batch_callback in advagg_js_compress/advagg_js_compress.module
The batch callback.
advagg_js_compress_cron in advagg_js_compress/advagg_js_compress.module
Implements hook_cron().
drush_advagg_js_compress in advagg_js_compress/advagg_js_compress.drush.inc
Callback function for drush advagg-js-compress.

File

advagg_js_compress/advagg_js_compress.module, line 467
Advanced CSS/JS aggregation js compression module.

Code

function advagg_js_compress_all_js_files_list() {

  // Get all files stored in the database.
  $result = db_select('advagg_files', 'af')
    ->fields('af')
    ->condition('filetype', 'js')
    ->orderBy('filename', 'ASC')
    ->execute();
  if (empty($result)) {
    return array();
  }
  module_load_include('inc', 'advagg_js_compress', 'advagg_js_compress.advagg');
  $compressor_list = advagg_js_compress_get_enabled_compressors(array(), -1);
  $compressor_list_count = count($compressor_list);

  // Check if files have been compressed.
  module_load_include('inc', 'advagg', 'advagg');
  $redo_list = array();
  $failed_redo_list = array();
  $list = array();
  $cache_ids = array();
  foreach ($result as $row) {
    $row = (array) $row;

    // Check cache for jsmin info.
    $info = advagg_get_info_on_file($row['filename']);
    if ($info['filesize'] == 0) {
      continue;
    }
    $list[$row['filename']] = $info;

    // Get the cache id as well.
    $cache_id = 'advagg:js_compress:info:' . $info['filename_hash'];
    $cache_id .= !empty($info['content_hash']) ? ':' . $info['content_hash'] : '';
    $cache_ids[$cache_id] = $row['filename'];
  }

  // Check for soon to expire cache ids.
  $values = array_keys($cache_ids);
  $cache_hits = cache_get_multiple($values, 'cache_advagg_info');
  $ttl = variable_get('advagg_js_compress_refresh_before_cache_ttl', ADVAGG_JS_COMPRESS_REFRESH_BEFORE_CACHE_TTL);
  foreach ($cache_hits as $cache) {
    if (!empty($cache->expire) && $cache->expire - $ttl < REQUEST_TIME) {
      $info = $list[$cache_ids[$cache->cid]];
      $redo_list[$info['data']] = $info;
    }
  }
  foreach ($list as $info) {

    // No jsmin info or incomplete data => rerun compression tests.
    if (empty($info['advagg_js_compress']) || count($info['advagg_js_compress']) !== $compressor_list_count) {
      $redo_list[$info['data']] = $info;
      continue;
    }
    $empty_ratio_count = 0;
    $bad_compression_count = 0;
    foreach ($info['advagg_js_compress'] as $values) {
      if (empty($values['ratio'])) {
        if ($values['code'] != -1) {
          $empty_ratio_count++;
        }
        else {
          $bad_compression_count++;
        }
      }
    }

    // More than one compressor has an empty ratio.
    if ($empty_ratio_count > 1) {
      $failed_redo_list[$info['data']] = $info;
    }

    // All failed; try again.
    if ($bad_compression_count == count($info['advagg_js_compress'])) {
      $failed_redo_list[$info['data']] = $info;
    }
  }
  $redo_list = array_merge($redo_list, $failed_redo_list);
  $reversed_needle = strrev('.min.js');
  $advagg_js_compressor_file_settings = variable_get('advagg_js_compressor_file_settings', []);
  foreach ($redo_list as $key => $info) {

    // Filter out file if the compressor is disabled.
    $filename = str_replace([
      '/',
      '.',
    ], [
      '__',
      '--',
    ], $key);
    if (isset($advagg_js_compressor_file_settings[$filename]) && $advagg_js_compressor_file_settings[$filename] == 0) {
      unset($redo_list[$key]);
      continue;
    }

    // Filter out .min.js if they have already been ran.
    if (stripos(strrev($info['data']), $reversed_needle) === 0 && !empty($info['advagg_js_compress'][2]['ratio'])) {
      unset($redo_list[$key]);
      continue;
    }

    // Filter out file if it is empty.
    $data = file_get_contents($info['data']);
    if (empty($data)) {
      unset($redo_list[$key]);
      continue;
    }

    // Filter out file if it only contains a small amount of whitespace.
    $count_ws = strlen($data);
    $count = strlen(preg_replace('/\\s/', '', $data));
    if ($count / $count_ws > 0.97) {
      unset($redo_list[$key]);
      continue;
    }
  }
  shuffle($redo_list);
  return array(
    $list,
    $redo_list,
  );
}