Alter the css array.

Parameters

array $css: CSS array.

bool $force_check: TRUE if you want to force check the external source.

Related topics

2 calls to advagg_relocate_css_post_alter()
advagg_relocate_cron in advagg_relocate/advagg_relocate.module
Implements hook_cron().
advagg_relocate_load_stylesheet_external in advagg_relocate/advagg_relocate.module
Convert external @import statements to be local.

File

advagg_relocate/advagg_relocate.module, line 310

Code

function advagg_relocate_css_post_alter(array &$css, $force_check = FALSE) {
    if (!module_exists('advagg') || !advagg_enabled()) {
        return;
    }
    $aggregate_settings = advagg_current_hooks_hash_array();
    // Check external css setting.
    if (empty($aggregate_settings['variables']['advagg_relocate_css'])) {
        return;
    }
    // Get all external css files.
    $urls = _advagg_relocate_get_urls($css, 'css', $aggregate_settings);
    if (empty($urls)) {
        return;
    }
    // Make advagg_save_data() available.
    module_load_include('inc', 'advagg', 'advagg.missing');
    module_load_include('advagg.inc', 'advagg_relocate');
    $responses = advagg_relocate_get_remote_data($urls, 'css', array(), $force_check);
    // Get s3fs no_rewrite_cssjs setting.
    $s3fs_no_rewrite_cssjs = advagg_get_s3fs_config('no_rewrite_cssjs');
    $filenames = array();
    $advagg_relocate_css_ttl = variable_get('advagg_relocate_css_ttl', ADVAGG_RELOCATE_CSS_TTL);
    foreach ($responses as $value) {
        if (!empty($advagg_relocate_css_ttl) && $value->ttl >= $advagg_relocate_css_ttl) {
            continue;
        }
        $rehash = FALSE;
        // Handle @import statements.
        if (strpos($value->data, '@import') !== FALSE) {
            // Handle "local" import statements.
            advagg_relocate_load_stylesheet_local(array(), dirname($value->url) . '/');
            $value->data = preg_replace_callback('%@import\\s*+(?:url\\(\\s*+)?+[\'"]?+(?![a-z]++:|/)([^\'"()\\s]++)[\'"]?+\\s*+\\)?+\\s*+;%i', 'advagg_relocate_load_stylesheet_local', $value->data);
            // Replace external import statements with the contents of them.
            $value->data = preg_replace_callback('%@import\\s*+(?:url\\(\\s*+)?+[\'"]?+((?:http:\\/\\/|https:\\/\\/|\\/\\/)(?:[^\'"()\\s]++))[\'"]?+\\s*+\\)?+\\s*+;%i', 'advagg_relocate_load_stylesheet_external', $value->data);
            $rehash = TRUE;
        }
        // Fix external url references.
        if (strpos($value->data, 'url(') !== FALSE) {
            module_load_include('inc', 'advagg', 'advagg');
            // Set anchor point for local url() statements in the css.
            _advagg_build_css_path(array(), dirname($value->url) . '/');
            // Anchor all paths in the CSS with its base URL, ignoring external,
            // absolute paths, and urls that start with # or %23 (SVG).
            $value->data = preg_replace_callback('%url\\(\\s*+[\'"]?+(?![a-z]++:|/|\\#|\\%23+)([^\'"\\)]++)[\'"]?+\\s*+\\)%i', '_advagg_build_css_path', $value->data);
            $rehash = TRUE;
        }
        if ($rehash) {
            $value->hash = drupal_hash_base64($value->data);
        }
        // Save remote data.
        list($full_filename, $errors, $saved) = _advagg_relocate_save_remote_asset($value->options['filename'], $value->data, $value->local_cache, $value->hash);
        if (!empty($errors)) {
            continue;
        }
        // Replace remote data with local data.
        $relative_path = advagg_get_relative_path($full_filename);
        $key = $urls[$value->options['filename']];
        $css = advagg_relocate_key_rename($css, array(
            $relative_path => $key,
        ));
        $css[$relative_path]['pre_relocate_data'] = $css[$relative_path]['data'];
        $css[$relative_path]['data'] = $relative_path;
        $css[$relative_path]['type'] = 'file';
        if (defined('ADVAGG_MOD_CSS_PREPROCESS') && variable_get('advagg_mod_css_preprocess', ADVAGG_MOD_CSS_PREPROCESS) && empty($css[$relative_path]['preprocess_lock'])) {
            $css[$relative_path]['preprocess'] = TRUE;
        }
        // Handle domain prefectch.
        $key_host = parse_url($key, PHP_URL_HOST);
        if (!empty($css[$relative_path]['dns_prefetch'])) {
            foreach ($css[$relative_path]['dns_prefetch'] as $key => $domain_name) {
                if (strpos($domain_name, $key_host) !== FALSE && strpos($value->data, $key_host)) {
                    unset($css[$relative_path]['dns_prefetch'][$key]);
                }
            }
        }
        // List of files that need the cache cleared.
        if ($saved) {
            $filenames[] = !is_null($s3fs_no_rewrite_cssjs) && empty($s3fs_no_rewrite_cssjs) ? $full_filename : $relative_path;
        }
    }
    if (!empty($filenames)) {
        module_load_include('inc', 'advagg');
        module_load_include('cache.inc', 'advagg');
        $files = advagg_get_info_on_files($filenames, TRUE);
        advagg_push_new_changes($files);
    }
}