use crate::dom::tag::Tag;
use crate::dom::Dom;
use crate::dom::DomType;
pub fn satisfy_sufficient_condition(p: &Tag, q: &Tag) -> bool {
let mut satisfied = false;
if q.get_name() == p.get_name() {
satisfied = true;
}
if satisfied {
if let Some(p_attr) = p.get_attr() {
match q.get_attr() {
Some(q_attr) => {
for (p_key, p_value) in p_attr.iter() {
match q_attr.get(p_key) {
Some(q_value) => {
if p_value != "" && p_value != q_value {
satisfied = false;
break;
}
}
None => {
satisfied = false;
break;
}
}
}
}
None => satisfied = false,
}
}
}
satisfied
}
pub fn search_tag(dom: &Dom, needle: &Tag) -> Option<Vec<Tag>> {
let mut res: Vec<Tag> = Vec::new();
search_tag_exe(&mut res, dom, needle);
if res.is_empty() {
return None;
}
Some(res)
}
fn search_tag_exe(res: &mut Vec<Tag>, dom: &Dom, needle: &Tag) {
if let Some(tag) = dom.get_tag() {
if satisfy_sufficient_condition(needle, tag) {
res.push(tag.clone());
}
if let Some(children) = dom.get_children() {
for child in children {
search_tag_exe(res, child, needle);
}
}
}
}
pub fn search_tag_from_name(dom: &Dom, name: &str) -> Option<Vec<Tag>> {
let mut res: Vec<Tag> = Vec::new();
search_tag_from_name_exe(&mut res, dom, name);
if res.is_empty() {
return None;
}
Some(res)
}
fn search_tag_from_name_exe(res: &mut Vec<Tag>, dom: &Dom, name: &str) {
if let DomType::Tag = dom.dom_type {
let tag = dom.get_tag().unwrap();
if name == tag.get_name() {
res.push(tag.clone());
}
if let Some(children) = dom.get_children() {
for child in children {
search_tag_from_name_exe(res, child, name);
}
}
}
}
pub fn search_text_from_tag_children(dom: &Dom, needle: &Tag) -> Option<Vec<String>> {
let mut res: Vec<String> = Vec::new();
search_text_from_tag_children_exe(&mut res, dom, needle);
if res.is_empty() {
return None;
}
Some(res)
}
fn search_text_from_tag_children_exe(res: &mut Vec<String>, dom: &Dom, needle: &Tag) {
if let Some(tag) = dom.get_tag() {
if satisfy_sufficient_condition(needle, tag) {
if let Some(children) = dom.get_children() {
for child in children {
if let Some(text) = child.get_text() {
res.push(text.get_text().to_string());
}
}
}
}
if let Some(children) = dom.get_children() {
for child in children {
search_text_from_tag_children_exe(res, child, needle);
}
}
}
}