use std::fmt::Debug;
use super::node_data::{Element, NodeData};
use crate::NodeId;
#[derive(Debug, Clone)]
pub struct TreeNode {
pub id: NodeId,
pub parent: Option<NodeId>,
pub prev_sibling: Option<NodeId>,
pub next_sibling: Option<NodeId>,
pub first_child: Option<NodeId>,
pub last_child: Option<NodeId>,
pub data: NodeData,
}
impl TreeNode {
pub(crate) fn new(id: NodeId, data: NodeData) -> Self {
TreeNode {
id,
parent: None,
prev_sibling: None,
next_sibling: None,
first_child: None,
last_child: None,
data,
}
}
}
impl TreeNode {
pub(crate) fn adjust(&mut self, offset: usize) {
self.id = NodeId::new(self.id.value + offset);
let adjust_fn = |id: NodeId| NodeId::new(id.value + offset);
self.parent = self.parent.map(adjust_fn);
self.prev_sibling = self.prev_sibling.map(adjust_fn);
self.next_sibling = self.next_sibling.map(adjust_fn);
self.first_child = self.first_child.map(adjust_fn);
self.last_child = self.last_child.map(adjust_fn);
if let NodeData::Element(ref mut el) = self.data {
el.template_contents = el.template_contents.map(adjust_fn);
}
}
}
impl TreeNode {
pub fn is_document(&self) -> bool {
matches!(self.data, NodeData::Document)
}
pub fn is_element(&self) -> bool {
matches!(self.data, NodeData::Element(_))
}
pub fn is_text(&self) -> bool {
matches!(self.data, NodeData::Text { .. })
}
pub fn is_comment(&self) -> bool {
matches!(self.data, NodeData::Comment { .. })
}
pub fn is_fragment(&self) -> bool {
matches!(self.data, NodeData::Fragment)
}
pub fn is_doctype(&self) -> bool {
matches!(self.data, NodeData::Doctype { .. })
}
pub fn may_have_children(&self) -> bool {
matches!(
self.data,
NodeData::Document | NodeData::Fragment | NodeData::Element(_)
)
}
pub fn as_element(&self) -> Option<&Element> {
match self.data {
NodeData::Element(ref e) => Some(e),
_ => None,
}
}
pub fn as_element_mut(&mut self) -> Option<&mut Element> {
match self.data {
NodeData::Element(ref mut e) => Some(e),
_ => None,
}
}
pub fn set_attr(&mut self, name: &str, val: &str) {
if let Some(element) = self.as_element_mut() {
element.set_attr(name, val);
}
}
pub fn remove_attr(&mut self, name: &str) {
if let Some(element) = self.as_element_mut() {
element.remove_attr(name);
}
}
pub fn remove_attrs(&mut self, names: &[&str]) {
if let Some(element) = self.as_element_mut() {
element.remove_attrs(names);
}
}
pub fn retain_attrs(&mut self, names: &[&str]) {
if let Some(element) = self.as_element_mut() {
element.retain_attrs(names);
}
}
pub fn remove_all_attrs(&mut self) {
if let Some(element) = self.as_element_mut() {
element.remove_all_attrs();
}
}
pub fn rename(&mut self, name: &str) {
if let Some(element) = self.as_element_mut() {
element.rename(name);
}
}
pub fn add_class(&mut self, class: &str) {
if let Some(element) = self.as_element_mut() {
element.add_class(class);
}
}
pub fn remove_class(&mut self, class: &str) {
if let Some(element) = self.as_element_mut() {
element.remove_class(class);
}
}
pub fn is_link(&self) -> bool {
if let Some(element) = self.as_element() {
element.is_link()
} else {
false
}
}
}