From a5cd33531852ad5c917877495f0ffb26efd6d9ab Mon Sep 17 00:00:00 2001 From: ConnorSkees <39542938+ConnorSkees@users.noreply.github.com> Date: Fri, 24 Apr 2020 19:00:06 -0400 Subject: [PATCH] properly handle whitespace and start and end of url() --- src/utils/comment_whitespace.rs | 14 ++++++++++++++ src/value/css_function.rs | 19 ++++++++++++++++--- tests/url.rs | 20 ++++++++++++++++++++ 3 files changed, 50 insertions(+), 3 deletions(-) diff --git a/src/utils/comment_whitespace.rs b/src/utils/comment_whitespace.rs index 7e4f8e0..78579af 100644 --- a/src/utils/comment_whitespace.rs +++ b/src/utils/comment_whitespace.rs @@ -34,6 +34,20 @@ pub(crate) fn devour_whitespace, W: IsWhitespace>( found_whitespace } +pub(crate) fn peek_whitespace, W: IsWhitespace>( + s: &mut PeekMoreIterator, +) -> usize { + let mut peek_counter = 0; + while let Some(w) = s.peek() { + if !w.is_whitespace() { + break; + } + peek_counter += 1; + s.peek_forward(1); + } + peek_counter +} + pub(crate) fn devour_whitespace_or_comment>( toks: &mut PeekMoreIterator, ) -> SassResult { diff --git a/src/value/css_function.rs b/src/value/css_function.rs index b479a7c..1214108 100644 --- a/src/value/css_function.rs +++ b/src/value/css_function.rs @@ -5,6 +5,7 @@ use crate::scope::Scope; use crate::selector::Selector; use crate::utils::{ devour_whitespace, parse_interpolation, peek_escape, peek_until_closing_curly_brace, + peek_whitespace, }; use crate::Token; @@ -88,6 +89,7 @@ pub(crate) fn try_eat_url>( ) -> SassResult> { let mut buf = String::from("url("); let mut peek_counter = 0; + peek_counter += peek_whitespace(toks); while let Some(tok) = toks.peek() { let kind = tok.kind; toks.move_forward(1); @@ -117,10 +119,21 @@ pub(crate) fn try_eat_url>( } } else if kind == ')' { buf.push(')'); - for _ in 0..=peek_counter { - toks.next(); - } + toks.take(peek_counter).for_each(drop); return Ok(Some(buf)); + } else if kind.is_whitespace() { + peek_counter += peek_whitespace(toks); + let next = match toks.peek() { + Some(v) => v, + None => break, + }; + if next.kind == ')' { + buf.push(')'); + toks.take(peek_counter + 1).for_each(drop); + return Ok(Some(buf)); + } else { + break; + } } else { break; } diff --git a/tests/url.rs b/tests/url.rs index 424c4b8..8e32ad3 100644 --- a/tests/url.rs +++ b/tests/url.rs @@ -23,6 +23,26 @@ test!( "a {\n color: url(1+2);\n}\n", "a {\n color: url(1+2);\n}\n" ); +test!( + arithmetic_space_start_of_url, + "a {\n color: url( 1+2);\n}\n", + "a {\n color: url(1+2);\n}\n" +); +test!( + arithmetic_space_end_of_url, + "a {\n color: url(1+2 );\n}\n", + "a {\n color: url(1+2);\n}\n" +); +test!( + arithmetic_space_start_end_of_url, + "a {\n color: url( 1+2 );\n}\n", + "a {\n color: url(1+2);\n}\n" +); +test!( + arithmetic_space_start_end_of_url_and_operands, + "a {\n color: url( 1 + 2 );\n}\n", + "a {\n color: url(3);\n}\n" +); test!( silent_comment, "a {\n color: url(//some/absolute/path);\n}\n"