simple_html_parser/
ast.rs1#[derive(Debug, Clone, PartialEq)]
2pub struct DOCTYPE {}
3
4impl DOCTYPE {
5 pub fn new() -> Self {
6 Self {}
7 }
8}
9
10#[derive(Debug, Clone, PartialEq)]
11pub enum AST {
12 Document(Option<DOCTYPE>, Box<Option<AST>>),
13 Tag(String, Vec<(String, String)>, Vec<AST>),
14 String(String),
15}
16
17impl Default for AST {
18 fn default() -> Self {
19 Self::String(String::new())
20 }
21}
22
23impl AST {
24 pub fn get_element_by_id<T: ToString + Clone>(&self, id: T) -> Option<Self> {
25 println!("id: {}; ast: {:?}", id.to_string(), self);
26 match self {
27 Self::Document(_, thing) => {
28 let thing = &**thing;
29 return thing.as_ref()?.get_element_by_id(id);
30 },
31 Self::Tag(_, attrs, children) => {
32 if attrs.iter().any(|(k, v)| k == "id" && v == &id.to_string()) {
33 return Some(self.clone());
34 }
35 'el: for ele in children {
36 if let Self::Tag(_, _, _) = ele {
37 match ele.get_element_by_id(id.clone()) {
38 None => {
39 continue 'el;
40 },
41 ele => {return ele}
42 }
43 } else {
44 continue;
45 }
46 }
47 return None
48 },
49 Self::String(_) => None
50 }
51 }
52 pub fn inner_text(&self) -> String {
53 match self {
54 Self::Document(_, thing) => {
55 let thing = &**thing;
56 if let Some(thing) = thing {
57 return thing.inner_text();
58 }
59 return "".to_string();
60 },
61 Self::Tag(_, _, children) => {
62 let mut result = String::new();
63
64 for ele in children {
65 result += &ele.inner_text();
66 }
67 return result;
68 }
69 Self::String(text) => text.to_string()
70 }
71 }
72}