You are here

function advagg_mod_find_critical_css_file in Advanced CSS/JS Aggregation 7.2

Try to find the critical css file.

Return value

array The css and dns files to use.

2 calls to advagg_mod_find_critical_css_file()
advagg_mod_admin_settings_form in advagg_mod/advagg_mod.admin.inc
Form builder; Configure advagg settings.
advagg_mod_page_alter in advagg_mod/advagg_mod.module
Implements hook_page_alter().

File

advagg_mod/advagg_mod.module, line 1667
Advanced aggregation modifier module.

Code

function advagg_mod_find_critical_css_file() {
  $filename = FALSE;

  // Normalize request uri.
  $base_path = base_path();
  $request_uri = request_uri();
  $pos = strpos($request_uri, $base_path);
  if ($pos === 0) {
    $request_uri = substr($request_uri, strlen($base_path));
  }
  $dirs = array(
    0 => drupal_get_path('theme', $GLOBALS['theme']) . '/',
    1 => 'critical-css/',
    // Use authenticated|anonymous or all.
    2 => user_is_logged_in() ? 'authenticated/' : 'anonymous/',
    3 => 'all/',
    // Use urls or object_type.
    4 => 'urls/',
    5 => 'type/',
    // Different variations of the current URL.
    6 => current_path(),
    7 => advagg_url_to_filename($request_uri, FALSE),
    8 => advagg_url_to_filename(request_path(), FALSE),
    9 => $request_uri,
    10 => request_path(),
  );
  $front_page = drupal_is_front_page();
  if (!$front_page) {
    $front_page = drupal_get_path_alias() == variable_get('site_frontpage', 'node');
  }
  $object = menu_get_object();
  $params = array(
    $dirs,
    $front_page,
    $object,
  );
  $inline_strings = array(
    '',
    '',
    '',
  );

  // Allow for altering the starting point.
  // Call hook_advagg_mod_critical_css_file_pre_alter().
  drupal_alter('advagg_mod_critical_css_file_pre', $filename, $params, $inline_strings);
  list($dirs, $front_page, $object) = $params;

  // Look in themename/critical-css/authenticated|anonymous/urls|object_type.
  if ((!empty($dirs[0]) || !empty($dirs[1])) && is_readable("{$dirs[0]}{$dirs[1]}")) {
    if (!$filename && $front_page && is_readable("{$dirs[0]}{$dirs[1]}{$dirs[2]}{$dirs[4]}front.css")) {
      $filename = "{$dirs[0]}{$dirs[1]}{$dirs[2]}{$dirs[4]}front";
    }
    if (!$filename && is_readable("{$dirs[0]}{$dirs[1]}{$dirs[2]}{$dirs[4]}{$dirs[6]}.css")) {
      $filename = "{$dirs[0]}{$dirs[1]}{$dirs[2]}{$dirs[4]}{$dirs[6]}";
    }
    if (!$filename && is_readable("{$dirs[0]}{$dirs[1]}{$dirs[2]}{$dirs[4]}{$dirs[7]}.css")) {
      $filename = "{$dirs[0]}{$dirs[1]}{$dirs[2]}{$dirs[4]}{$dirs[7]}";
    }
    if (!$filename && is_readable("{$dirs[0]}{$dirs[1]}{$dirs[2]}{$dirs[4]}{$dirs[8]}.css")) {
      $filename = "{$dirs[0]}{$dirs[1]}{$dirs[2]}{$dirs[4]}{$dirs[8]}";
    }
    if (isset($object->type)) {
      $filtered_object_type = advagg_url_to_filename($object->type);
      if (!$filename && is_readable("{$dirs[0]}{$dirs[1]}{$dirs[2]}{$dirs[5]}{$object->type}.css")) {
        $filename = "{$dirs[0]}{$dirs[1]}{$dirs[2]}{$dirs[5]}{$object->type}";
      }
      if (!$filename && is_readable("{$dirs[0]}{$dirs[1]}{$dirs[2]}{$dirs[5]}{$filtered_object_type}.css")) {
        $filename = "{$dirs[0]}{$dirs[1]}{$dirs[2]}{$dirs[5]}{$filtered_object_type}";
      }
    }

    // Look in themename/critical-css/all/urls|object_type.
    if (!$filename && $front_page && is_readable("{$dirs[0]}{$dirs[1]}{$dirs[3]}{$dirs[4]}front.css")) {
      $filename = "{$dirs[0]}{$dirs[1]}{$dirs[3]}{$dirs[4]}front";
    }
    if (!$filename && is_readable("{$dirs[0]}{$dirs[1]}{$dirs[3]}{$dirs[4]}{$dirs[6]}.css")) {
      $filename = "{$dirs[0]}{$dirs[1]}{$dirs[3]}{$dirs[4]}{$dirs[6]}";
    }
    if (!$filename && is_readable("{$dirs[0]}{$dirs[1]}{$dirs[3]}{$dirs[4]}{$dirs[7]}.css")) {
      $filename = "{$dirs[0]}{$dirs[1]}{$dirs[3]}{$dirs[4]}{$dirs[7]}";
    }
    if (!$filename && is_readable("{$dirs[0]}{$dirs[1]}{$dirs[3]}{$dirs[4]}{$dirs[8]}.css")) {
      $filename = "{$dirs[0]}{$dirs[1]}{$dirs[3]}{$dirs[4]}{$dirs[8]}";
    }
    if (isset($object->type)) {
      $filtered_object_type = advagg_url_to_filename($object->type);
      if (!$filename && is_readable("{$dirs[0]}{$dirs[1]}{$dirs[3]}{$dirs[5]}{$object->type}.css")) {
        $filename = "{$dirs[0]}{$dirs[1]}{$dirs[3]}{$dirs[5]}{$object->type}";
      }
      if (!$filename && is_readable("{$dirs[0]}{$dirs[1]}{$dirs[3]}{$dirs[5]}{$filtered_object_type}.css")) {
        $filename = "{$dirs[0]}{$dirs[1]}{$dirs[3]}{$dirs[5]}{$filtered_object_type}";
      }
    }
  }

  // Build filenames array.
  $filenames = array(
    '',
    '',
    '',
  );
  if ($filename) {
    $filenames = array(
      "{$filename}.css",
      "{$filename}.dns",
      "{$filename}.pre",
    );
  }

  // Get inline css string.
  if (empty($inline_strings[0]) && !empty($filenames[0]) && is_readable($filenames[0])) {
    module_load_include('inc', 'advagg', 'advagg');
    $inline_css = advagg_load_stylesheet($filenames[0], TRUE);

    // Allow other modules to modify this files contents.
    // Call hook_advagg_get_css_file_contents_alter().
    drupal_alter('advagg_get_css_file_contents', $inline_css, $filenames[0]);
    $inline_strings[0] = $inline_css;
  }

  // Remove starting and ending style tags.
  if (stripos($inline_strings[0], '<style>') === 0) {
    $inline_strings[0] = trim(substr($inline_strings[0], 7));
  }
  $len = strlen($inline_strings[0]);
  if (stripos($inline_strings[0], '</style>') === $len - 8) {
    $inline_strings[0] = trim(substr($inline_strings[0], 0, $len - 8));
  }

  // Add in domain prefetch.
  if (empty($inline_strings[1]) && !empty($filenames[1]) && is_readable($filenames[1])) {
    $inline_strings[1] = file_get_contents($filenames[1]);
  }

  // Add in files to preload.
  if (empty($inline_strings[2]) && !empty($filenames[2]) && is_readable($filenames[2])) {
    $inline_strings[2] = file_get_contents($filenames[2]);
  }

  // Remove !important from all CSS rules. Strips it even without a space in
  // front, unlike the earlier version of this code.
  if (variable_get('advagg_mod_inline_critical_css_strip_important', ADVAGG_MOD_INLINE_CRITICAL_CSS_STRIP_IMPORTANT)) {
    if (!empty($inline_strings)) {
      $inline_strings[0] = str_replace('!important', '', $inline_strings[0]);
    }
  }

  // Allow for altering the ending point.
  // Call hook_advagg_mod_critical_css_file_post_alter().
  drupal_alter('advagg_mod_critical_css_file_post', $filenames, $params, $inline_strings);
  return array(
    $filenames,
    $params,
    $inline_strings,
  );
}