You are here

advagg_js_compress.module in Advanced CSS/JS Aggregation 7.2

Advanced CSS/JS aggregation js compression module.

File

advagg_js_compress/advagg_js_compress.module
View source
<?php

/**
 * @file
 * Advanced CSS/JS aggregation js compression module.
 */

/**
 * @addtogroup default_variables
 * @{
 */

/**
 * Default value to see packer is enabled.
 */
define('ADVAGG_JS_COMPRESS_PACKER', FALSE);

/**
 * Default value to see what compressor to use. 0 is Disabled.
 */
define('ADVAGG_JS_COMPRESSOR', 0);

/**
 * Default value to see what compressor to use. 0 is Disabled.
 */
define('ADVAGG_JS_COMPRESS_INLINE', 0);

/**
 * Default value to if inline compression is used if page is not cacheable.
 */
define('ADVAGG_JS_COMPRESS_INLINE_IF_NOT_CACHEABLE', FALSE);

/**
 * Default value for the compression ratio test.
 */
define('ADVAGG_JS_COMPRESS_RATIO', 0.1);

/**
 * Default value for the compression ratio test.
 */
define('ADVAGG_JS_COMPRESS_MAX_RATIO', 0.9);

/**
 * Default value for per file compression settings.
 */
define('ADVAGG_JS_COMPRESSOR_FILE_SETTINGS', -1);

/**
 * Default value to if inline compression is used if page is not cacheable.
 */
define('ADVAGG_JS_COMPRESS_ADD_LICENSE', 3);

/**
 * Default value to refresh the data in the cache 1 week before the TTL expires.
 */
define('ADVAGG_JS_COMPRESS_REFRESH_BEFORE_CACHE_TTL', 604800);

/**
 * @} End of "addtogroup default_variables".
 */

/**
 * @addtogroup hooks
 * @{
 */

/**
 * Implements hook_cron().
 */
function advagg_js_compress_cron() {

  // Get the redo list.
  list(, $redo_list) = advagg_js_compress_all_js_files_list();

  // Return if nothing to do.
  if (empty($redo_list)) {
    return;
  }

  // Compress js files and cache.
  advagg_js_compress_redo_files($redo_list);
}

/**
 * Implements hook_menu().
 */
function advagg_js_compress_menu() {
  $file_path = drupal_get_path('module', 'advagg_js_compress');
  $config_path = advagg_admin_config_root_path();
  $items[$config_path . '/advagg/js-compress'] = array(
    'title' => 'JS Compression',
    'description' => 'Adjust JS Compression settings.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'advagg_js_compress_admin_settings_form',
    ),
    'type' => MENU_LOCAL_TASK,
    'access arguments' => array(
      'administer site configuration',
    ),
    'file path' => $file_path,
    'file' => 'advagg_js_compress.admin.inc',
    'weight' => 10,
  );
  $items[$config_path . '/advagg/js-compress/batch'] = array(
    'title' => 'Batch Generate',
    'page callback' => 'advagg_js_compress_batch_callback',
    'access arguments' => array(
      'administer site configuration',
    ),
  );
  return $items;
}

/**
 * Implements hook_module_implements_alter().
 */
function advagg_js_compress_module_implements_alter(&$implementations, $hook) {

  // Move advagg_js_compress below advagg.
  if ($hook === 'advagg_save_aggregate_alter' && array_key_exists('advagg_js_compress', $implementations)) {
    $advagg_key = '';
    $advagg_js_compress_key = '';
    $counter = 0;
    foreach ($implementations as $key => $value) {
      if ($key == 'advagg') {
        $advagg_key = $counter;
      }
      if ($key == 'advagg_js_compress') {
        $advagg_js_compress_key = $counter;
      }
      $counter++;
    }
    if ($advagg_js_compress_key > $advagg_key) {

      // Move advagg_js_compress to the top.
      $item = array(
        'advagg_js_compress' => $implementations['advagg_js_compress'],
      );
      unset($implementations['advagg_js_compress']);
      $implementations = array_merge($item, $implementations);

      // Move advagg to the very top.
      $item = array(
        'advagg' => $implementations['advagg'],
      );
      unset($implementations['advagg']);
      $implementations = array_merge($item, $implementations);
    }
  }
}

/**
 * @} End of "addtogroup hooks".
 */

/**
 * @addtogroup advagg_hooks
 * @{
 */

/**
 * Implements hook_advagg_current_hooks_hash_array_alter().
 */
function advagg_js_compress_advagg_current_hooks_hash_array_alter(&$aggregate_settings) {
  $aggregate_settings['variables']['advagg_js_compressor'] = variable_get('advagg_js_compressor', ADVAGG_JS_COMPRESSOR);
  $aggregate_settings['variables']['advagg_js_compress_packer'] = variable_get('advagg_js_compress_packer', ADVAGG_JS_COMPRESS_PACKER);
  $aggregate_settings['variables']['advagg_js_compress_ratio'] = variable_get('advagg_js_compress_ratio', ADVAGG_JS_COMPRESS_RATIO);
  $aggregate_settings['variables']['advagg_js_compress_max_ratio'] = variable_get('advagg_js_compress_max_ratio', ADVAGG_JS_COMPRESS_MAX_RATIO);
  $aggregate_settings['variables']['advagg_js_compressor_file_settings'] = variable_get('advagg_js_compressor_file_settings', array());
  $aggregate_settings['variables']['advagg_js_compress_add_license'] = variable_get('advagg_js_compress_add_license', ADVAGG_JS_COMPRESS_ADD_LICENSE);
}

/**
 * Implements hook_advagg_modify_js_pre_render_alter().
 *
 * Used compress inline js.
 */
function advagg_js_compress_advagg_modify_js_pre_render_alter(&$children, &$elements) {

  // Get variables.
  $aggregate_settings['variables']['advagg_js_compressor'] = variable_get('advagg_js_compress_inline', ADVAGG_JS_COMPRESS_INLINE);

  // Do nothing if the compressor is disabled.
  if (empty($aggregate_settings['variables']['advagg_js_compressor'])) {
    return;
  }

  // Do nothing if the page is not cacheable and inline compress if not
  // cacheable is not checked.
  if (!variable_get('advagg_js_compress_inline_if_not_cacheable', ADVAGG_JS_COMPRESS_INLINE_IF_NOT_CACHEABLE) && !drupal_page_is_cacheable()) {
    return;
  }

  // Compress any inline JS.
  module_load_include('inc', 'advagg_js_compress', 'advagg_js_compress.advagg');
  foreach ($children as &$values) {

    // Compress onload.
    if (!empty($values['#attributes']['onload'])) {
      $contents = $values['#attributes']['onload'];
      $filename = drupal_hash_base64($contents);
      advagg_js_compress_prep($contents, $filename, $aggregate_settings, FALSE);
      $values['#attributes']['onload'] = $contents;
    }

    // Compress onerror.
    if (!empty($values['#attributes']['onerror'])) {
      $contents = $values['#attributes']['onerror'];
      $filename = drupal_hash_base64($contents);
      advagg_js_compress_prep($contents, $filename, $aggregate_settings, FALSE);
      $values['#attributes']['onerror'] = $contents;
    }

    // Compress inline.
    if (!empty($values['#value'])) {
      $contents = $values['#value'];
      $filename = drupal_hash_base64($contents);
      advagg_js_compress_prep($contents, $filename, $aggregate_settings, FALSE);
      $values['#value'] = $contents;
    }
  }
  unset($values);
}

/**
 * @} End of "addtogroup advagg_hooks".
 */

/**
 * @addtogroup 3rd_party_hooks
 * @{
 */

/**
 * Implements hook_libraries_info().
 */
function advagg_js_compress_libraries_info() {
  $libraries['JShrink'] = array(
    'name' => 'JShrink',
    'vendor url' => 'https://github.com/tedious/JShrink',
    'download url' => 'https://github.com/tedious/JShrink/archive/master.zip',
    'local version' => '1.2.0',
    'version' => '1.2.0',
    'files' => array(
      'php' => array(
        'src/JShrink/Minifier.php',
      ),
    ),
  );
  $libraries['jsqueeze'] = array(
    'name' => 'JSqueeze',
    'vendor url' => 'https://github.com/tchwork/jsqueeze',
    'download url' => 'https://github.com/tchwork/jsqueeze/archive/master.zip',
    'local version' => '2.0.5',
    'version' => '2.0.5',
    'files' => array(
      'php' => array(
        'src/JSqueeze.php',
      ),
    ),
  );
  $libraries['jsminplus'] = array(
    'vendor url' => 'https://github.com/JSMinPlus/JSMinPlus',
    'download url' => 'https://github.com/JSMinPlus/JSMinPlus/archive/master.zip',
    'name' => 'JSMinPlus',
    'local version' => '1.4',
    'version arguments' => array(
      'file' => 'jsminplus.php',
      'pattern' => '/JSMinPlus\\s+version\\s+([0-9a-zA-Z\\.-]+)/',
      'lines' => 10,
      'cols' => 40,
    ),
    'files' => array(
      'php' => array(
        'jsminplus.php',
      ),
    ),
  );
  $libraries['jspacker'] = array(
    'vendor url' => 'https://github.com/tholu/php-packer',
    'download url' => 'https://github.com/tholu/php-packer/archive/master.zip',
    'name' => 'JSPacker',
    'local version' => '1.1',
    'version arguments' => array(
      'file' => 'src/Packer.php',
      'pattern' => '/\\.\\s+version\\s+([0-9a-zA-Z\\.-]+)/',
      'lines' => 4,
      'cols' => 40,
    ),
    'files' => array(
      'php' => array(
        'src/Packer.php',
      ),
    ),
  );
  return $libraries;
}

/**
 * @} End of "addtogroup 3rd_party_hooks".
 */

/**
 * Test a file, making sure it is compressible.
 *
 * @param string $filename
 *   Path and filename of the js file to test.
 * @param array $compressors
 *   List of compressors to test.
 * @param string $cache_id
 *   The cache ID for this file.
 * @param bool $debug
 *   Set to TRUE to debug.
 *
 * @return array
 *   Array showing the results of the compression tests.
 */
function advagg_js_compress_test_file($filename, array $compressors = array(), $cache_id = '', $debug = FALSE) {
  $contents = (string) @advagg_file_get_contents($filename);

  // Get the JS string length before the compression operation.
  $contents_before = $contents;
  $before = strlen($contents);
  module_load_include('inc', 'advagg_js_compress', 'advagg_js_compress.advagg');
  if (empty($compressors)) {
    list(, , $compressors) = advagg_js_compress_configuration();
  }
  $results = array();
  foreach ($compressors as $key => $name) {
    $contents = $contents_before;
    $aggregate_settings['variables']['advagg_js_compressor'] = $key;

    // Compress it.
    $no_errors = advagg_js_compress_prep($contents, $filename, $aggregate_settings, FALSE, FALSE, FALSE, TRUE);
    $after = strlen($contents);
    $ratio = 0;
    if ($before != 0) {
      $ratio = ($before - $after) / $before;
    }

    // Set to "-1" if the compressor threw an error.
    if ($no_errors === FALSE) {
      $results[$key] = array(
        'code' => -1,
        'ratio' => round($ratio, 5),
        'name' => $name,
      );
    }
    elseif ($ratio < 0.001) {
      $results[$key] = array(
        'code' => -2,
        'ratio' => round($ratio, 5),
        'name' => $name,
      );
    }
    elseif ($ratio > 0.999) {
      $results[$key] = array(
        'code' => -3,
        'ratio' => round($ratio, 5),
        'name' => $name,
      );
    }
    else {
      $results[$key] = array(
        'code' => 1,
        'ratio' => round($ratio, 5),
        'name' => $name,
      );
    }
    if ($debug) {
      $results[$key]['contents'] = $contents;
    }
  }
  if (!empty($cache_id)) {
    $cache = cache_get($cache_id, 'cache_advagg_info');

    // Merge in old cached data.
    if (!empty($cache->data)) {

      // Do not merge in -1 code.
      foreach ($cache->data as $key => $value) {
        if ($value['code'] == -1) {
          unset($cache->data[$key]);
        }
      }
      $results += $cache->data;
    }

    // CACHE_PERMANENT isn't good here. Use 2 weeks from now + 0-45 days.
    // The random 0 to 45 day addition is to prevent a cache stampeed.
    cache_set($cache_id, $results, 'cache_advagg_info', round(REQUEST_TIME + 1209600 + mt_rand(0, 3888000), -3));
  }
  return $results;
}

/**
 * Generate the js compress configuration.
 *
 * @return array
 *   Array($options, $description, $compressors, $functions).
 */
function advagg_js_compress_configuration() {

  // Set the defaults.
  $description = '';
  $options = array(
    0 => t('Disabled'),
    1 => t('JSMin+ ~1300ms'),
  );
  if (function_exists('jsmin')) {
    $options[3] = t('JSMin ~2ms');
    $description .= t('JSMin is the very fast C complied version. Recommend using it.');
  }
  else {
    if (!defined('PHP_VERSION_ID') || constant('PHP_VERSION_ID') < 50310) {
      $link = 'http://www.ypass.net/software/php_jsmin/';
    }
    else {
      $link = 'https://github.com/sqmk/pecl-jsmin/';
    }
    $description .= t('You can use the much faster C version of JSMin (~2ms) by installing the <a href="@php_jsmin">JSMin PHP Extension</a> on this server.', array(
      '@php_jsmin' => $link,
    ));
  }

  // Add in JShrink and JSqueeze if using php 5.3 or higher.
  if (defined('PHP_VERSION_ID') && constant('PHP_VERSION_ID') >= 50300) {
    $options += array(
      4 => t('JShrink ~1000ms'),
      5 => t('JSqueeze ~600ms'),
    );
  }
  $compressors = array(
    1 => 'jsminplus',
    2 => 'packer',
  );
  if (function_exists('jsmin')) {
    $compressors[3] = 'jsmin';
  }
  if (defined('PHP_VERSION_ID') && constant('PHP_VERSION_ID') >= 50300) {
    $compressors += array(
      4 => 'jshrink',
      5 => 'jsqueeze',
    );
  }
  $functions = array(
    1 => 'advagg_js_compress_jsminplus',
    2 => 'advagg_js_compress_jspacker',
    3 => 'advagg_js_compress_jsmin',
    4 => 'advagg_js_compress_jshrink',
    5 => 'advagg_js_compress_jsqueeze',
  );

  // Allow for other modules to alter this list.
  $options_desc = array(
    $options,
    $description,
  );

  // Call hook_advagg_js_compress_configuration_alter().
  drupal_alter('advagg_js_compress_configuration', $options_desc, $compressors, $functions);
  list($options, $description) = $options_desc;
  return array(
    $options,
    $description,
    $compressors,
    $functions,
  );
}

/**
 * Get all js files and js files that are not compressed.
 *
 * @return array
 *   Array($list, $redo_list).
 */
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,
  );
}

/**
 * Get all js files and js files that are not compressed.
 *
 * @param array $redo_list
 *   JS files that need to be compressed.
 * @param int $max_time
 *   Max amount of time to spend on compressing.
 * @param bool $drush
 *   Set to TRUE to output drush info when running.
 *
 * @return array
 *   Array($list, $redo_list).
 */
function advagg_js_compress_redo_files(array $redo_list, $max_time = 30, $drush = FALSE) {

  // Get the compressor list and start the clock.
  module_load_include('inc', 'advagg_js_compress', 'advagg_js_compress.advagg');
  $compressor_list = advagg_js_compress_get_enabled_compressors(array(), -1);
  shuffle($redo_list);
  $time_start = microtime(TRUE);
  if ($drush && (!is_callable('drush_log') || !is_callable('dt'))) {
    $drush = FALSE;
  }

  // Change settings for testing.
  if (isset($GLOBALS['conf']['advagg_js_compress_force_run'])) {
    $advagg_js_compress_force_run = $GLOBALS['conf']['advagg_js_compress_force_run'];
  }
  if (isset($GLOBALS['conf']['advagg_js_compress_add_license'])) {
    $advagg_js_compress_add_license = $GLOBALS['conf']['advagg_js_compress_add_license'];
  }
  if (isset($GLOBALS['conf']['httprl_background_callback'])) {
    $httprl_background_callback = $GLOBALS['conf']['httprl_background_callback'];
  }
  $GLOBALS['conf']['advagg_js_compress_force_run'] = TRUE;
  $GLOBALS['conf']['advagg_js_compress_add_license'] = 0;
  $GLOBALS['conf']['httprl_background_callback'] = FALSE;
  $counter = array();
  foreach ($redo_list as $key => $values) {

    // Test the files for up to 30 seconds.
    $filenames_info = array();
    $filenames_info[$values['data']] = $values;
    $compressors = $compressor_list;
    if (isset($values['compressors'])) {
      $compressors = $values['compressors'];
    }
    if ($drush) {
      drush_log(dt('Compressing @data.', array(
        '@data' => $values['data'],
      )), 'ok');
    }

    // Remove jsqueeze if compression failed.
    if (!empty($values['advagg_js_compress'])) {
      $neg_one_counter = 0;
      foreach ($values['advagg_js_compress'] as $compressor_data) {
        if ($compressor_data['code'] == -1) {
          $neg_one_counter++;
        }
      }
      if (count($values['advagg_js_compress']) === $neg_one_counter) {
        $compressor_key = array_search('jsqueeze', $compressors);
        if ($compressor_key !== FALSE) {
          unset($compressors[$compressor_key]);
        }
      }
    }

    // Prime cache.
    advagg_js_compress_run_mutiple_tests($filenames_info, $compressors);

    // Add to cache.
    advagg_get_info_on_file($values['data'], TRUE, TRUE);
    $counter[$key] = $values;

    // Stop after 30 seconds of processing.
    $time_end = microtime(TRUE);
    $time = $time_end - $time_start;
    if (!empty($max_time) && $time > $max_time) {
      break;
    }
  }

  // Put them back to normal.
  if (isset($advagg_js_compress_force_run)) {
    $GLOBALS['conf']['advagg_js_compress_force_run'] = $advagg_js_compress_force_run;
  }
  if (isset($advagg_js_compress_add_license)) {
    $GLOBALS['conf']['advagg_js_compress_add_license'] = $advagg_js_compress_add_license;
  }
  if (isset($httprl_background_callback)) {
    $GLOBALS['conf']['httprl_background_callback'] = $httprl_background_callback;
  }
  return $counter;
}

/**
 * The batch callback.
 */
function advagg_js_compress_batch_callback() {
  $batch = array(
    'operations' => array(),
    'finished' => 'advagg_js_compress_batch_done',
    'title' => t('Batch JS Minification'),
    'init_message' => t('Starting'),
    'progress_message' => t('Processed @current out of @total.'),
    'error_message' => t('JS minification has encountered an error.'),
  );
  list($list, $redo_list) = advagg_js_compress_all_js_files_list();
  $config_path = advagg_admin_config_root_path();
  if (empty($redo_list)) {
    $redo_list = $list;
  }
  foreach ($redo_list as $redo) {
    $batch['operations'][] = array(
      'advagg_js_compress_batch_process',
      array(
        $redo,
      ),
    );
  }
  batch_set($batch);

  // The path to redirect to when done.
  batch_process($config_path . '/advagg/js-compress');
}

/**
 * The batch processor.
 */
function advagg_js_compress_batch_process($redo, &$context) {

  // Give it up to 3 minutes.
  $max_time = ini_get('max_execution_time');
  if ($max_time != 0 && $max_time < 180) {
    set_time_limit(180);
  }
  ignore_user_abort(TRUE);

  // Display a progress message...
  $context['message'] = t("Now processing @filename...", array(
    '@filename' => $redo['data'],
  ));

  // Do heavy lifting here...
  advagg_js_compress_redo_files(array(
    $redo,
  ));
}

/**
 * The batch finish handler.
 */
function advagg_js_compress_batch_done($success, $results, $operations) {
  if ($success) {
    drupal_set_message(t('Done!'));
  }
  else {
    $error_operation = reset($operations);
    $message = t('An error occurred while processing %error_operation with arguments: @arguments', array(
      '%error_operation' => $error_operation[0],
      '@arguments' => print_r($error_operation[1], TRUE),
    ));
    drupal_set_message($message, 'error');
  }
}

/**
 * Test the cache_advagg_info cache bin; make sure it works.
 *
 * @return array
 *   Single section of the requirements array.
 */
function advagg_js_compress_check_cache_bin() {
  $t = get_t();
  $requirements = array();

  // Make sure cache table is working.
  $cid = 'advagg_js_compres:install:cache_test';
  $bin = 'cache_advagg_info';
  cache_set($cid, TRUE, $bin);
  $cache = cache_get($cid, $bin);
  $working = FALSE;
  if (!empty($cache->data)) {
    cache_clear_all($cid, $bin);
    $cache = cache_get($cid, $bin);
    if (empty($cache->data)) {
      $working = TRUE;
    }
  }
  if (empty($working)) {
    $broken_name = get_class(_cache_get_object($bin));
    if ($broken_name === 'DrupalFakeCache') {
      $working_name = get_class(_cache_get_object('cache_form'));
      if ($working_name === 'DrupalFakeCache') {
        $working_name = 'DrupalDatabaseCache';
      }
      $extra_description = t('Please add this to the bottom of your settings.php file. <p><code>@string</code></p>', array(
        '@string' => "\$conf['cache_class_cache_advagg_info'] = '{$working_name}';",
      ));
    }
    $requirements['advagg_js_compres_cache_bin'] = array(
      'title' => $t('AdvAgg JS Compressor - The %bin cache table does not work', array(
        '%bin' => $bin,
      )),
      'severity' => REQUIREMENT_WARNING,
      'value' => $t('The %class_name cache bin appears to be broken.', array(
        '%class_name' => $broken_name,
      )),
      'description' => $t('You need to adjust your settings.php file so that the %bin bin is working correctly.', array(
        '%bin' => $bin,
      )),
    );
    $requirements['advagg_js_compres_cache_bin']['description'] .= " {$extra_description}";
  }
  return $requirements;
}

Functions

Namesort descending Description
advagg_js_compress_advagg_current_hooks_hash_array_alter Implements hook_advagg_current_hooks_hash_array_alter().
advagg_js_compress_advagg_modify_js_pre_render_alter Implements hook_advagg_modify_js_pre_render_alter().
advagg_js_compress_all_js_files_list Get all js files and js files that are not compressed.
advagg_js_compress_batch_callback The batch callback.
advagg_js_compress_batch_done The batch finish handler.
advagg_js_compress_batch_process The batch processor.
advagg_js_compress_check_cache_bin Test the cache_advagg_info cache bin; make sure it works.
advagg_js_compress_configuration Generate the js compress configuration.
advagg_js_compress_cron Implements hook_cron().
advagg_js_compress_libraries_info Implements hook_libraries_info().
advagg_js_compress_menu Implements hook_menu().
advagg_js_compress_module_implements_alter Implements hook_module_implements_alter().
advagg_js_compress_redo_files Get all js files and js files that are not compressed.
advagg_js_compress_test_file Test a file, making sure it is compressible.

Constants

Namesort descending Description
ADVAGG_JS_COMPRESSOR Default value to see what compressor to use. 0 is Disabled.
ADVAGG_JS_COMPRESSOR_FILE_SETTINGS Default value for per file compression settings.
ADVAGG_JS_COMPRESS_ADD_LICENSE Default value to if inline compression is used if page is not cacheable.
ADVAGG_JS_COMPRESS_INLINE Default value to see what compressor to use. 0 is Disabled.
ADVAGG_JS_COMPRESS_INLINE_IF_NOT_CACHEABLE Default value to if inline compression is used if page is not cacheable.
ADVAGG_JS_COMPRESS_MAX_RATIO Default value for the compression ratio test.
ADVAGG_JS_COMPRESS_PACKER Default value to see packer is enabled.
ADVAGG_JS_COMPRESS_RATIO Default value for the compression ratio test.
ADVAGG_JS_COMPRESS_REFRESH_BEFORE_CACHE_TTL Default value to refresh the data in the cache 1 week before the TTL expires.