From eeea617fb1eba99e3f3f770785e3862629489c8e Mon Sep 17 00:00:00 2001 From: Sunshine Date: Sat, 11 Apr 2020 17:50:23 -0400 Subject: [PATCH] escape all special chars within #id and .class CSS selectors --- src/css.rs | 17 +++++++++++++++-- src/tests/css/embed_css.rs | 6 +++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/css.rs b/src/css.rs index d673694..16cb929 100644 --- a/src/css.rs +++ b/src/css.rs @@ -24,6 +24,7 @@ const CSS_PROPS_WITH_IMAGE_URLS: &[&str] = &[ "suffix", "symbols", ]; +const CSS_SPECIAL_CHARS: &str = "~!@$%^&*()+=,./'\";:?><[]{}|`#"; pub fn is_image_url_prop(prop_name: &str) -> bool { CSS_PROPS_WITH_IMAGE_URLS @@ -40,6 +41,18 @@ pub fn enquote(input: String, double: bool) -> String { } } +pub fn escape(value: &str) -> String { + let mut res = str!(&value); + + res = res.replace("\\", "\\\\"); + + for c in CSS_SPECIAL_CHARS.chars() { + res = res.replace(c, format!("\\{}", c).as_str()); + } + + res +} + pub fn process_css<'a>( cache: &mut HashMap, client: &Client, @@ -122,7 +135,7 @@ pub fn process_css<'a>( } Token::Ident(ref value) => { curr_prop = str!(value); - result.push_str(&value.replace(":", "\\:")); + result.push_str(&escape(value)); } Token::AtKeyword(ref value) => { curr_rule = str!(value); @@ -243,7 +256,7 @@ pub fn process_css<'a>( } Token::IDHash(ref value) => { result.push_str("#"); - result.push_str(value); + result.push_str(&escape(value)); } Token::UnquotedUrl(ref value) => { let is_import: bool = curr_rule == "import"; diff --git a/src/tests/css/embed_css.rs b/src/tests/css/embed_css.rs index c87de8d..cf81031 100644 --- a/src/tests/css/embed_css.rs +++ b/src/tests/css/embed_css.rs @@ -225,7 +225,7 @@ div {\n \ } #[test] -fn passing_colons_in_class_names() { +fn passing_unusual_indents() { let cache = &mut HashMap::new(); let client = Client::new(); @@ -233,6 +233,10 @@ fn passing_colons_in_class_names() { .is\\:good:hover {\n \ color: green\n\ }\n\ +\n\ +#\\~\\!\\@\\$\\%\\^\\&\\*\\(\\)\\+\\=\\,\\.\\/\\\\\\'\\\"\\;\\:\\?\\>\\<\\[\\]\\{\\}\\|\\`\\# {\n \ + color: black\n\ +}\n\ "; assert_eq!(