node_html_parser/dom/
node.rs1use 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}