You are here

public static function Breakpoint::isValidMediaQuery in Breakpoints 8

Check if a mediaQuery is valid.

Return value

true

Throws

Drupal\breakpoint\InvalidBreakpointMediaQueryException

See also

http://www.w3.org/TR/css3-mediaqueries/

http://www.w3.org/Style/CSS/Test/MediaQueries/20120229/reports/implement...

https://github.com/adobe/webkit/blob/master/Source/WebCore/css/

2 calls to Breakpoint::isValidMediaQuery()
BreakpointMediaQueryTest::testInvalidMediaQueries in lib/Drupal/breakpoint/Tests/BreakpointMediaQueryTest.php
Test invalid media queries.
BreakpointMediaQueryTest::testValidMediaQueries in lib/Drupal/breakpoint/Tests/BreakpointMediaQueryTest.php
Test valid media queries.

File

lib/Drupal/breakpoint/Breakpoint.php, line 301
Definition of Drupal\breakpoint\Breakpoint.

Class

Breakpoint
Defines the Breakpoint entity.

Namespace

Drupal\breakpoint

Code

public static function isValidMediaQuery($media_query) {
  $media_features = array(
    'width' => 'length',
    'min-width' => 'length',
    'max-width' => 'length',
    'height' => 'length',
    'min-height' => 'length',
    'max-height' => 'length',
    'device-width' => 'length',
    'min-device-width' => 'length',
    'max-device-width' => 'length',
    'device-height' => 'length',
    'min-device-height' => 'length',
    'max-device-height' => 'length',
    'orientation' => array(
      'portrait',
      'landscape',
    ),
    'aspect-ratio' => 'ratio',
    'min-aspect-ratio' => 'ratio',
    'max-aspect-ratio' => 'ratio',
    'device-aspect-ratio' => 'ratio',
    'min-device-aspect-ratio' => 'ratio',
    'max-device-aspect-ratio' => 'ratio',
    'color' => 'integer',
    'min-color' => 'integer',
    'max-color' => 'integer',
    'color-index' => 'integer',
    'min-color-index' => 'integer',
    'max-color-index' => 'integer',
    'monochrome' => 'integer',
    'min-monochrome' => 'integer',
    'max-monochrome' => 'integer',
    'resolution' => 'resolution',
    'min-resolution' => 'resolution',
    'max-resolution' => 'resolution',
    'scan' => array(
      'progressive',
      'interlace',
    ),
    'grid' => 'integer',
  );
  if ($media_query) {

    // Strip new lines and trim.
    $media_query = str_replace(array(
      "\r",
      "\n",
    ), ' ', trim($media_query));

    // Remove comments /* ... */.
    $media_query = preg_replace('/\\/\\*[\\s\\S]*?\\*\\//', '', $media_query);

    // Check mediaQuery_list: S* [mediaQuery [ ',' S* mediaQuery ]* ]?
    $parts = explode(',', $media_query);
    foreach ($parts as $part) {

      // Split on ' and '
      $query_parts = explode(' and ', trim($part));
      $media_type_found = FALSE;
      foreach ($query_parts as $query_part) {
        $matches = array();

        // Check expression: '(' S* media_feature S* [ ':' S* expr ]? ')' S*
        if (preg_match('/^\\(([\\w\\-]+)(:\\s?([\\w\\-\\.]+))?\\)/', trim($query_part), $matches)) {

          // Single expression.
          if (isset($matches[1]) && !isset($matches[2])) {
            if (!array_key_exists($matches[1], $media_features)) {
              throw new InvalidBreakpointMediaQueryException('Invalid media feature detected.');
            }
          }
          elseif (isset($matches[3]) && !isset($matches[4])) {
            $value = trim($matches[3]);
            if (!array_key_exists($matches[1], $media_features)) {
              throw new InvalidBreakpointMediaQueryException('Invalid media feature detected.');
            }
            if (is_array($media_features[$matches[1]])) {

              // Check if value is allowed.
              if (!array_key_exists($value, $media_features[$matches[1]])) {
                throw new InvalidBreakpointMediaQueryException('Value is not allowed.');
              }
            }
            else {
              switch ($media_features[$matches[1]]) {
                case 'length':
                  $length_matches = array();
                  if (preg_match('/^(\\-)?(\\d+(?:\\.\\d+)?)?((?:|em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|dpi|dpcm))$/i', trim($value), $length_matches)) {

                    // Only -0 is allowed.
                    if ($length_matches[1] === '-' && $length_matches[2] !== '0') {
                      throw new InvalidBreakpointMediaQueryException('Invalid length detected.');
                    }

                    // If there's a unit, a number is needed as well.
                    if ($length_matches[2] === '' && $length_matches[3] !== '') {
                      throw new InvalidBreakpointMediaQueryException('Unit found, value is missing.');
                    }
                  }
                  else {
                    throw new InvalidBreakpointMediaQueryException('Invalid unit detected.');
                  }
                  break;
              }
            }
          }
        }
        elseif (preg_match('/^((?:only|not)?\\s?)([\\w\\-]+)$/i', trim($query_part), $matches)) {
          if ($media_type_found) {
            throw new InvalidBreakpointMediaQueryException('Only one media type is allowed.');
          }
          $media_type_found = TRUE;
        }
        else {
          throw new InvalidBreakpointMediaQueryException('Invalid media query detected.');
        }
      }
    }
    return TRUE;
  }
  throw new InvalidBreakpointMediaQueryException('Media query is empty.');
}