use alloc::vec::Vec;
use core::ops::Range;
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
pub struct NodeId(pub(crate) u32);
impl NodeId {
#[inline]
pub fn index(self) -> usize {
self.0 as usize
}
}
#[derive(Clone, Copy)]
pub(crate) struct Span {
pub(crate) start: u32,
pub(crate) len: u32,
}
impl Span {
pub(crate) const EMPTY: Span = Span { start: 0, len: 0 };
#[inline]
pub(crate) fn range(self) -> Range<usize> {
let start = self.start as usize;
start..start + self.len as usize
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum NodeKind<'a> {
Element {
tag: &'a str,
},
Text(&'a str),
Comment(&'a str),
Doctype(&'a str),
}
#[derive(Clone)]
pub(crate) enum RawKind {
Element {
name: Span,
attrs: Vec<(Span, Span)>,
},
Text(Span),
Comment(Span),
Doctype(Span),
}
#[derive(Clone)]
pub(crate) struct Node {
pub(crate) parent: Option<NodeId>,
pub(crate) first_child: Option<NodeId>,
pub(crate) last_child: Option<NodeId>,
pub(crate) next_sibling: Option<NodeId>,
pub(crate) prev_sibling: Option<NodeId>,
pub(crate) raw: RawKind,
}
impl Node {
pub(crate) fn new(raw: RawKind) -> Self {
Node {
parent: None,
first_child: None,
last_child: None,
next_sibling: None,
prev_sibling: None,
raw,
}
}
}