Skip to main content

oxc_css_parser/parser/at_rule/
namespace.rs

1use super::Parser;
2use crate::{Parse, Spanned, ast::*, error::PResult, peek, tokenizer::Token};
3
4// https://www.w3.org/TR/css-namespaces-3/#syntax
5impl<'a> Parse<'a> for NamespacePrelude<'a> {
6    fn parse(input: &mut Parser<'a>) -> PResult<Self> {
7        let prefix = match &peek!(input).token {
8            Token::Ident(ident) => {
9                if ident.name().eq_ignore_ascii_case("url") {
10                    None
11                } else {
12                    Some(InterpolableIdent::Literal(input.parse::<Ident>()?))
13                }
14            }
15            Token::HashLBrace(..) | Token::AtLBraceVar(..) => {
16                input.parse::<InterpolableIdent>().map(Some)?
17            }
18            _ => None,
19        };
20        let uri = match &peek!(input).token {
21            Token::Str(..) | Token::StrTemplate(..) => {
22                input.parse().map(NamespacePreludeUri::Str)?
23            }
24            _ => input.parse().map(NamespacePreludeUri::Url)?,
25        };
26
27        let mut span = uri.span().clone();
28        if let Some(prefix) = &prefix {
29            span.start = prefix.span().start;
30        }
31        Ok(NamespacePrelude { prefix, uri, span })
32    }
33}