use std::fmt;
use tendril::StrTendril;
use super::{LocalName, Prefix, Namespace};
pub use self::tree_builder::{NodeOrText, AppendNode, AppendText, create_element, ElementFlags};
pub use self::tree_builder::{QuirksMode, Quirks, LimitedQuirks, NoQuirks};
pub use self::tree_builder::{TreeSink, Tracer, NextParserState};
#[derive(Copy, Clone, Eq, Hash)]
pub struct ExpandedName<'a> {
pub ns: &'a Namespace,
pub local: &'a LocalName,
}
impl<'a, 'b> PartialEq<ExpandedName<'a>> for ExpandedName<'b> {
fn eq(&self, other: &ExpandedName<'a>) -> bool {
self.ns == other.ns && self.local == other.local
}
}
impl<'a> fmt::Debug for ExpandedName<'a> {
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)
}
}
}
#[macro_export]
macro_rules! expanded_name {
("", $local: tt) => {
ExpandedName {
ns: &ns!(),
local: &local_name!($local),
}
};
($ns: ident $local: tt) => {
ExpandedName {
ns: &ns!($ns),
local: &local_name!($local),
}
}
}
pub mod tree_builder;
#[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Clone)]
#[cfg_attr(feature = "heap_size", derive(HeapSizeOf))]
pub struct QualName {
pub prefix: Option<Prefix>,
pub ns: Namespace,
pub local: LocalName,
}
impl QualName {
#[inline]
pub fn new(prefix: Option<Prefix>, ns: Namespace, local: LocalName) -> QualName {
QualName {
prefix: prefix,
ns: ns,
local: 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 super::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"));
}
}