You are here

function advagg_relocate_parse_css_font_face in Advanced CSS/JS Aggregation 7.2

Parse the font family string into a structured array.

Parameters

string $css_string: The raw css string.

array $properties: The css properties to get.

string $type: The type of font file.

Return value

array Returns a key value array.

1 call to advagg_relocate_parse_css_font_face()
advagg_relocate_get_remote_font_data in advagg_relocate/advagg_relocate.advagg.inc
Gets external CSS files; caches it and returns css font rules.

File

advagg_relocate/advagg_relocate.advagg.inc, line 966
Advanced aggregation relocate module.

Code

function advagg_relocate_parse_css_font_face($css_string, array $properties, $type) {

  // Get the CSS that contains a font-family rule.
  $length = strlen($css_string);
  $property_position = 0;
  $lower = strtolower($css_string);
  $attributes = array();
  foreach ($properties as $property) {
    while (($property_position = strpos($lower, $property, $property_position)) !== FALSE) {

      // Find the start of the values for the property.
      $start_of_values = strpos($css_string, ':', $property_position);

      // Get the property at this location of the css.
      $property_in_loop = trim(substr($css_string, $property_position, $start_of_values - $property_position));

      // Make sure this property is one of the ones we're looking for.
      if ($property_in_loop !== $property) {
        $property_position += strlen($property);
        continue;
      }

      // Get position of last closing bracket plus 1 (start of this section).
      $start = strrpos($css_string, '}', -($length - $property_position));
      if ($start === FALSE) {

        // Property is in the first selector and a declaration block (full rule
        // set).
        $start = 0;
      }
      else {

        // Add one to start after the }.
        $start++;
      }

      // Get closing bracket (end of this section).
      $end = strpos($css_string, '}', $property_position);
      if ($end === FALSE) {

        // The end is the end of this file.
        $end = $length;
      }

      // Get closing ; in order to get end of the declaration of the property.
      $declaration_end_a = strpos($css_string, ';', $property_position);
      $declaration_end_b = strpos($css_string, '}', $property_position);
      if ($declaration_end_a === FALSE) {
        $declaration_end = $declaration_end_b;
      }
      else {
        $declaration_end = min($declaration_end_a, $declaration_end_b);
      }
      if ($declaration_end > $end) {
        $declaration_end = $end;
      }

      // Add one in order to capture the } when we ge the full rule set.
      $end++;

      // Advance position for the next run of the while loop.
      $property_position = $end;

      // Get values assigned to this property.
      $values_string = substr($css_string, $start_of_values + 1, $declaration_end - ($start_of_values + 1));

      // Parse values string into an array of values.
      $values_array = explode(',', $values_string);
      $values_array = array_map('trim', $values_array);
      foreach ($values_array as $key => $value) {
        if (stripos($value, "'{$type}'") !== FALSE || stripos($value, ".{$type}") !== FALSE) {
          unset($values_array[$key]);
          $values_array[$type] = $value;
        }
      }
      $attributes[$property][] = $values_array;
    }
  }

  // Make sure src is the last one.
  $temp = $attributes['src'];
  unset($attributes['src']);
  $attributes['src'] = $temp;

  // Parse attributes into an output array.
  $temp = array();
  $output = array();
  foreach ($attributes as $property => $values) {
    foreach ($values as $key => $value) {
      if ($property !== 'src') {
        $value = implode(',', $value);
        if (!isset($temp[$key])) {
          $temp[$key] = '';
        }
        $temp[$key] .= "{$property}: {$value}; ";
      }
      else {
        $output[$temp[$key]] = $value;
      }
    }
  }
  return $output;
}