Skip to main content

oxc_css_parser/parser/at_rule/
custom_media.rs

1use super::Parser;
2use crate::{Parse, ast::*, error::PResult, pos::Span, tokenizer::Token};
3
4// https://www.w3.org/TR/mediaqueries-5/#custom-mq
5//
6// @custom-media <extension-name> [ <media-query-list> | true | false ] ;
7// <extension-name> = <dashed-ident>
8impl<'a> Parse<'a> for CustomMedia<'a> {
9    fn parse(input: &mut Parser<'a>) -> PResult<Self> {
10        let name = input.parse_dashed_ident()?;
11        let value = input.parse::<CustomMediaValue>()?;
12        let span = Span { start: name.span().start, end: value.span().end };
13        Ok(CustomMedia { name, value, span })
14    }
15}
16
17// <custom-media-value> = <media-query-list> | true | false
18impl<'a> Parse<'a> for CustomMediaValue<'a> {
19    fn parse(input: &mut Parser<'a>) -> PResult<Self> {
20        match &input.cursor.peek()?.token {
21            Token::Ident(ident) => {
22                let name = ident.name();
23                if name.eq_ignore_ascii_case("true") {
24                    input.parse().map(CustomMediaValue::True)
25                } else if name.eq_ignore_ascii_case("false") {
26                    input.parse().map(CustomMediaValue::False)
27                } else {
28                    input.parse().map(CustomMediaValue::MediaQueryList)
29                }
30            }
31            _ => input.parse().map(CustomMediaValue::MediaQueryList),
32        }
33    }
34}