#[cfg(feature = "fashion")]
mod fashion;
mod model;
mod navigate;
mod parse;
pub use self::model::*;
pub use self::navigate::*;
use self::parse::*;
use std::borrow::Cow;
use std::marker::PhantomData;
use std::{
collections::HashMap,
sync::{atomic::AtomicUsize, Arc},
};
#[derive(Debug, Clone)]
pub struct Hatmel {
nodes: Vec<Node>,
children: HashMap<Handle, Vec<Handle>>,
parents: HashMap<Handle, Handle>,
mode: QuirksMode,
revision: usize,
}
impl Default for Hatmel {
fn default() -> Self {
let fragment = Node::new_fragment();
let mut me = Self {
nodes: Default::default(),
children: Default::default(),
parents: Default::default(),
mode: QuirksMode::NoQuirks,
revision: 0,
};
me.register(fragment);
me
}
}
impl Hatmel {
pub fn revision(&self) -> usize {
self.revision
}
pub fn nodes(&self) -> HandleIter {
HandleIter::new(0..self.nodes.len())
}
fn register(&mut self, node: Node) -> Handle {
let handle = self.nodes.len();
self.nodes.push(node);
handle
}
}
#[derive(Default, Debug, Clone)]
struct Node {
pub content: Content,
}
impl Node {
fn new_element(
name: LocalName,
namespace: Namespace,
prefix: Option<Prefix>,
attrs: Vec<Attribute>,
kind: ElementKind,
) -> Node {
let content = Content::Element(Element {
name,
namespace,
prefix,
attrs,
kind,
});
Node { content }
}
fn new_comment(text: impl Into<String>) -> Node {
Node {
content: Content::Comment { text: text.into() },
}
}
fn new_processing_instruction(target: impl Into<String>, data: impl Into<String>) -> Node {
Node {
content: Content::ProcessingInstruction {
target: target.into(),
data: data.into(),
},
}
}
fn new_text(text: impl Into<String>) -> Node {
Node {
content: Content::Text { text: text.into() },
}
}
fn new_fragment() -> Node {
Node {
content: Content::Document,
}
}
fn new_doctype(
name: impl Into<String>,
public_id: impl Into<String>,
system_id: impl Into<String>,
) -> Node {
Node {
content: Content::DocType {
name: name.into(),
public_id: public_id.into(),
system_id: system_id.into(),
},
}
}
}