#[derive(Debug)]
pub struct FindClose<'a> {
pub stack: usize,
pub tag: &'a str,
}
impl<'a> FindClose<'a> {
pub fn new(tag: &'a str) -> Self {
Self { stack: 0, tag }
}
pub fn find(&mut self, htm: impl AsRef<str>) -> Option<usize> {
let htm = htm.as_ref();
let tag = self.tag;
let htm = htm.to_lowercase();
let mut iter = htm.char_indices();
while let Some((_, c)) = iter.next() {
if c == '<' {
while let Some((_, c)) = iter.next() {
if c.is_whitespace() {
continue;
}
if c == '/' {
let mut t = String::new();
for (pos, c) in iter.by_ref() {
if c == '>' {
if t.trim() == tag {
if self.stack == 0 {
return Some(pos + 1);
}
self.stack -= 1;
}
break;
}
t.push(c);
}
} else {
let mut t = String::from(c);
for (_, c) in iter.by_ref() {
if c == '>' {
if t.trim() == tag {
self.stack += 1;
}
break;
}
t.push(c);
}
}
break;
}
}
}
None
}
}