You are here

function advagg_mod_page_alter in Advanced CSS/JS Aggregation 7.2

Implements hook_page_alter().

File

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

Code

function advagg_mod_page_alter() {

  // Skip if advagg is disabled.
  if (!advagg_enabled()) {
    return;
  }

  // Return early if this setting is disabled.
  list(, , , , , , , , , , $css_defer) = advagg_mod_get_lists();
  if (empty($css_defer)) {
    return;
  }
  if (variable_get('advagg_mod_css_defer_visibility', ADVAGG_MOD_VISIBILITY_LISTED) != ADVAGG_MOD_VISIBILITY_FILE_CONTROLLED) {
    return;
  }

  // Get critical css file.
  list(, , $inline_strings) = advagg_mod_find_critical_css_file();
  $preload_from_inline_css = array();
  $domains_from_inline_css = array();

  // Add inline critical css for front page.
  if (!empty($inline_strings[0])) {

    // Extract url() references to add to the preloaded links.
    $matches = array();

    // Match url ( "' ... '" ).
    $pattern = '/url\\s*\\(\\s*[\'"]?(.+?)[\'"]?\\s*\\)/i';
    preg_match_all($pattern, $inline_strings[0], $matches);
    if (!empty($matches[1])) {
      foreach ($matches[1] as $key => $url) {
        $parsed = parse_url($url);

        // Remove data URIs.
        if (!empty($parsed['scheme']) && $parsed['scheme'] === 'data') {
          unset($matches[1][$key]);
          continue;
        }

        // Remote paths without a period.
        if (empty($parsed['path']) || strpos($parsed['path'], '.') === FALSE) {
          unset($matches[1][$key]);
          continue;
        }
        if (isset($parsed['host'])) {
          $domains_from_inline_css[] = $url;
        }
      }
      $preload_from_inline_css = $matches[1];
    }

    // Add critical css.
    drupal_add_css('advagg_mod_critical_css', array(
      'data' => $inline_strings[0],
      'type' => 'inline',
      'group' => CSS_SYSTEM - 1,
      'weight' => -50000,
      'movable' => FALSE,
      'critical-css' => TRUE,
    ));

    // Add critical css js loader.
    advagg_mod_add_loadcss_js_lib();
  }

  // Add in domain prefetch.
  $domains = array();
  if (!empty($inline_strings[1])) {
    $domains = preg_split("/\\r\\n|\\r|\\n/", $inline_strings[1]);
  }
  $domains = array_merge($domains, $domains_from_inline_css);

  // Remove duplicates and empty sets.
  $domains = array_filter(array_unique($domains));
  if (!empty($domains)) {
    foreach ($domains as $domain) {
      advagg_add_dns_prefetch(trim($domain));
    }
  }

  // Add in files to preload.
  $preload = array();
  if (!empty($inline_strings[2])) {
    $preload = preg_split("/\\r\\n|\\r|\\n/", $inline_strings[2]);
  }
  $preload = array_merge($preload, $preload_from_inline_css);

  // Remove duplicates and empty sets.
  $preload = array_filter(array_unique($preload));
  if (!empty($preload)) {
    $preload_array = array();
    $counter = 0;
    foreach ($preload as $value) {
      if (empty($value)) {
        $counter++;
        continue;
      }
      if (stripos($value, 'as: ') === 0) {
        $preload_array[$counter]['as'] = trim(substr($value, 4));
      }
      elseif (stripos($value, 'type: ') === 0) {
        $preload_array[$counter]['type'] = trim(substr($value, 6));
      }
      elseif (stripos($value, 'media: ') === 0) {
        $preload_array[$counter]['media'] = trim(substr($value, 7));
      }
      elseif (stripos($value, 'crossorigin: ') === 0) {
        $preload_array[$counter]['crossorigin'] = trim(substr($value, 13));
      }
      elseif (stripos($value, 'url: ') === 0) {
        if (!empty($preload_array[$counter]['url'])) {
          $counter++;
        }
        $preload_array[$counter]['url'] = trim(substr($value, 4));
      }
      else {
        if (!empty($preload_array[$counter]['url'])) {
          $counter++;
        }
        $preload_array[$counter]['url'] = trim($value);
      }
    }
    foreach ($preload_array as $values) {

      // Skip if url is not set.
      if (empty($values['url'])) {
        continue;
      }
      $url = $values['url'];
      $media = '';
      if (!empty($values['media'])) {
        $media = $values['media'];
      }
      $as = '';
      if (!empty($values['as'])) {
        $as = $values['as'];
      }
      $type = '';
      if (!empty($values['type'])) {
        $type = $values['type'];
      }
      $crossorigin = NULL;
      if (!empty($values['crossorigin'])) {
        $crossorigin = $values['crossorigin'];
      }
      advagg_add_preload_link($url, $media, $as, $type, $crossorigin);
    }
  }
}