node_html_parser/dom/
node.rs

1use crate::dom::{comment::CommentNode, element::HTMLElement, node_type::NodeType, text::TextNode};
2
3#[derive(Debug, Clone)]
4pub enum Node {
5	Element(Box<HTMLElement>),
6	Text(TextNode),
7	Comment(CommentNode),
8}
9
10#[derive(Debug, Clone)]
11pub enum NodeOrStr<'a> {
12	Str(CowStr<'a>),
13	Existing(Node),
14}
15
16#[derive(Debug, Clone)]
17pub struct CowStr<'a>(pub &'a str);
18impl<'a> From<&'a str> for CowStr<'a> {
19	fn from(s: &'a str) -> Self {
20		CowStr(s)
21	}
22}
23impl<'a> std::ops::Deref for CowStr<'a> {
24	type Target = str;
25	fn deref(&self) -> &Self::Target {
26		self.0
27	}
28}
29
30impl Node {
31	pub fn node_type(&self) -> NodeType {
32		match self {
33			Node::Element(_) => NodeType::Element,
34			Node::Text(_) => NodeType::Text,
35			Node::Comment(_) => NodeType::Comment,
36		}
37	}
38	pub fn as_element(&self) -> Option<&HTMLElement> {
39		if let Node::Element(e) = self {
40			Some(e)
41		} else {
42			None
43		}
44	}
45	pub fn as_element_mut(&mut self) -> Option<&mut HTMLElement> {
46		if let Node::Element(e) = self {
47			Some(e)
48		} else {
49			None
50		}
51	}
52	pub fn raw_text(&self) -> String {
53		match self {
54			Node::Element(e) => e.raw_text(),
55			Node::Text(t) => t.raw.clone(),
56			Node::Comment(c) => c.text.clone(),
57		}
58	}
59	pub fn text(&self) -> String {
60		match self {
61			Node::Element(e) => e.text(),
62			Node::Text(t) => html_escape::decode_html_entities(&t.raw).to_string(),
63			Node::Comment(c) => c.text.clone(),
64		}
65	}
66	pub fn to_html(&self) -> String {
67		match self {
68			Node::Element(e) => e.outer_html(),
69			Node::Text(t) => t.raw.clone(),
70			Node::Comment(c) => format!("<!--{}-->", c.text),
71		}
72	}
73}