Skip to content

Commit 5a2d392

Browse files
committed
Store bad string and url values.
1 parent c4c8f78 commit 5a2d392

File tree

3 files changed

+22
-14
lines changed

3 files changed

+22
-14
lines changed

src/serializer.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,8 @@ impl<'a> ToCss for Token<'a> {
129129
Token::SquareBracketBlock => dest.write_str("[")?,
130130
Token::CurlyBracketBlock => dest.write_str("{")?,
131131

132-
Token::BadUrl => dest.write_str("url(<bad url>)")?,
133-
Token::BadString => dest.write_str("\"<bad string>\n")?,
132+
Token::BadUrl(_) => dest.write_str("url(<bad url>)")?,
133+
Token::BadString(_) => dest.write_str("\"<bad string>\n")?,
134134
Token::CloseParenthesis => dest.write_str(")")?,
135135
Token::CloseSquareBracket => dest.write_str("]")?,
136136
Token::CloseCurlyBracket => dest.write_str("}")?,
@@ -376,7 +376,7 @@ impl<'a> Token<'a> {
376376
TokenSerializationType(match *self {
377377
Token::Ident(_) => Ident,
378378
Token::AtKeyword(_) | Token::Hash(_) | Token::IDHash(_) => AtKeywordOrHash,
379-
Token::UnquotedUrl(_) | Token::BadUrl => UrlOrBadUrl,
379+
Token::UnquotedUrl(_) | Token::BadUrl(_) => UrlOrBadUrl,
380380
Token::Delim('#') => DelimHash,
381381
Token::Delim('@') => DelimAt,
382382
Token::Delim('.') | Token::Delim('+') => DelimDotOrPlus,
@@ -400,7 +400,7 @@ impl<'a> Token<'a> {
400400
Token::ParenthesisBlock => OpenParen,
401401
Token::SquareBracketBlock | Token::CurlyBracketBlock |
402402
Token::CloseParenthesis | Token::CloseSquareBracket | Token::CloseCurlyBracket |
403-
Token::QuotedString(_) | Token::BadString |
403+
Token::QuotedString(_) | Token::BadString(_) |
404404
Token::Delim(_) | Token::Colon | Token::Semicolon | Token::Comma | Token::CDO |
405405
Token::IncludeMatch | Token::PrefixMatch | Token::SuffixMatch
406406
=> Other,

src/tests.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -848,8 +848,8 @@ fn one_component_value_to_json(token: Token, input: &mut Parser) -> Json {
848848
v.extend(nested(input));
849849
v
850850
}),
851-
Token::BadUrl => JArray!["error", "bad-url"],
852-
Token::BadString => JArray!["error", "bad-string"],
851+
Token::BadUrl(_) => JArray!["error", "bad-url"],
852+
Token::BadString(_) => JArray!["error", "bad-string"],
853853
Token::CloseParenthesis => JArray!["error", ")"],
854854
Token::CloseSquareBracket => JArray!["error", "]"],
855855
Token::CloseCurlyBracket => JArray!["error", "}"],

src/tokenizer.rs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -157,12 +157,12 @@ pub enum Token<'a> {
157157
/// A `<bad-url-token>`
158158
///
159159
/// This token always indicates a parse error.
160-
BadUrl,
160+
BadUrl(CompactCowStr<'a>),
161161

162162
/// A `<bad-string-token>`
163163
///
164164
/// This token always indicates a parse error.
165-
BadString,
165+
BadString(CompactCowStr<'a>),
166166

167167
/// A `<)-token>`
168168
///
@@ -194,7 +194,7 @@ impl<'a> Token<'a> {
194194
pub fn is_parse_error(&self) -> bool {
195195
matches!(
196196
*self,
197-
BadUrl | BadString | CloseParenthesis | CloseSquareBracket | CloseCurlyBracket
197+
BadUrl(_) | BadString(_) | CloseParenthesis | CloseSquareBracket | CloseCurlyBracket
198198
)
199199
}
200200
}
@@ -567,14 +567,14 @@ fn next_token<'a>(tokenizer: &mut Tokenizer<'a>) -> Result<Token<'a>, ()> {
567567
fn consume_string<'a>(tokenizer: &mut Tokenizer<'a>, single_quote: bool) -> Token<'a> {
568568
match consume_quoted_string(tokenizer, single_quote) {
569569
Ok(value) => QuotedString(value),
570-
Err(()) => BadString
570+
Err(value) => BadString(value)
571571
}
572572
}
573573

574574

575575
/// Return `Err(())` on syntax error (ie. unescaped newline)
576576
fn consume_quoted_string<'a>(tokenizer: &mut Tokenizer<'a>, single_quote: bool)
577-
-> Result<CompactCowStr<'a>, ()> {
577+
-> Result<CompactCowStr<'a>, CompactCowStr<'a>> {
578578
tokenizer.advance(1); // Skip the initial quote
579579
// start_pos is at code point boundary, after " or '
580580
let start_pos = tokenizer.position();
@@ -607,15 +607,22 @@ fn consume_quoted_string<'a>(tokenizer: &mut Tokenizer<'a>, single_quote: bool)
607607
string_bytes = tokenizer.slice_from(start_pos).as_bytes().to_owned();
608608
break
609609
}
610-
b'\n' | b'\r' | b'\x0C' => { return Err(()) },
610+
b'\n' | b'\r' | b'\x0C' => {
611+
return Err(tokenizer.slice_from(start_pos).into())
612+
},
611613
_ => {}
612614
}
613615
tokenizer.consume_byte();
614616
}
615617

616618
while !tokenizer.is_eof() {
617619
if matches!(tokenizer.next_byte_unchecked(), b'\n' | b'\r' | b'\x0C') {
618-
return Err(());
620+
return Err(
621+
// string_bytes is well-formed UTF-8, see other comments.
622+
unsafe {
623+
from_utf8_release_unchecked(string_bytes)
624+
}.into()
625+
);
619626
}
620627
let b = tokenizer.consume_byte();
621628
match_byte! { b,
@@ -1024,6 +1031,7 @@ fn consume_unquoted_url<'a>(tokenizer: &mut Tokenizer<'a>) -> Result<Token<'a>,
10241031
}
10251032

10261033
fn consume_bad_url<'a>(tokenizer: &mut Tokenizer<'a>) -> Token<'a> {
1034+
let start_pos = tokenizer.position();
10271035
// Consume up to the closing )
10281036
while !tokenizer.is_eof() {
10291037
match_byte! { tokenizer.consume_byte(),
@@ -1034,7 +1042,7 @@ fn consume_unquoted_url<'a>(tokenizer: &mut Tokenizer<'a>) -> Result<Token<'a>,
10341042
_ => {},
10351043
}
10361044
}
1037-
BadUrl
1045+
BadUrl(tokenizer.slice_from(start_pos).into())
10381046
}
10391047
}
10401048

0 commit comments

Comments
 (0)