From 185b35de6ab8c8cdfaa075d21f504fb5df2348f6 Mon Sep 17 00:00:00 2001 From: ak1t0 Date: Sun, 19 Mar 2017 23:54:44 +0900 Subject: [PATCH 1/3] Add escape to write_str --- src/serializer.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/serializer.rs b/src/serializer.rs index ec8482e1..749fb032 100644 --- a/src/serializer.rs +++ b/src/serializer.rs @@ -250,12 +250,17 @@ impl<'a, W> fmt::Write for CssStringWriter<'a, W> where W: fmt::Write { fn write_str(&mut self, s: &str) -> fmt::Result { let mut chunk_start = 0; for (i, b) in s.bytes().enumerate() { + let string; let escaped = match b { b'"' => "\\\"", b'\\' => "\\\\", b'\n' => "\\A ", b'\r' => "\\D ", - b'\x0C' => "\\C ", + b'\0' => "\u{FFFD}", + x if (x >= b'\x01' && x <= b'\x1F') || x == b'\x7F' => { + string = format!("\\{:x} ", x); + &string + }, _ => continue, }; try!(self.inner.write_str(&s[chunk_start..i])); From 2b0681f2ad299f1e8206e91a273472b3194460df Mon Sep 17 00:00:00 2001 From: ak1t0 Date: Mon, 20 Mar 2017 15:37:16 +0900 Subject: [PATCH 2/3] Replace guard with range pattern --- src/serializer.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/serializer.rs b/src/serializer.rs index 749fb032..47aa7160 100644 --- a/src/serializer.rs +++ b/src/serializer.rs @@ -257,8 +257,8 @@ impl<'a, W> fmt::Write for CssStringWriter<'a, W> where W: fmt::Write { b'\n' => "\\A ", b'\r' => "\\D ", b'\0' => "\u{FFFD}", - x if (x >= b'\x01' && x <= b'\x1F') || x == b'\x7F' => { - string = format!("\\{:x} ", x); + b'\x01'...b'\x1F' | b'\x7F' => { + string = format!("\\{:x} ", b); &string }, _ => continue, From 8214af37e082c9f99789735669566e2a1239967f Mon Sep 17 00:00:00 2001 From: ak1t0 Date: Mon, 20 Mar 2017 16:41:31 +0900 Subject: [PATCH 3/3] Replace format! with Option<&str> --- src/serializer.rs | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/serializer.rs b/src/serializer.rs index 47aa7160..10711e1f 100644 --- a/src/serializer.rs +++ b/src/serializer.rs @@ -250,21 +250,20 @@ impl<'a, W> fmt::Write for CssStringWriter<'a, W> where W: fmt::Write { fn write_str(&mut self, s: &str) -> fmt::Result { let mut chunk_start = 0; for (i, b) in s.bytes().enumerate() { - let string; let escaped = match b { - b'"' => "\\\"", - b'\\' => "\\\\", - b'\n' => "\\A ", - b'\r' => "\\D ", - b'\0' => "\u{FFFD}", - b'\x01'...b'\x1F' | b'\x7F' => { - string = format!("\\{:x} ", b); - &string - }, + b'"' => Some("\\\""), + b'\\' => Some("\\\\"), + b'\n' => Some("\\A "), + b'\r' => Some("\\D "), + b'\0' => Some("\u{FFFD}"), + b'\x01'...b'\x1F' | b'\x7F' => None, _ => continue, }; try!(self.inner.write_str(&s[chunk_start..i])); - try!(self.inner.write_str(escaped)); + match escaped { + Some(x) => try!(self.inner.write_str(x)), + None => try!(write!(self.inner, "\\{:x} ", b)), + }; chunk_start = i + 1; } self.inner.write_str(&s[chunk_start..])