diff --git a/src/parser/base.rs b/src/parser/base.rs index 7b8c498..7b9512e 100644 --- a/src/parser/base.rs +++ b/src/parser/base.rs @@ -217,17 +217,23 @@ impl<'a> Parser<'a> { fn read_end(&mut self) { self.stream.advance(); + self.skip_whitespaces(); - let closing_tag_name = self.read_to(b'>'); - - self.stream.expect_and_skip_cond(b'>'); + if let Some(closing_tag_name) = self.read_ident() { + self.skip_whitespaces(); + self.stream.expect_and_skip_cond(b'>'); - let closing_tag_matches_parent = self.stack.last() - .and_then(|last_handle| last_handle.get(self)) - .and_then(|last_item| last_item.as_tag()) - .map_or(false, |last_tag| last_tag.name() == closing_tag_name); + let closing_tag_matches_parent = self + .stack + .last() + .and_then(|last_handle| last_handle.get(self)) + .and_then(|last_item| last_item.as_tag()) + .map_or(false, |last_tag| last_tag.name() == closing_tag_name); - if !closing_tag_matches_parent { + if !closing_tag_matches_parent { + return; + } + } else { return; } diff --git a/src/tests.rs b/src/tests.rs index 046861a..ecf2fe5 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -1,4 +1,4 @@ -use crate::{parse, parse_owned, Bytes}; +use crate::{parse, parse_owned, Bytes, VDom}; use crate::{parser::*, HTMLTag, Node}; fn force_as_tag<'a, 'b>(actual: &'a Node<'b>) -> &'a HTMLTag<'b> { @@ -778,3 +778,34 @@ fn tag_raw_abrupt_stop() { let from_raw = first_tag.raw().try_as_utf8_str().unwrap(); assert_eq!(from_raw, "
abcd
div 1<\ndiv\n>div 2\ndiv\n>