use cssparser::Token;
pub(crate) fn render_token(token: &Token<'_>) -> String {
match token {
Token::Ident(ident) => ident.to_string(),
Token::AtKeyword(value) => format!("@{value}"),
Token::Hash(name) | Token::IDHash(name) => format!("#{name}"),
Token::QuotedString(value) => format!("\"{value}\""),
Token::UnquotedUrl(value) => value.to_string(),
Token::Number {
has_sign: signed,
value: num,
int_value: _,
}
| Token::Percentage {
has_sign: signed,
unit_value: num,
int_value: _,
} => render_number(*signed, *num, token),
Token::Dimension {
has_sign: signed,
value: num,
int_value: _,
unit,
} => format!("{}{}", render_int(*signed, *num), unit),
Token::WhiteSpace(_) => String::from(" "),
Token::Comment(comment) => format!("/* {comment} */"),
Token::Function(name) => format!("{name}()"),
Token::BadString(string) => format!("<Bad String {string:?}>"),
Token::BadUrl(url) => format!("<Bad URL {url:?}>"),
Token::Colon => ":".into(),
Token::Semicolon => ";".into(),
Token::Comma => ",".into(),
Token::IncludeMatch => "~=".into(),
Token::DashMatch => "|=".into(),
Token::PrefixMatch => "^=".into(),
Token::SuffixMatch => "$=".into(),
Token::SubstringMatch => "*=".into(),
Token::CDO => "<!--".into(),
Token::CDC => "-->".into(),
Token::ParenthesisBlock => "<(".into(),
Token::SquareBracketBlock => "<[".into(),
Token::CurlyBracketBlock => "<{".into(),
Token::CloseParenthesis => "<)".into(),
Token::CloseSquareBracket => "<]".into(),
Token::CloseCurlyBracket => "<}".into(),
Token::Delim(delim) => (*delim).into(),
}
}
fn render_number(signed: bool, num: f32, token: &Token) -> String {
let num = render_int(signed, num);
match token {
Token::Number { .. } => num,
Token::Percentage { .. } => format!("{num}%"),
_ => panic!("render_number is not supposed to be called on a non-numerical token"),
}
}
fn render_int(signed: bool, num: f32) -> String {
if signed {
render_int_signed(num)
} else {
render_int_unsigned(num)
}
}
fn render_int_signed(num: f32) -> String {
if num > 0.0 {
format!("+{num}")
} else {
format!("-{num}")
}
}
fn render_int_unsigned(num: f32) -> String {
format!("{num}")
}
#[cfg(test)]
mod tests {
use crate::Selector;
#[test]
fn regression_test_issue212() {
let err = Selector::parse("div138293@!#@!!@#").unwrap_err();
assert_eq!(err.to_string(), "Token \"@\" was not expected");
}
}