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\breakpointCode
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.');
}