Implemented a few helpers for the HTMLParser.

This commit is contained in:
Relintai 2021-11-20 20:53:17 +01:00
parent da6d18beef
commit ff8790f81d
2 changed files with 131 additions and 28 deletions

View File

@ -12,7 +12,7 @@ bool HTMLParserAttribute::match_data(const Vector<String> &d) {
return false; return false;
} }
bool HTMLParserAttribute::contains_data(const String &d) { bool HTMLParserAttribute::contains_data(const String &d) {
return attribute.find(d) != -1; return data.find(d) != -1;
} }
String HTMLParserAttribute::to_string() { String HTMLParserAttribute::to_string() {
@ -38,6 +38,98 @@ HTMLParserAttribute::HTMLParserAttribute() {
HTMLParserAttribute::~HTMLParserAttribute() { HTMLParserAttribute::~HTMLParserAttribute() {
} }
HTMLParserTag *HTMLParserTag::get_first(const String &t) {
if (tag == t) {
return this;
}
for (int i = 0; i < tags.size(); ++i) {
HTMLParserTag *ht = tags[i]->get_first(t);
if (ht) {
return ht;
}
}
return nullptr;
}
HTMLParserTag *HTMLParserTag::get_first(const String &t, const String &attrib, const String &val) {
if (tag == t) {
if (has_attribute(attrib, val)) {
return this;
}
}
for (int i = 0; i < tags.size(); ++i) {
HTMLParserTag *ht = tags[i]->get_first(t, attrib, val);
if (ht) {
return ht;
}
}
return nullptr;
}
String HTMLParserTag::get_attribute_value(const String &attrib) {
HTMLParserAttribute *a = get_attribute(attrib);
if (a) {
return a->data;
}
return "";
}
HTMLParserAttribute *HTMLParserTag::get_attribute(const String &attrib) {
for (int i = 0; i < attributes.size(); ++i) {
HTMLParserAttribute *a = attributes[i];
if (a->match_attrib(attrib)) {
return a;
}
}
return nullptr;
}
bool HTMLParserTag::has_attribute(const String &attrib) {
for (int i = 0; i < attributes.size(); ++i) {
HTMLParserAttribute *a = attributes[i];
if (a->match_attrib(attrib)) {
return true;
}
}
return false;
}
HTMLParserAttribute *HTMLParserTag::get_attribute(const String &attrib, const String &contains_val) {
for (int i = 0; i < attributes.size(); ++i) {
HTMLParserAttribute *a = attributes[i];
if (a->match_attrib(attrib) && a->contains_data(contains_val)) {
return a;
}
}
return nullptr;
}
bool HTMLParserTag::has_attribute(const String &attrib, const String &contains_val) {
for (int i = 0; i < attributes.size(); ++i) {
HTMLParserAttribute *a = attributes[i];
if (a->match_attrib(attrib) && a->contains_data(contains_val)) {
return true;
}
}
return false;
}
void HTMLParserTag::process() { void HTMLParserTag::process() {
if (type != HTMLParserTag::HTML_PARSER_TAG_TYPE_NONE) { if (type != HTMLParserTag::HTML_PARSER_TAG_TYPE_NONE) {
return; return;

View File

@ -42,6 +42,17 @@ public:
Vector<HTMLParserTag*> tags; Vector<HTMLParserTag*> tags;
Vector<HTMLParserAttribute*> attributes; Vector<HTMLParserAttribute*> attributes;
HTMLParserTag *get_first(const String &t);
HTMLParserTag *get_first(const String &t, const String &attrib, const String &val);
String get_attribute_value(const String &attrib);
HTMLParserAttribute *get_attribute(const String &attrib);
bool has_attribute(const String &attrib);
HTMLParserAttribute *get_attribute(const String &attrib, const String &contains_val);
bool has_attribute(const String &attrib, const String &contains_val);
void process(); void process();
void parse_args(const String &args); void parse_args(const String &args);