diff options
| author | Laurenz <laurmaedje@gmail.com> | 2021-07-08 19:37:38 +0200 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2021-07-08 19:37:38 +0200 |
| commit | f85e5aac64784deac75950a1307f2ca802ad6765 (patch) | |
| tree | 95d1082a4efd3451cfe669f3a687d0aa8b0a4d0d /src | |
| parent | 5a500fb8a7c0ba4b8a59e2622c8cbafdc4ce1fe9 (diff) | |
URL special case for line comments
Diffstat (limited to 'src')
| -rw-r--r-- | src/parse/scanner.rs | 5 | ||||
| -rw-r--r-- | src/parse/tokens.rs | 13 |
2 files changed, 8 insertions, 10 deletions
diff --git a/src/parse/scanner.rs b/src/parse/scanner.rs index 1a0e3045..fad44e89 100644 --- a/src/parse/scanner.rs +++ b/src/parse/scanner.rs @@ -96,11 +96,6 @@ impl<'s> Scanner<'s> { self.peek().map(f).unwrap_or(false) } - /// Checks whether the remaining source starts with the given string. - pub fn starts_with(&self, string: &str) -> bool { - self.rest().starts_with(string) - } - /// The previous index in the source string. pub fn last_index(&self) -> usize { self.eaten() diff --git a/src/parse/tokens.rs b/src/parse/tokens.rs index c9b7dc21..f2196740 100644 --- a/src/parse/tokens.rs +++ b/src/parse/tokens.rs @@ -72,9 +72,9 @@ impl<'s> Iterator for Tokens<'s> { // Whitespace. c if c.is_whitespace() => self.whitespace(c), - // Comments. - '/' if self.s.eat_if('/') => self.line_comment(), + // Comments with special case for URLs. '/' if self.s.eat_if('*') => self.block_comment(), + '/' if !self.maybe_in_url() && self.s.eat_if('/') => self.line_comment(), '*' if self.s.eat_if('/') => Token::Invalid(self.s.eaten_from(start)), // Other things. @@ -216,7 +216,7 @@ impl<'s> Tokens<'s> { self.s.eat_assert(c); Token::Text(&self.s.eaten_from(start)) } - 'u' if self.s.starts_with("u{") => { + 'u' if self.s.rest().starts_with("u{") => { self.s.eat_assert('u'); self.s.eat_assert('{'); Token::UnicodeEscape(UnicodeEscapeToken { @@ -367,7 +367,7 @@ impl<'s> Tokens<'s> { // Read the fractional part if not already done. // Make sure not to confuse a range for the decimal separator. - if c != '.' && !self.s.starts_with("..") && self.s.eat_if('.') { + if c != '.' && !self.s.rest().starts_with("..") && self.s.eat_if('.') { self.s.eat_while(|c| c.is_ascii_digit()); } @@ -464,6 +464,10 @@ impl<'s> Tokens<'s> { Token::BlockComment(self.s.get(start .. end)) } + + fn maybe_in_url(&self) -> bool { + self.mode == TokenMode::Markup && self.s.eaten().ends_with(":/") + } } impl Debug for Tokens<'_> { @@ -688,7 +692,6 @@ mod tests { t!(Markup[" /"]: r"\a" => Text(r"\"), Text("a")); t!(Markup[" /"]: r"\u" => Text(r"\"), Text("u")); t!(Markup[" /"]: r"\1" => Text(r"\"), Text("1")); - t!(Markup[" /"]: r"\:" => Text(r"\"), Text(":")); t!(Markup[" /"]: r#"\""# => Text(r"\"), Text("\"")); // Test basic unicode escapes. |
