1use cssparser::Token;
2
3pub(crate) fn render_token(token: &Token<'_>) -> String {
4 match token {
7 Token::Ident(ident) => format!("{}", ident.clone()),
9 Token::AtKeyword(value) => format!("@{}", value.clone()),
10 Token::Hash(name) | Token::IDHash(name) => format!("#{}", name.clone()),
11 Token::QuotedString(value) => format!("\"{}\"", value.clone()),
12 Token::Number { has_sign: signed, value: num, int_value: _ }
13 | Token::Percentage { has_sign: signed, unit_value: num, int_value: _ } => render_number(*signed, *num, token),
14 Token::Dimension { has_sign: signed, value: num, int_value: _, unit } => {
15 format!("{}{}", render_int(*signed, *num), unit)
16 }
17 Token::WhiteSpace(_) => String::from(" "),
18 Token::Comment(comment) => format!("/* {} */", comment),
19 Token::Function(name) => format!("{}()", name.clone()),
20 Token::BadString(string) => format!("<Bad String {:?}>", string.clone()),
21 Token::BadUrl(url) => format!("<Bad URL {:?}>", url.clone()),
22 sc_token => render_single_char_token(sc_token),
24 }
25}
26
27fn render_single_char_token(token: &Token) -> String {
28 String::from(match token {
29 Token::Colon => ":",
30 Token::Semicolon => ";",
31 Token::Comma => ",",
32 Token::IncludeMatch => "~=",
33 Token::DashMatch => "|=",
34 Token::PrefixMatch => "^=",
35 Token::SuffixMatch => "$=",
36 Token::SubstringMatch => "*=",
37 Token::CDO => "<!--",
38 Token::CDC => "-->",
39 Token::ParenthesisBlock => "<(",
40 Token::SquareBracketBlock => "<[",
41 Token::CurlyBracketBlock => "<{",
42 Token::CloseParenthesis => "<)",
43 Token::CloseSquareBracket => "<]",
44 Token::CloseCurlyBracket => "<}",
45 other => panic!("Token {:?} is not supposed to match as a single-character token!", other),
46 })
47}
48
49fn render_number(signed: bool, num: f32, token: &Token) -> String {
50 let num = render_int(signed, num);
51
52 match token {
53 Token::Number { .. } => num,
54 Token::Percentage { .. } => format!("{}%", num),
55 _ => panic!("render_number is not supposed to be called on a non-numerical token"),
56 }
57}
58
59fn render_int(signed: bool, num: f32) -> String {
60 if signed { render_int_signed(num) } else { render_int_unsigned(num) }
61}
62
63fn render_int_signed(num: f32) -> String {
64 if num > 0.0 { format!("+{}", num) } else { format!("-{}", num) }
65}
66
67fn render_int_unsigned(num: f32) -> String {
68 format!("{}", num)
69}