use std::cell::Ref;
use std::fmt;
use tendril::StrTendril;
use web_atoms::{LocalName, Namespace, Prefix};
pub use self::tree_builder::{create_element, AppendNode, AppendText, ElementFlags, NodeOrText};
pub use self::tree_builder::{ElemName, Tracer, TreeSink};
pub use self::tree_builder::{LimitedQuirks, NoQuirks, Quirks, QuirksMode};
#[derive(Copy, Clone, Eq, Hash, PartialEq)]
pub struct ExpandedName<'a> {
pub ns: &'a Namespace,
pub local: &'a LocalName,
}
impl ElemName for ExpandedName<'_> {
#[inline(always)]
fn ns(&self) -> &Namespace {
self.ns
}
#[inline(always)]
fn local_name(&self) -> &LocalName {
self.local
}
}
impl<'a> ElemName for Ref<'a, ExpandedName<'a>> {
#[inline(always)]
fn ns(&self) -> &Namespace {
self.ns
}
#[inline(always)]
fn local_name(&self) -> &LocalName {
self.local
}
}
impl fmt::Debug for ExpandedName<'_> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if self.ns.is_empty() {
write!(f, "{}", self.local)
} else {
write!(f, "{{{}}}:{}", self.ns, self.local)
}
}
}
#[must_use]
#[derive(Debug, PartialEq)]
pub enum TokenizerResult<Handle> {
Done,
Script(Handle),
EncodingIndicator(StrTendril),
}
#[macro_export]
macro_rules! expanded_name {
("", $local: tt) => {
$crate::interface::ExpandedName {
ns: &ns!(),
local: &local_name!($local),
}
};
($ns: ident $local: tt) => {
$crate::interface::ExpandedName {
ns: &ns!($ns),
local: &local_name!($local),
}
};
}
pub mod tree_builder;
#[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Clone)]
pub struct QualName {
pub prefix: Option<Prefix>,
pub ns: Namespace,
pub local: LocalName,
}
impl ElemName for Ref<'_, QualName> {
#[inline(always)]
fn ns(&self) -> &Namespace {
&self.ns
}
#[inline(always)]
fn local_name(&self) -> &LocalName {
&self.local
}
}
impl ElemName for &QualName {
#[inline(always)]
fn ns(&self) -> &Namespace {
&self.ns
}
#[inline(always)]
fn local_name(&self) -> &LocalName {
&self.local
}
}
impl QualName {
#[inline]
pub fn new(prefix: Option<Prefix>, ns: Namespace, local: LocalName) -> QualName {
QualName { prefix, ns, local }
}
#[inline]
pub fn expanded(&self) -> ExpandedName<'_> {
ExpandedName {
ns: &self.ns,
local: &self.local,
}
}
}
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Debug)]
pub struct Attribute {
pub name: QualName,
pub value: StrTendril,
}
#[cfg(test)]
mod tests {
use web_atoms::{ns, Namespace};
#[test]
fn ns_macro() {
assert_eq!(ns!(), Namespace::from(""));
assert_eq!(ns!(html), Namespace::from("http://www.w3.org/1999/xhtml"));
assert_eq!(
ns!(xml),
Namespace::from("http://www.w3.org/XML/1998/namespace")
);
assert_eq!(ns!(xmlns), Namespace::from("http://www.w3.org/2000/xmlns/"));
assert_eq!(ns!(xlink), Namespace::from("http://www.w3.org/1999/xlink"));
assert_eq!(ns!(svg), Namespace::from("http://www.w3.org/2000/svg"));
assert_eq!(
ns!(mathml),
Namespace::from("http://www.w3.org/1998/Math/MathML")
);
}
}