Improve comment syntax

This commit is contained in:
Michael Pfaff 2024-03-11 22:42:08 -04:00
parent 878a026851
commit 2db5b83461
3 changed files with 15 additions and 9 deletions

View File

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<body> <body>
<%# This is a comment %> <%# This is a comment #%>
<% for (i, msg) in messages.iter().enumerate() { %> <% for (i, msg) in messages.iter().enumerate() { %>
<% if i == 0 { %> <% if i == 0 { %>
<h1>Hello, world!</h1> <h1>Hello, world!</h1>

View File

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<body> <body>
<%# This is a comment %> <%# This is a comment #%>
<% for (i, msg) in messages.iter().enumerate() { %> <% for (i, msg) in messages.iter().enumerate() { %>
<% if i == 0 { %> <% if i == 0 { %>
<h1>Hello, world!</h1> <h1>Hello, world!</h1>

View File

@ -175,8 +175,14 @@ impl<'a> ParseStream<'a> {
} }
if token_kind == TokenKind::Comment { if token_kind == TokenKind::Comment {
let block_delim_end = self.block_delimiter.1.as_bytes();
let pos = self.source[start..] let pos = self.source[start..]
.find(&*self.block_delimiter.1) .as_bytes()
.windows(1 + block_delim_end.len())
.enumerate()
.position(|(_, window)| {
window[0] == b'#' && &window[1..] == block_delim_end
})
.ok_or_else(|| self.error("Unterminated comment block"))?; .ok_or_else(|| self.error("Unterminated comment block"))?;
self.take_n(start); self.take_n(start);
@ -186,7 +192,7 @@ impl<'a> ParseStream<'a> {
kind: token_kind, kind: token_kind,
}; };
self.take_n(pos + self.block_delimiter.1.len()); self.take_n(pos + 1 + self.block_delimiter.1.len());
return Ok(token); return Ok(token);
} }
@ -431,7 +437,7 @@ mod tests {
#[test] #[test]
fn non_ascii_delimiter() { fn non_ascii_delimiter() {
let src = r##"foo <🍣# This is a comment 🍣> bar <🍣= r"🍣>" 🍣> baz <🍣🍣"##; let src = r##"foo <🍣# This is a comment #🍣> bar <🍣= r"🍣>" 🍣> baz <🍣🍣"##;
let parser = Parser::new().delimiter('🍣'); let parser = Parser::new().delimiter('🍣');
let tokens = parser.parse(src).into_vec().unwrap(); let tokens = parser.parse(src).into_vec().unwrap();
assert_eq!( assert_eq!(
@ -449,22 +455,22 @@ mod tests {
}, },
Token { Token {
content: " bar ", content: " bar ",
offset: 34, offset: 35,
kind: TokenKind::Text kind: TokenKind::Text
}, },
Token { Token {
content: "r\"🍣>\"", content: "r\"🍣>\"",
offset: 46, offset: 47,
kind: TokenKind::BufferedCode { escape: true } kind: TokenKind::BufferedCode { escape: true }
}, },
Token { Token {
content: " baz ", content: " baz ",
offset: 60, offset: 61,
kind: TokenKind::Text kind: TokenKind::Text
}, },
Token { Token {
content: "<🍣", content: "<🍣",
offset: 65, offset: 66,
kind: TokenKind::Text kind: TokenKind::Text
}, },
] ]