Skip to main content

oxc_css_parser/parser/at_rule/
namespace.rs

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