use std::borrow::Cow;
use ego_tree::Tree;
use ego_tree::iter::Nodes;
use html5ever::driver;
use html5ever::tree_builder::QuirksMode;
use tendril::TendrilSink;
use {Node, ElementRef, Selector};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Html {
pub errors: Vec<Cow<'static, str>>,
pub quirks_mode: QuirksMode,
pub tree: Tree<Node>,
}
impl Html {
pub fn new_document() -> Self {
Html {
errors: Vec::new(),
quirks_mode: QuirksMode::NoQuirks,
tree: Tree::new(Node::Document),
}
}
pub fn new_fragment() -> Self {
Html {
errors: Vec::new(),
quirks_mode: QuirksMode::NoQuirks,
tree: Tree::new(Node::Fragment),
}
}
pub fn parse_document(document: &str) -> Self {
let parser = driver::parse_document(Self::new_document(), Default::default());
parser.one(document)
}
pub fn parse_fragment(fragment: &str) -> Self {
let parser = driver::parse_fragment(
Self::new_fragment(),
Default::default(),
qualname!(html, "body"),
Vec::new()
);
parser.one(fragment)
}
pub fn select<'a, 'b>(&'a self, selector: &'b Selector) -> Select<'a, 'b> {
Select {
inner: self.tree.nodes(),
selector: selector,
}
}
}
#[derive(Debug)]
pub struct Select<'a, 'b> {
inner: Nodes<'a, Node>,
selector: &'b Selector,
}
impl<'a, 'b> Iterator for Select<'a, 'b> {
type Item = ElementRef<'a>;
fn next(&mut self) -> Option<ElementRef<'a>> {
for node in self.inner.by_ref() {
if let Some(element) = ElementRef::wrap(node) {
if element.parent().is_some() && self.selector.matches(&element) {
return Some(element);
}
}
}
None
}
}
mod tree_sink;